2013-04-30 5 views
1

Я успешно создал издатель, но не удался создать абонент с помощью следующего:Акка-ZMQ Ошибка создания абонента (опрос)

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] отключает JVM, так как для ActorSystem [System] включен режим «akka.jvm-exit-on-fatal-error». java.lang.NoSuchMethodError: org.zeromq.ZMQ $ Poller.poll (J) J на 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 $ получать $ 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

кажется, что у вас либо отсутствует, либо неправильная версия привязки zeromq-scala на вашем пути.

Какую версию akka и zeromq вы используете?

+0

Я построил zeromq-3.2.2.tar (http://download.zeromq.org/zeromq-3.2.2.tar.gz) и jzmq-master (https://github.com/zeromq/jzmq). Скопированный сгенерированный zmq.jar в путь к проекту и библиотеки, похоже, находятся на моем локальном сервере: Hakan-MacBook-Pro: lib Hako $ ls | Grep libjzmq libjzmq.0.dylib libjzmq.a libjzmq.dylib libjzmq.la Хакан-MacBook-Pro: Lib Hako $ Ls | grep libzmq libzmq.3.dylib libzmq.a libzmq.dylib libzmq.la – Hako

+0

Я тоже построил этот (после того, как прочитал ваш комментарий): https://github.com/zeromq/libzmq, и проблема все еще существует. – Hako

+0

Итак, теперь я вижу. У вас есть привязки jzmq в вашем пути к классам? Akka полагается на привязки zeromq-scala, доступные здесь https://github.com/valotrading/zeromq-scala-binding, и они не являются заменой друг для друга. –

2

У меня был такой же тип ошибки при попытке работать с akka-zeromq и провел некоторое расследование по этому вопросу. Таким образом, ситуация такова: в сообщении об ошибке указано, что он не нашел способ long poll(long timeout) в классе ZMQ.Poller (см. this ответ для интерпретации сообщения об ошибке). Это происходит по следующим причинам

  1. Akka построен с привязками zeromq-scala.
  2. ZeroMQ-Скала должна быть совместима с jzmq, но, к сожалению, не в данный момент, потому что в SCALA привязок у вас есть метод long poll(long timeout) в jzmq у вас есть int poll(long timeout)

Чтобы преодолеть проблему локально вы либо должны перестройте Akka с zmq.jar или используйте быстрое и грязное решение: измените тип возвращаемого значения для метода poll(long timeout) в классе jzmq ZMQ.Poller и перестройте привязки java. Для более подробной информации и привязки совместимости обсудитесь here

Однако существует проблема совместимости с привязкой к Java/Scala, но она выходит за рамки вашего вопроса.