我成功创建了发布商,但未能使用以下内容创建订阅者:
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]启用而关闭JVM java.lang.NoSuchMethodError: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 $ receive $ 1.applyOrElse(ConcurrentSocketActor.scala:46) at akka.actor.ActorCell.receiveMessage(ActorCell.scala:425) at akka.actor.ActorCell.invoke(ActorCell.scala:386) at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:230) at akka.dispatch.Mailbox.run(Mailbox.scala:212) 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615) 在java.lang.Thread.run(Thread.java:722)
这是什么意思?
答案 0 :(得分:2)
我在尝试使用akka-zeromq时遇到了同样的错误,并就此主题进行了一些调查。所以情况如下:错误消息表明它没有在类ZMQ.Poller中找到方法long poll(long timeout)
(请参阅this回答错误消息解释)。这是因为以下原因
long poll(long timeout)
而在jzmq中你有int poll(long timeout)
要在本地解决您的问题,您必须使用zmq.jar重建Akka,或者使用快速而又脏的解决方法:在jzmq ZMQ.Poller类中更改方法poll(long timeout)
的返回类型并重建java绑定。有关更多详细信息和绑定兼容性讨论,请查看here
但是,存在全局java / scala绑定兼容性问题,但它超出了您的问题范围。
答案 1 :(得分:0)
您的路径似乎丢失或者zeromq-scala绑定版本错误。
您使用的是哪个版本的akka和zeromq?