Java/Python通过消息中间件通信

12 投票
4 回答
14600 浏览
提问于 2025-04-16 20:40

有什么好的解决方案可以通过消息中间件来实现(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 个回答

1

你可以看看 OpenAMQRabbitMQ 这两个东西。

RabbitMQ 和 OpenAMQ 使用的消息传递技术叫做 AMQP。你应该能很容易找到适用于这两个消息中介的 Python 和 Java 客户端(还有其他符合规范的中介也可以用)。

如果你一定需要 JMS,那你可能会找到一个基于 AMQP 实现的 JMS 客户端(OpenAMQ 曾经提供过这样的客户端,但我不太确定现在的情况)。

5

JMS 是一个规范,而不是具体的实现。RabbitMQ 是一个很好的选择。

我也很高兴地使用过 HornetQ,链接在这里 http://www.jboss.org/hornetq,它和 Java EE 的其他东西更兼容。不过,如果你也在使用 Spring,RabbitMQ 会是一个特别不错的选择。

4

我发现找到这个问题的解决办法还真不容易。Apache的ActiveMQ默认不支持Python。

ActiveMQ的消息代理完全支持使用Stomp协议。Stomp是一种基于文本的消息传递协议,支持很多平台和编程语言。

ActiveMQ的文档里应该有关于如何设置Stomp连接器的信息。简单来说,启用一个连接器的步骤大概是这样的:

<transportConnectors>
   <transportConnector name="stomp" uri="stomp://localhost:61613"/>
</transportConnectors>

在代理端启用之后,你就可以使用任何支持Stomp的Python库了。这样,你就可以在Python端使用Stomp,在Java端使用JMS来和代理进行通信,并从特定的目的地发送或接收消息。

撰写回答