AKKA:通过消息队列进行通信

时间:2012-01-09 23:32:50

标签: scala groovy akka zeromq

我们有一个用Groovy编写的组件(我们称之为“G-Component”),它需要与用Scala / AKKA编写的组件进行通信(我们称之为“A组件”)。

最符合我们需求的是消息队列:

"G-COMPONENT" <==> in memory messaging queue <==> "A-COMPONENT"

对于“G-COMPONENT”来说,生活很简单:

queue.send( message )
message = queue.receive()

对于AKKA组件,它似乎更复杂,因为有一个Actor需要“处理”/“接收”消息,并能够“发送”消息。

问题是“接收”部分,因为它现在需要进入自己的循环来侦听来自队列的消息。哪个..禁用它作为AKKA Actor,因为一旦它在该循环中,它就不能接收任何AKKA消息。

在没有实现“特定队列实现”演员邮箱的AKKA插件的情况下,不胜感激为此提供干净解决方案的任何帮助。

3 个答案:

答案 0 :(得分:3)

将“问题编辑”转换为答案

发现尚未正式发布AKKA API的有趣发展:

Akka提供了ZeroMQ module,它抽象了ZeroMQ连接,因此允许Akka actor之间的交互通过ZeroMQ连接进行。

似乎我可以使用AKKA方法来生成ZeroMQ监听器:

val listener = actorOf(new Actor {
  def receive: Receive = {
    case message: ZMQMessage => ...
    case _ => ...
  }
}).start

val socket = ZMQ.newSocket(SocketParameters(context, SocketType.Sub, Some(listener)))
socket ! Connect("tcp://127.0.0.1:1234")
socket ! Subscribe(Seq())

由Viktor Klang确认(问题评论)这是要走的路

答案 1 :(得分:1)

这可能是显而易见的,但Akka具有出色的驼峰和amqp集成。

http://akka.io/docs/akka-modules/1.2/modules/camel.html http://akka.io/docs/akka-modules/1.2/modules/amqp.html

我不确定你的意思是“没有实现”特定队列实现“Actor邮箱”的AKKA插件。这是否意味着您不想使用这些组件?

答案 2 :(得分:0)

AKKA是一个不是编程语言的库。

只需在演员之外编写zeromq消息侦听器,并让它将传入的zeromq消息发送给AKKA演员。我已经使用Java AMQP客户端库使用AMQP完成了这项工作,它运行正常。

如果你想让ZeroMQ监听器在一个事件循环中运行,那么使用select poller http://api.zeromq.org/2-1:zmq-poll编写自己的代码就很容易了。看看AKKA zeromq模块中的ConcurrentSocketActor源代码,因为那是它的用途。如果您需要为某些其他类型的网络通信推送自己的并发actor,那么这将是一个很好的模型。

这就是人们在想要以任何语言向非网络应用程序添加网络可访问管理界面时所遇到的问题。