JMS -Warteschlange in Weblogic10 EJB2 -Sitzungsbean in der Lage, zu senden, aber nicht zu empfangen
-
16-09-2019 - |
Frage
Ich versuche, eine JMS-Nachricht in einem EJB2 zu erhalten (Legacy Sucks ;-) Bean von Weblogic 10.0.1 mit Bean-verwalteten Transaktionen. Warteschlangendefinition aus dem JMS -Ordner sieht aus wie
<uniform-distributed-queue name="ReqQueue">
<default-targeting-enabled>true</default-targeting-enabled>
<delivery-params-overrides>
<delivery-mode>Non-Persistent</delivery-mode>
</delivery-params-overrides>
<quota>QuotaCrc</quota>
<jndi-name>xxx.ReqQueue</jndi-name>
<load-balancing-policy>Round-Robin</load-balancing-policy>
</uniform-distributed-queue>
<uniform-distributed-queue name="RespQueue">
<default-targeting-enabled>true</default-targeting-enabled>
<delivery-params-overrides>
<delivery-mode>Non-Persistent</delivery-mode>
</delivery-params-overrides>
<quota>QuotaCrc</quota>
<jndi-name>xxx.RespQueue</jndi-name>
<load-balancing-policy>Round-Robin</load-balancing-policy>
</uniform-distributed-queue>
Die Geschäftsmethode in der Bean startet keine Transaktion, sodass die JMS -Operationen nicht transaktional sind. Der ausgeführte Code ist
InitialContext ictx = new InitialContext();
QueueConnectionFactory cf = (QueueConnectionFactory)
ictx.lookup("weblogic.jms.ConnectionFactory");
Queue responseQueue = (Queue) ictx.lookup("RespQueue");
conn = cf.createConnection();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer receiver = session.createConsumer(responseQueue);
ObjectMessage response = (ObjectMessage) receiver.receive(30000);
Das Problem ist, dass receiver.receive
Gibt Null sofort ohne Blockierung zurück, unabhängig vom Inhalt der Warteschlange. Nach dem JMS API Doc.,, receiver.receive
Mit einer Auszeit kehrt Null nach der Auszeit oder sofort zurück, wenn das Ziel geschlossen ist. Das Problem ist das gleiche, wenn ich Bean -verwaltete Transaktionen, Container -verwaltete Transaktionen oder überhaupt keine Transaktionen verwende. Das Posten einer JMS -Nachricht in eine andere Warteschlange funktioniert. Erhalten Sie Returns Null sofort, unabhängig davon, ob ich zuvor in derselben Methode versende oder nicht.
Warum ist die Warteschlange geschlossen oder warum scheint es so?
Leider ist MDB keine Option, da wir einen synchronen Anruf durch JMS abtunnieren müssen (und ich möchte nicht zu viel im Schlammball herumtäuschen ;-)
Lösung
VorMessageConsumer -Empfänger = Sitzung.CreateConsumer (Responsequeue);stellenconn.start ();
Andere Tipps
Nachdem Sie die Verbindung erstellt haben, muss sie begonnen werden, um in den Empfängermodus einzusteigen. Versuche dies
......
conn = cf.createConnection();
conn.start();
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
......