我成功创建了发布者但未能使用以下内容创建订阅者:
public static void main(String [] args)
{
ActorSystem system = ActorSystem.create("System");
ActorRef subscriber = system.actorOf(new Props(Sub.class), "subscriber");
subscriber.tell(new MyActor("CharlieParker", 50, 25), subscriber);
}
public class Sub extends UntypedActor
{
ActorRef subSocket = ZeroMQExtension.get(getContext().system()).newSubSocket(
new Connect("tcp://127.0.0.1:1237"),
new Listener(getSelf()), Subscribe.all());
}
得到此错误:来自线程[System-akka.zeromq.socket-dispatcher-7]的未捕获错误因为'akka.jvm-exit-on-fatal-error'为ActorSystem [System] java.lang.NoSuchMethodError启用而关闭JVM :org.zeromq.ZMQ $ Poller.poll(J)J at akka.zeromq.ConcurrentSocketActor $$ anonfun $ 10.apply(ConcurrentSocketActor.scala:180)at akka.zeromq.ConcurrentSocketActor $$ anonfun $ 10.apply(ConcurrentSocketActor.scala: 179)at akka.zeromq.ConcurrentSocketActor.akka $ zeromq $ ConcurrentSocketActor $$ doPoll(ConcurrentSocketActor.scala:197)at akka.zeromq.ConcurrentSocketActor $$ anonfun $在akka.actor接收$ 1.applyOrElse(ConcurrentSocketActor.scala:46) . 在akka.dispatch.Mailbox.ailMailbox(Mailbox.scala:230)atkka.dispatch.Mailbox.run(邮箱)的akka.actor.ActorCell.invoke(ActorCell.scala:386)中的ActorCell.receiveMessage(ActorCell.scala:425) .scala:212)java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.jav) a:615)在java.lang.Thread.run(Thread.java:722)
这是什么意思?
2 回答
好像你要么丢失了,要么在你的路径上使用了错误版本的zeromq-scala-binding .
您使用的是哪个版本的akka和zeromq?
我在尝试使用akka-zeromq时遇到了同样的错误,并对该主题进行了一些调查 . 所以情况如下:错误消息表明它没有在类ZMQ.Poller中找到方法
long poll(long timeout)
(请参阅this回答错误消息解释) . 这是因为以下原因Akka是使用zeromq-scala绑定构建的 .
zeromq-scala应该与jzmq兼容,但不幸的是它现在不是因为在scala绑定中你有方法
long poll(long timeout)
而在jzmq中你有int poll(long timeout)
要在本地解决您的问题,您必须使用zmq.jar重建Akka,或使用快速而又脏的解决方法:在jzmq ZMQ.Poller类中更改方法
poll(long timeout)
的返回类型并重建java绑定 . 有关更多详细信息和绑定兼容性讨论,请查看here但是,存在全局java / scala绑定兼容性问题,但它超出了您的问题的范围 .