Java/Python通过消息中间件通信
有什么好的解决方案可以通过消息中间件来实现(C)Python和Java/JMS应用程序之间的通信吗?我有一些特别的要求:
- 要是开源的解决方案
- 能在基于Linux的系统上使用
- 发送者和接收者之间不需要直接联系(也就是说,得用消息中间件)
- 支持多个生产者和消费者对一个事件队列(每条消息只会被一个消费者接收)
- 支持工作单元,有两阶段提交(如果有XA支持那就更好了)
- 支持持久消息(也就是能在中间件重启后仍然存在)
- 支持Java客户端的JMS
- 没有任何组件是“边缘”的,意味着不会因为缺乏社区支持或兴趣而失去维护
- 如果有一个Python客户端能“说JMS”,那就太棒了,但如果答案是让我自己写一个Python的JMS层也可以接受
我发现找到这样的解决方案还真不容易。Apache的ActiveMQ默认不支持Python。ZeroMQ需要直接联系。RabbitMQ似乎也不支持JMS。我找到的最合适的候选是ActiveMQ和pyactivemq库的组合。但是pyactivemq的第一个和最后一个版本都是在2008年发布的,所以这似乎不符合我“没有边缘”这个要求。
理想的答案是一个或多个支持良好、文档齐全的开源包的名字,我希望这些包能在Java/JMS和Python应用之间进行通信,并且不需要太多的集成工作就能开始。如果答案中包含一个“简单”的实现(最多几天的工作)来满足以上所有要求,那也是可以接受的。如果没有好的开源候选,商业解决方案也可以。
另外,Jython不行。(要是可以就好了……)同样的Python应用需要使用只有在CPython中可用的模块。
4 个回答
JMS 是一个规范,而不是具体的实现。RabbitMQ 是一个很好的选择。
我也很高兴地使用过 HornetQ,链接在这里 http://www.jboss.org/hornetq,它和 Java EE 的其他东西更兼容。不过,如果你也在使用 Spring,RabbitMQ 会是一个特别不错的选择。
我发现找到这个问题的解决办法还真不容易。Apache的ActiveMQ默认不支持Python。
ActiveMQ的消息代理完全支持使用Stomp协议。Stomp是一种基于文本的消息传递协议,支持很多平台和编程语言。
ActiveMQ的文档里应该有关于如何设置Stomp连接器的信息。简单来说,启用一个连接器的步骤大概是这样的:
<transportConnectors>
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
</transportConnectors>
在代理端启用之后,你就可以使用任何支持Stomp的Python库了。这样,你就可以在Python端使用Stomp,在Java端使用JMS来和代理进行通信,并从特定的目的地发送或接收消息。