我们需要在我们的Java EE应用程序中使用队列,并且由于它是云基础应用程序(部署在OpenShift Online上),我们喜欢使用亚马逊sqs。在@MessageDriven bean中使用amazon sqs - 池/并行处理
如果我正确理解了JMS/Java EE的接收部分的理论,一个@MessageDriven
bean由Java EE容器管理,以便并行创建大量bean实例(根据最大池大小),如果传入消息的数量很高。这当然是处理高负载的一大好处。
但是,我不明白我们如何在Java EE应用程序中以这种方式集成aws sqs。我知道异步接收器的例子来自http://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-java-message-service-jms-client.html:
class MyListener implements MessageListener {
@Override
public void onMessage(Message message) {
try {
// Cast the received message as TextMessage and print the text to screen.
if (message != null) {
System.out.println("Received: " + ((TextMessage) message).getText());
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
然后:
// Create a consumer for the 'TestQueue'.
MessageConsumer consumer = session.createConsumer(queue);
// Instantiate and set the message listener for the consumer.
consumer.setMessageListener(new MyListener());
// Start receiving incoming messages.
connection.start();
这是官方异步接收器的例子 - 这不是一个@MessageDriven
豆。很显然,我们需要在某个地方进行身份验证(通过创建一个SQSConnectionFactory,然后是一个连接,然后是一个会话 - 这在示例中也有详细描述)。
但我强烈认为这个例子不会并行处理消息 - 即只有一个bean实例正在处理队列,这对于可伸缩的高负载应用程序来说并不是一个好的解决方案。
a)我们如何才能通过Amazon SQS实现真正的Java EE方式? 我只是发现春天的例子。但它必须是Java EE 7. b)我们使用Wildfly(现在是8.2.1)。是否也可以让Wildfly在内部管理与AWS和应用程序的连接,我们可以像使用应用程序服务器管理的队列一样使用队列(与数据源访问数据库的方法相同)?
结论后,得到的回答从stdunbar:
它似乎没有可能在一个“适当的方式”,是我喜欢做的事。所以我该怎么做?实施ManagedExecutorService
作为stdunbar描述'包裹'的队列? - 但是这意味着有一个本地队列,这对于一个应用程序来说不是一个好的情况,应该是可扩展的! 什么是替代品?我们正在OpenShift Online上运行应用程序。使用例如自己的装备来实例化自己的装备可能是不利的。 ApacheMQ Cartridge ......当然还有很多不利因素,比如成本,我们对“基础架构”负责。
说实话,我在这种情况下,真的很失望AWS的...
我不完全明白,你的** numberOfReceivers **是如何工作的。你在同一个对象上创建了多个监听器(你注入'sqsMessageReceiver',实际上是一个实例)? – badera