我們需要在我們的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