事务日志
记录事务日志
tx = graph.buildTransaction().logIdentifier('addedPerson').start()
u = tx.addVertex(label, 'human')
u.property('name', 'proteros')
u.property('age', 36)
tx.commit()
- 添加事务日志,使用addedPerson标识。
- 事务中改变都会被记录到用户日志系统并以id区别。
- 日志保存在存储后端中。
处理日志log processor framework
- 使用日志处理器对特定的事务日志(指定要处理的事务日志的id标识)进行处理
- 为addedPerson事务日志配置日志处理器进行处理
import java.util.concurrent.atomic.*;
import org.janusgraph.core.log.*;
import java.util.concurrent.*;
//打开日志处理器
logProcessor = JanusGraphFactory.openTransactionLog(g);
totalHumansAdded = new AtomicInteger(0);
totalGodsAdded = new AtomicInteger(0);
//指定要处理的事务日志名称
logProcessor.addLogProcessor("addedPerson").
//事务处理器名称
setProcessorIdentifier("addedPersonCounter").
//事务处理器读取日志的位置(通过时间指定)
setStartTime(System.currentTimeMillis(), TimeUnit.MILLISECONDS).
//添加ChangeProcessor处理器1进行处理
addProcessor(new ChangeProcessor() {
@Override
public void process(JanusGraphTransaction tx, TransactionId txId, ChangeState changeState) {
for (v in changeState.getVertices(Change.ADDED)) {
if (v.label().equals("human")) totalHumansAdded.incrementAndGet();
}
}
}).
//添加ChangeProcessor处理器2处理:多个处理器并发执行
addProcessor(new ChangeProcessor() {
@Override
public void process(JanusGraphTransaction tx, TransactionId txId, ChangeState changeState) {
for (v in changeState.getVertices(Change.ADDED)) {
if (v.label().equals("god")) totalGodsAdded.incrementAndGet();
}
}
}).
build();
- addedPersonCounter日志处理器顺序读取addedPerson事务日志记录的日志,但是注册的两个ChangeProcessor处理器会并发执行读取到的每一条日志。
- 日志处理的的标识addedPersonCounter有重要作用:定期维护日志处理器的状态。即其会在最后一个日志记录上打上一个标记,如果日志处理器在执行很长时候挂掉了,当其重新开始并使用相同的名称addedPersonCounter,那么其就会从上次最后标记的日志位置开始读取。
ChangeProcessor接口
public void process(JanusGraphTransaction tx, TransactionId txId, ChangeState changeState) {
for (v in changeState.getVertices(Change.ADDED)) {
if (v.label().equals("god")) totalGodsAdded.incrementAndGet();
}
}
- JanusGraphTransaction代表正常的图事务,可以利用执行正常的操作。
- TransactionId txId:事务id值,通过其和获得产生日志的原事务实例id,和执行原事务的图对象实例JanusGraph instance 。
- 原文:The provided transaction id can be used to investigate the origin of the transaction which is uniquely identified by the combination of the id of the JanusGraph instance that executed the transaction (txId.getInstanceId()) and the instance specific transaction id (txId.getTransactionId()).
Transaction Log Use Cases
Record of Change
Downstream Updates
- 事务日志和日志处理框架提供了一些必要工具,用来将一些改变信息通知到其它系统。
Triggers
- 在原事务中不建议实现触发器(慢呀),而是通过日志处理框架在稍后处理触发器。
Log Configuration