Wir müssen Warteschlangen in unserer Java EE-Anwendung verwenden und da es sich um eine Cloud-basierte Anwendung handelt (auf OpenShift Online), verwenden wir amazon sqs.Verwenden von Amazon sqs in einer @MessageDriven Bean - Pooling/Parallelverarbeitung
Wenn ich die Theorie des empfangenden Teils von JMS/Java EE richtig verstehe, wird eine Bean @MessageDriven
vom Java EE Container verwaltet, so dass viele Bean Instanzen parallel erzeugt werden (entsprechend der maximalen Poolgröße) Anzahl der eingehenden Nachrichten ist hoch. Dies ist natürlich ein großer Vorteil, um hohe Lasten zu verarbeiten.
Allerdings sehe ich nicht, wie wir aws sqs auf diese Weise in einer Java EE-Anwendung integrieren können. Ich kenne die asynchronen Empfänger Beispiele aus 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();
}
}
}
und dann:
// 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();
Dies ist das offizielle asynchrone Empfänger Beispiel -, die keine @MessageDriven
Bohne ist. Es ist offensichtlich, dass wir irgendwo die Anmeldeinformationen benötigen, um sich zu authentifizieren (indem wir eine SQSConnectionFactory, dann eine Verbindung und dann eine Sitzung erstellen - was auch im Beispiel gut beschrieben ist).
Aber ich nehme stark an, dass dieses Beispiel die Nachrichten nicht parallel verarbeiten wird - d. H. Nur eine Bean-Instanz verarbeitet die Warteschlange und dies ist keine gute Lösung für skalierbare, hoch ausgelastete Anwendungen.
a) Wie können wir den echten Java EE Weg mit Amazon SQS gehen? Ich finde nur ein paar Spring-Beispiele. Aber es muss Java EE 7 sein.
b) Wir verwenden Wildfly (derzeit 8.2.1). Wäre es auch möglich, Wildfly intern die Verbindung zu AWS und der Anwendung verwalten zu lassen, könnten wir die Warteschlange so verwenden, als wäre sie eine vom Application Server verwaltete Warteschlange (der gleiche Ansatz wie Datenquellen für den DB-Zugriff)?
Fazit bekam nach einer Antwort von stdunbar:
Es ist nicht in einem ‚richtigen Weg‘ möglich zu sein scheint, was ich tun möchte. Also was soll ich tun? Implementieren Sie eine ManagedExecutorService
als stdunbar beschrieben, um die Warteschlange zu "wickeln"? - Allerdings bedeutet dies, dass es auch eine lokale Warteschlange gibt, und das ist keine gute Situation für eine Anwendung, die skalierbar sein sollte ?! Was ist mit Alternativen? Wir führen die Anwendung auf OpenShift Online aus. Es wäre wahrscheinlich besser, einen eigenen Gang mit z.B. ApacheMQ Cartridge ... es gibt natürlich viele Nachteile wie Kosten und dass wir für die "Infrastruktur" verantwortlich sind.
Um ehrlich zu sein, ich bin wirklich enttäuscht von AWS in diesem Fall ...
Ich sehe nicht genau, wie Ihre ** numberOfReceivers ** funktioniert. Sie erstellen mehrere Listener für dasselbe Objekt (Sie injizieren 'sqsMessageReceiver', was tatsächlich eine Instanz ist)? – badera