Bevor es um die konkreten Muster (Request/Reply, Publish/Subscribe) geht, lohnt sich die Grundunterscheidung, auf der alles andere aufbaut.
Eine Nachricht auf einer Queue wird von genau einem Consumer verarbeitet. Haengen mehrere Consumer an derselben Queue (z.B. mehrere gepoolte Instanzen derselben Message-Driven Bean, siehe {@code ClaimIntakeMDB}), teilen sie sich die eingehenden Nachrichten - jede einzelne Nachricht geht an nur einen von ihnen, nie an mehrere. Das ist das Modell fuer Lastverteilung: mehr Consumer bedeuten mehr Durchsatz, aber jede Nachricht wird trotzdem nur einmal bearbeitet.
In diesem Projekt: jms/novaris/claimsIntakeQueue (Schadensmeldungen an
{@code ClaimIntakeMDB}) und jms/novaris/claimsReplyQueue (Antworten an
{@code ClaimSubmissionClient}) - siehe 02-request-reply.md.
Eine Nachricht auf einem Topic geht an jeden aktiven Abonnenten - jeder bekommt eine eigene, vollstaendige Kopie. Haben zehn unabhaengige Systeme dasselbe Topic abonniert, verarbeiten alle zehn dieselbe Nachricht, unabhaengig voneinander. Das ist das Modell fuer Benachrichtigung/Verteilung: der Publisher weiss nicht (und muss nicht wissen), wie viele Abonnenten es gibt oder was sie mit der Nachricht tun.
In diesem Projekt: jms/novaris/policyEventsTopic, publiziert von
PolicyEventPublisherBean (novaris-policy-core), abonniert von
PolicyDocumentGenerationMDB und CustomerNotificationMDB (beide
novaris-notification-jms) - siehe 03-topics-und-selektoren.md.
| Frage | Antwort deutet auf ... |
|---|---|
| "Genau eine Stelle im System soll das erledigen" | Queue |
| "Beliebig viele, unabhaengige Stellen sollen davon erfahren" | Topic |
| "Ich brauche eine Antwort auf meine Anfrage" | Queue + Request/Reply-Muster |
| "Ich will nur benachrichtigen, ohne auf eine Reaktion zu warten" | Topic (Fire-and-Forget) |
Diese Entscheidung wird bei der Anlage der JMS-Destination getroffen (WebSphere-
Administration bzw. server.xml, siehe docs/10-ejb-konzepte/07-jndi-und-packaging.md) -
der Java-Code (@ActivationConfigProperty(propertyName="destinationType", ...)) muss dazu
passen, kann aber selbst keine Queue nachtraeglich zu einem Topic machen oder umgekehrt.