use of com.jd.blockchain.ledger.Event in project jdchain-core by blockchain-jd-com.
the class EventCacheHandle method addEvents.
@Override
public void addEvents(String key, Event... events) {
if (events.length > 0) {
mapLock.lock();
try {
Events eventList = eventsLruMap.get(key);
if (eventList == null) {
eventList = new Events();
eventsLruMap.put(key, eventList);
}
for (Event event : events) {
eventList.put(event.getSequence(), event);
updateMaxHeight(event.getBlockHeight());
}
} finally {
mapLock.unlock();
}
}
}
use of com.jd.blockchain.ledger.Event in project jdchain-core by blockchain-jd-com.
the class EventPublishingAccount method getEvents.
@Override
public Event[] getEvents(String eventName, long fromSequence, int count) {
List<Event> events = new ArrayList<>();
Dataset<String, TypedValue> ds = mklAccount.getDataset();
long maxVersion = mklAccount.getDataset().getVersion(eventName) + 1;
for (int i = 0; i < count && i <= maxVersion; i++) {
TypedValue tv = ds.getValue(eventName, fromSequence + i);
if (null == tv || tv.isNil()) {
break;
}
Event event = BinaryProtocol.decode(tv.bytesValue());
events.add(new EventInfo(event));
}
return events.toArray(new Event[events.size()]);
}
use of com.jd.blockchain.ledger.Event in project jdchain-core by blockchain-jd-com.
the class PullEventListener method getAndUpdateByCacheAndQuery.
private void getAndUpdateByCacheAndQuery(HashDigest ledgerHash, EventCache eventCache, EventPoint eventPoint, List<Event> events, String key, long start, long end) {
List<Event> cachedEvents = new ArrayList<>();
boolean needQuery = false;
for (long l = start; l < end; l++) {
Event event = eventCache.getEvent(key, l);
if (event == null) {
needQuery = true;
break;
}
cachedEvents.add(event);
}
if (needQuery) {
Event[] eventsByQuery = getEventsByQuery(ledgerHash, eventPoint, start, (int) (end - start));
if (!empty(eventsByQuery)) {
eventCache.addEvents(key, eventsByQuery);
events.addAll(Arrays.asList(eventsByQuery));
}
} else {
events.addAll(cachedEvents);
}
}
use of com.jd.blockchain.ledger.Event in project jdchain-core by blockchain-jd-com.
the class EventGroupPublisher method getEvents.
@Override
public Event[] getEvents(String eventName, long fromSequence, int maxCount) {
List<Event> eventsList = new ArrayList<>();
Bytes key = encodeKey(eventName);
long maxVersion = events.getVersion(key);
for (int i = 0; i < maxCount && i <= maxVersion; i++) {
byte[] bs = events.getValue(key, fromSequence + i);
if (null == bs) {
break;
}
Event event = BinaryProtocol.decode(bs);
eventsList.add(new EventInfo(event));
}
return eventsList.toArray(new Event[eventsList.size()]);
}
use of com.jd.blockchain.ledger.Event in project jdchain-core by blockchain-jd-com.
the class EventGroupPublisher method publish.
/**
* 发布事件
*
* @param event
* @return
*/
@Override
public long publish(Event event) {
Bytes key = encodeKey(event.getName());
long newSequence = events.setValue(key, BinaryProtocol.encode(event, Event.class), event.getSequence() - 1);
if (newSequence < 0) {
throw new LedgerException("Event sequence conflict! --[" + key + "]");
}
// 属于新发布的事件名
if (ledgerDataStructure.equals(LedgerDataStructure.KV)) {
if (newSequence == 0) {
long nv = events.setValue(SYSTEMEVENT_SEQUENCE_KEY_PREFIX.concat(Bytes.fromString(String.valueOf(events.getDataCount() + event_index_in_block))), key.toBytes(), -1);
if (nv < 0) {
throw new LedgerException("Event seq already exist! --[id=" + key + "]");
}
event_index_in_block++;
}
}
return newSequence;
}
Aggregations