通过消息代理进行 Java/Python 通信
Posted
技术标签:
【中文标题】通过消息代理进行 Java/Python 通信【英文标题】:Java/Python communication via message broker 【发布时间】:2011-09-26 23:02:50 【问题描述】:对于通过支持 (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 中可用的模块。
【问题讨论】:
Amazon SQS 或 SNS 支持 Java 和 Python...code.google.com/p/awspylib 不是我的专业领域,但ZeroC's Ice 可能有您想要的。 @sdolgy 我想我应该声明我不想将消息的内容信任给第三方或通过互联网发送它们。尽管如此,一个有趣的平台。 @mrt 似乎 Ice 可以用来实现一个通用的消息代理(以及很多其他的东西)。不是我所谓的“简单” DIY 步骤来获得我需要的解决方案,因为我需要实现工作单元、消息持久性和多个生产者/消费者。不过谢谢,我以前不知道这个,看起来很成熟。 要问“你调查过 Jython 吗?”直到我注意到你的最后一段。哦,好吧。 【参考方案1】:JMS 是规范而不是实现。 RabbitMQ 是一个真正的选择。
我也很高兴地使用了来自 Jboss 的 HornetQ http://www.jboss.org/hornetq,因为它与 Java EE 的每件事都更加一致,但如果你也使用 Spring,RabbitMQ 将是特别的选择
【讨论】:
澄清我的 JMS 兼容性要求。因为 JMS 允许传输属性和标头以及文本或字节消息,所以这些强制性功能实际上对底层传输提出了要求。因此,Python 对等点及其使用的 API 必须以某种方式支持标头和字节/字符消息,以便与 Java JMS 对等点进行通信。但是,我不希望 Python 对等体支持序列化的 Java 对象消息。【参考方案2】:我很难找到解决方案。 Apache 的 ActiveMQ 没有开箱即用的 Python 支持。
ActiveMQ 代理完全支持使用开箱即用的 Stomp 协议。 Stomp 是一种基于文本的消息传递协议,具有适用于多种平台和语言的客户端。
ActiveMQ 的文档应该包含有关如何为 stomp 设置连接器的信息。在最简单的形式中,启用连接器类似于:
<transportConnectors>
<transportConnector name="stomp" uri="stomp://localhost:61613"/>
</transportConnectors>
一旦在代理端启用,您就可以使用任何支持 stomp 的 python 库。然后,您可以在 python 端使用 Stomp,在 java 端使用 JMS 与代理进行通信并从特定目的地发送/接收。
【讨论】:
到目前为止,我还没有完成对所有答案的评估,但到目前为止,这个是最喜欢的,因为我的组织更看好 ActiveMQ。我将评估所有这些答案,并向任何其他证明可行的人发放/奖励新的赏金。谢谢大家。【参考方案3】:您可能想看看OpenAMQ,再看看RabbitMQ。
RabbitMQ 和 OpenAMQ 使用的底层消息传递技术是AMQP。您应该能够轻松找到适用于这两个代理(以及表面上任何其他符合规范的代理)的 Python 和 Java 客户端。
如果 JMS 是必须具备的,那么您可能会找到一个在 AMQP 之上实现的 JMS 客户端(OpenAMQ 曾经提供过这样的客户端,但我不确定它的当前状态)。
【讨论】:
RabbitMQ 中承诺的 JMS 支持没有实现。它的文献说支持 JMS,但我在任何源中都找不到字符串“javax.jms”的任何出现,即使对于“rabbitmq-java-client”项目也是如此。有许多对名为 openamq-jms 的项目的引用,这将允许 JMS 支持两个代理,但到目前为止,与它的所有链接都已断开。您是如何让 JMS 与这些代理合作的? 无论如何,+1 将我指向 OpenAMQ,即使经过大量搜索,我也没有找到它。【参考方案4】:我们一直在使用 GlassFish Message Queue(以前的 Sun Java MQ)——它继承自 OpenMQ
它满足您的大部分要求,如果不是全部的话。 我们一直在 Red Hat Linux (RHEL) 中使用故障转移集群代理——它对于大量使用是可靠的。虽然有些“怪癖”潜伏在这里和那里。
【讨论】:
这个开始看起来不错。开源、JMS 和 STOMP。 +1,我会在奖励赏金之前进行评估。以上是关于通过消息代理进行 Java/Python 通信的主要内容,如果未能解决你的问题,请参考以下文章