我是C ++的新手,但在Java EE方面有很多经验。
我需要编写一个非常异步的小应用程序。它从HTTP接收数据并将其存储在队列中(它需要有保证的传输和非常高的吞吐量),例如ActiveMQ或OpenMQ,可能通过JMS。
然后另一个C ++ app / listener从Queue中获取数据(通过一些直接由Queue激活的Listener,而不是我的池),连接到MySQL数据库并进行一些业务逻辑计算并将消息发送给另一个队列中。
在Java EE中,这将是一个将消息发送到JMS队列的Web应用程序。消息驱动的Bean将成为EJB模块中这些消息的使用者,而Session EJB会将消息发送到传出的JMS队列。
有C ++经验的人可以向我解释一些基础知识:
JMS是保证传递队列的唯一C ++选项吗?您是否建议使用ActiveMQ或其他内容,请记住消费者将使用C ++进行消息。
我是否需要在C ++中创建某种类型的多线程守护进程来侦听Queue消息,或者这个线程创建(消息消费)是ActiveMQ实现C +消费者的一部分吗?
非常感谢有关如何实施上述方案的任何其他建议。
编辑:我希望消息代理和客户端使用C ++。 ActiveMQ是一种Java产品,实际上并不是我们所需要的。
答案 0 :(得分:18)
1 - JMS - Java消息服务 - 仅是Java和Java的API参考。除了AMQP之外,在消息传递中没有适用于C ++的标准(我认为,这并不是真正有效的交叉实现)。对于C ++,您必须依赖特定的供应商库来实现每个消息代理。
实施建议:
ActiveMQ - 它有一个很好的C ++ API(被称为CMS),它建模并以JMS命名 - 因此您将熟悉API。主要代理将在Java上运行 - 可能是最简单的选择。
IBM WebSphere MQ - 不是开源的企业级代理,它运行本机(用C语言编写),并且具有C ++库。当你克服学习曲线并且价格无关紧要时,相当不错。
RabbitMQ - 非常流行的可靠消息传递,具有高性能和开源。有C ++客户端库但是用Erlang编写并在erlang / otp运行时运行。
Apache QPID - 鲜为人知的AMQP / JMS代理。有两种口味的服务器端,Java和C ++,其中C ++代理具有更好的性能。附带C ++客户端库。
2 - 对于多线程,JMS规范也没有真正的解决方案。它更像是Java EE容器(或Spring Framework),它简单地包装了线程的管理并使开发人员从中解脱出来。在这种情况下,ActiveMQ不仅仅提供了一些支持类,据我所知,其他供应商库也没有。所以,寻找一些包装线程的库(我不知道)或自己处理消费者线程。它应该不是那么混乱,做得对。