【问题标题】:Akka persistence custom java pluginAkka持久化自定义java插件
【发布时间】:2014-10-19 11:47:38
【问题描述】:

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

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

假设我有一个返回消息列表的查询:List<Message> messages。谁能提供一个最小的例子(解释)如何使用replayCallbackFuture通过使用该列表正确实现该方法? replayCallbackFuture 如何协同工作,doAsyncReplayMessages 方法应该返回什么?

谢谢!

-编辑-

在一些 cmets 的帮助下,我提出了一个不完整的实现,但包含了所提出的想法:

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&lt;String&gt; confirm,它仍然是null。也许更重要的是我会返回null,因为未来期望Void 作为返回类型,我不确定如何实现它。它目前抛出一个 NPE:

[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)

【问题讨论】:

  • 嘿成功了?我想找一个自定义的 java akka 持久性插件示例

标签: java akka akka-persistence


【解决方案1】:

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

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

【讨论】:

  • 对不起,我无法阅读 scala(我的实现是用 Java 实现的)。你能详细说明一下吗?
  • 这里是从 Java 中使用 Futures 的文档:doc.akka.io/docs/akka/2.3.5/java/futures.html#Use_Directly 您可以调用 Futures.future(callable, executionContext) ,其中可调用对象将获取 List,对它们中的每一个调用 replyCallback然后完成。该可调用对象的返回类型必须为 Void 以匹配预期的返回类型 Future.
猜你喜欢
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多