Нам нужно использовать очереди в нашем приложении Java EE, и поскольку это приложение для облачных вычислений (развернуто на OpenShift Online), нам нравится использовать амазонные sqs.с использованием амазонок sqs в компоненте @MessageDriven - объединение/параллельная обработка
Если я правильно понимаю теоретику принимающей части JMS/Java EE, то bean-компонент управляется контейнером Java EE, так что множество экземпляров bean создаются параллельно (в соответствии с максимальным размером пула), если количество входящих сообщений велико. Это, конечно, большое преимущество для обработки высоких нагрузок.
Однако я не вижу, как мы можем интегрировать aws sqs таким образом в приложении Java EE. Я знаю, асинхронные примеры ресивера 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, затем соединения, а затем сеанса, который также хорошо описан в примере).
Но я полагаю, что этот пример не будет обрабатывать сообщения параллельно - то есть только один экземпляр компонента обрабатывает очередь, и это не является хорошим решением для масштабируемых высоконагруженных приложений.
a) Как мы можем перейти к реальному пути Java EE с помощью Amazon SQS? Я просто нахожу плантацию весенних примеров. Но это должен быть Java EE 7.
b) Мы используем Wildfly (в настоящее время 8.2.1). Можно ли также позволить Wildfly управлять соединением с AWS и приложением внутри, мы могли бы использовать очередь, как если бы это была управляемая очередь сервера приложений (такой же подход, как источники данных для доступа к БД)?
Заключение после того, как получил ответ от stdunbar:
Это кажется не возможным в «правильном пути», что мне нравится делать. И что же мне делать? Внесите ManagedExecutorService
в качестве stdunbar, описанный для «обертывания» очереди? - Однако это подразумевает наличие локальной очереди, и это не очень хорошая ситуация для приложения, которое должно быть масштабируемым ?! Что такое альтернативы? Мы запускаем приложение в OpenShift Online. Вероятно, было бы целесообразно создать экземпляр собственной передачи, например. ApacheMQ Cartridge ... есть, конечно, много недостатков, таких как затраты, и что мы несем ответственность за «инфраструктуру».
Честно говоря, я очень разочарован АМС в этом случае ...
Я точно не вижу, как работает ваш ** numberOfReceivers **. Вы создаете несколько слушателей на одном объекте (вы вводите 'sqsMessageReceiver', который на самом деле является одним экземпляром)? – badera