【问题标题】:Akka-zeromq socket/actor won't receive messagesAkka-zeromq 套接字/actor 不会收到消息
【发布时间】:2012-12-04 16:05:01
【问题描述】:

问题

我正在尝试实现一个简单的actor,它将使用 akka-zeromq 从 zeromq 接收消息。

import akka.actor._
import akka.zeromq._

class PullActor extends Actor {
  def receive = {
    case x => println("M: " + x.toString)
  }
}

object Main extends App {
  val system = ActorSystem("system")

  val pullActor = system.actorOf(Props[PullActor], "pull-actor")

  val pullSocket = ZeroMQExtension(system).newSocket(
    SocketType.Pull, Listener(pullActor), Connect("tcp://127.0.0.1:8008"))

  println("Press ENTER to exit")
  Console.readLine()
  system.shutdown()
}

系统只打印

M: Connecting

其他信息

发送消息是通过一个简单的python完成的

import zmq
ctx = zmq.Context()
p = ctx.socket(zmq.PUSH)
p.bind("tcp://*:8008")
p.send("test")

我注意到的另一件奇怪的事情是,在按下 enter 后程序不会终止。如果我使用 python 脚本向它发送消息,它会。这是完整的输出:

[DEBUG] [12/04/2012 18:01:45.175] [main] [EventStream(akka://system)] logger log1-Logging$DefaultLogger started
[DEBUG] [12/04/2012 18:01:45.178] [main] [EventStream(akka://system)] Default Loggers started
Press ENTER to exit
M: Connecting

[DEBUG] [12/04/2012 18:01:54.176] [system-akka.actor.default-dispatcher-2] [EventStream] shutting down: StandardOutLogger started
[DEBUG] [12/04/2012 18:01:54.176] [system-akka.actor.default-dispatcher-2] [EventStream] shutting down: StandardOutLogger started
[DEBUG] [12/04/2012 18:01:54.179] [system-akka.actor.default-dispatcher-2] [EventStream] all default loggers stopped

使用

scalaVersion := "2.10.0-RC3"

libraryDependencies ++= Seq(
  "com.typesafe.akka" %% "akka-actor" % "2.1.0-RC3" cross CrossVersion.full,
    "com.typesafe.akka" %% "akka-zeromq" % "2.1.0-RC3" cross CrossVersion.full,
    "com.typesafe.akka" %% "akka-slf4j" % "2.1.0-RC3" cross CrossVersion.full
)

libzmq 是版本 3.2.2(在 Arch Linux 上)

这是application.conf

akka {
  loglevel = DEBUG
  zeromq {
    socket-dispatcher {
      executor = thread-pool-executor
      type = "PinnedDispatcher"
    }
  }
}

【问题讨论】:

  • 仅供参考 - 它对我有用 - PULL 套接字接收消息。对不起。可能想尝试在 python 发送之前和之后添加一个睡眠(比如 1 秒)。您可能有一个竞争条件,您在参与者有机会连接之前绑定并发送。

标签: scala akka zeromq akka-zeromq


【解决方案1】:

好的,找到问题了。这是 libzmq 库版本。将库降级到 2.2 有效。我为 Akka 团队创建了一张票:https://www.assembla.com/spaces/akka/tickets/2769-akka-zeromq-doesn-t-receive-messages-with-libzmq-3-2#/activity/ticket

【讨论】:

  • libzmq 的 api 在 2.x 版本和最近的 3.x 版本之间发生了很大变化 - 其结果是破坏了 libzmq 的现有客户端。值得注意的是,pubsub 过滤现在是在发布者端而不是订阅者端完成的。有关这些更改的更多信息,请访问here
  • 我遇到了同样的问题。通过从源代码构建 ZeroMQ 2.2,问题得到了解决。原来 Ruby 中的“ffi-rzmq”gem 会因为降级而损坏,只需使用“zmq”gem 代替。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多