2016-05-19 30 views
1

Ich fragte mich, ob ich einen Listener auf MessageConsumer registrieren und dann die receive() Methode aufrufen könnte. Ich weiß, es klingt nicht nach einem praktischen Szenario, aber es wäre interessant zu wissen. Erlaubt die JMS-Spezifikation überhaupt so etwas?Kann ich einen Listener auf MessageConsumer registrieren und dann die Methode receive() aufrufen? (JMS)

Ich weiß, dass Session ein Single-Threaded-Kontext ist und der Versand von Nachrichten durch seine Listener sequenziell sein wird, aber wie ich mir vorstellen kann der Thread, der tatsächlich meine registrierte Listener behandelt, wird es tun, und es muss einige sein Thread, den der JMS-Provider erstellt. Das bedeutet, dass der Thread, der den Nachrichtenkonsumenten erstellt hat, getrennt ist und gleichzeitig auf Nachrichten warten kann. Ist das was ich gerade gesagt habe richtig? Was passiert in diesem Szenario?

Antwort

1

Soweit ich weiß, ist Ihr Szenario nicht in JMS-Spezifikation beschrieben. Es bleibt also der JMS-Implementierung überlassen. Im Fall von IBM MQ würde beispielsweise ein Empfangsaufruf nach dem Anhängen eines Nachrichten-Listeners eine Ausnahme mit dem Rückkehrcode MQRC_HCONN_ASYNC_ACTIVE auslösen.

1

Ihre Analyse des Threading-Problems ist genau, wo mein Denken gehen würde. Ich denke, du bist in Schwierigkeiten, weil 2 Threads mit der einen Sitzung interagieren.

OK, ich habe es in der Spezifikation JMS 1.1 nachgeschlagen. Zwei Bits sprechen so, wie ich es gelesen habe.

  • 4.5 - "Ein Client kann entweder synchron die Nachrichten eines Verbrauchers empfangen oder sie vom Provider asynchron liefern lassen, sobald sie ankommen." Entweder/oder nicht beides.
  • 4.4.6 - "Es ist falsch, wenn ein Client einen Kontroll-Thread verwendet, um zu versuchen, eine Nachricht synchron zu empfangen, wenn bereits ein Client-Kontroll-Thread darauf wartet, eine Nachricht in derselben Sitzung zu empfangen." Ich denke, dass der Nachrichten-Listener der andere Thread ist, der bereits darauf wartet, in derselben Sitzung empfangen zu werden.