Akka持久化自定义java插件

时间:2014-08-26 08:08:02

标签: java akka akka-persistence

我目前正在为Akka SyncWriteJournal API编写自己的插件,以实现与HSQLDB的连接。

问题是我不理解方法doAsyncReplayMessages的要求。它声明它需要返回一个未来,所有消息都应该由replayCallback调用。

让我们说我有一个返回消息列表的查询:List<Message> messages。任何人都可以提供一个最小的例子(有解释),说明如何使用replayCallbackFuture通过使用该列表正确实现该方法吗? replayCallbackFuture如何协同工作以及方法doAsyncReplayMessages应该返回什么内容?

谢谢!

- 编辑 -

在一些评论的帮助下,我掀起了一个不完整的实现,但结合了提出的想法:

public Future<Void> doAsyncReplayMessages(final String persistenceId, long fromSequenceNr, long toSequenceNr, long max,
        final Procedure<PersistentRepr> replayCallback) {
    final ExecutionContext ec = context().system().dispatcher();

    final Future<Void> future = Futures.future(new Callable<Void>() {
        @Override
        public Void call() throws Exception {
            final List<Message> messages = getMessages();
            for (int i = 0; i < feedbackList.size(); i++) {
                replayCallback.apply(
                        new PersistentImpl(messages.get(i), i, persistenceId, false, null, null));
            }
            return null;
        }
    }, ec);

    return future;
}

正如您可能看到它错过了一些我仍然缺失的关键概念。 PersistentImpl需要一个参数Seq<String> confirmnull仍然是null。也许更重要的是,我回复Void,因为将来期望[ERROR] [08/28/2014 12:31:19.582] [akkaSystem-akka.actor.default-dispatcher-7] [akka://akkaSystem/system/journal] null java.lang.NullPointerException at akka.persistence.journal.japi.AsyncRecovery.asyncReadHighestSequenceNr(AsyncRecovery.scala:26) at akka.persistence.journal.SyncWriteJournal$$anonfun$receive$1.applyOrElse(SyncWriteJournal.scala:53) at akka.actor.Actor$class.aroundReceive(Actor.scala:465) at akka.persistence.journal.japi.SyncWriteJournal.aroundReceive(SyncWriteJournal.scala:16) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516) at akka.actor.ActorCell.invoke(ActorCell.scala:487) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238) at akka.dispatch.Mailbox.run(Mailbox.scala:220) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) 作为返回类型,我不确定如何实现。它目前抛出一个NPE:

{{1}}

1 个答案:

答案 0 :(得分:2)

您可以简单地将阻止操作包装在Future中,例如:Future { fetchStuff() }

您可以参考dnvriend/akka-persistence-jdbc: JdbcSyncWriteJournal了解同步日志的完整实现。