Hvordan bruke Java JMS med MQSeries – Stack Overflow

Spørsmålet her er kravet om at "Sjefen min ba meg om å bruke ren java JMS (ikke ibm.mq lib) for å gjøre det." JMS er en spesifikasjon og hver gjennomføring må være i samsvar med API og semantikk, men står fritt til å gjøre hva de vil på et lavt nivå. Det er alltid nødvendig å bruke implementering klasser levert av transport leverandør. Derfor, hvis du bruker WebSphere MQ som transport, må du bruke IBM MQ JMS klasser for å skrive en JMS søknad.

Når det er sagt, hvis du holder deg med ren JMS API-kall du ville være i stand til å koble til en hvilken som helst transport leverandørens klasser. Dette er hva som vanligvis er ment når du får krav som den som er nevnt i det opprinnelige innlegget.

Det er en artikkel som beskriver nøyaktig hva du er ute etter å gjøre kalt Kjøre en frittstående Java-program på WebSphere MQ V6.0 Den bruker bare JMS API og den bruker JNDI i et lokalt filsystem (a .bindings fil). Ved å bytte ut de IBM JMS klasser for en annen leverandør og bruker sine JNDI verktøy vil du være i stand til å koble til en hvilken som helst JMS transport uten å endre koden ved å bruke denne tilnærmingen.

Hvis du ønsker å gjøre det samme uten JNDI, se på eksempelprogrammer som følger med MQ klientinstallasjon hvor du fikk din Java-klasser. I et UNIX / Linux-system disse er i / opt / mqm / SAMP og Windows er de i install_dir / verktøy / JMS / samples. Den SimpleRequestor.java prøven har følgende kode for å initialisere forbindelsen fabrikk uten JNDI:

Fordi denne tilnærmingen ikke bruker JNDI, må du skrive kode som ikke er transportable over transportleverandører. Det er IBM WebSphere MQ bestemt.

Hvis du fanget MQ krukker fra et sted og ikke har full installasjon (og dermed ikke har prøvene) kan du laste den ned som SupportPac MQC7. Nedlastingen er gratis. Generelt bør du bruke den nyeste klient, selv med en back-nivå køen manager. Selvfølgelig du ikke får V7 funksjonalitet fra en V6 QMGR men JMS gjennomføring i V7 klienten er mye bedre, selv for V6 funksjonalitet. Hvis for noe grunn du virkelig må bruke V6-klient, kan du laste den ned som SupportPacMQC6. Uansett hvilken klient versjon du bruker, må du sørge for å bruke den tilsvarende Infocenter.

Til slutt, destinasjonssiden med en indeks for alle SupportPacs er her.

"Derfor, hvis du bruker WebSphere MQ som transport, må du bruke IBM MQ JMS klasser for å skrive en JMS søknad." Jeg tror det er bare sant hvis du arbeider direkte med MQ. Hvis du er abstrahert via en beholder som WebSphere Application Server, kan du faktisk skrive "ren JMS" kode som app container tar vare på deg som arbeider med MQ samme som om du jobbet med SIBus gjennomføring. Alt du trenger å gjøre er å sørge for at MQ Køer er definert som JMS "køer" og at du har en QueueConnectionFactory (interfaceing med som om det var en ConnectionFactory). – Chris Aldrich 4 august ’11 på 16:28

Dette er en interessant semantisk dans. Transport leverandørens JMS klasser er CLASSPATH en eller annen måte. I ditt eksempel, gir JEE server en container innen hvilke IBM MQ JMS biblioteker er tilgjengelige. Men uansett, er programmet fortsatt bruker disse spesifikke klasser og kan få tilgang til sine leverandørspesifikke metoder. Det er ikke som om JEE server eller annen måte skjuler leverandøren gjennomføringen av programmet slik at det virker meningsløst forskjell for meg. Også OP spesifisert en frittstående JMS app så antagelig er det ingen JEE container i hans situasjon uansett. – T.Rob 4 august ’11 på 17:01

Hvis du ikke har noe imot å skrive WMQ-spesifikk kode så kan du gjøre

deretter ressurser vanlige JMS

og til slutt opprette og sende en melding

(Jeg har skrevet at i på toppen av hodet mitt så kan ikke utelukke en skrivefeil, men det er fundamentalt riktig). Hvis du virkelig skal bruke «rene JMS ‘- dvs. uten leverandøren spesifikke gjenstander – så må du binde en MQConnectionFactory objekt i JNDI (ta en titt på JMSAdmin verktøy, er det i docs) så slå det opp fra programmet, det vil si

Vanligvis med JMS vil du definere QueueConnectionFactory i beholderen via hva konfigurasjonen mekanisme gjør det tilgjengelig deretter legge den til beholderens JNDI-registeret. Hver container ville ha det egne metoder for å gjøre det (dvs. Tomcat versus WebSphere).

Hvis du ønsker å gi avkall JNDI, kan du opprette en forekomst av com.ibm.mq.jms.MQQueueConnectionFactory direkte og angi vertsnavn, port, queueManager, og kanalegenskaper på den. Du kan deretter bruke dette objektet som du ville en forekomst av javax.jms.QueueConnectionFactory siden det implementerer den.

svarte 4 august ’11 på 04:18

@ Cosmic.osmo – Se de andre svarene for eksempler på hvordan du setter egenskapene til CF objekt uten JNDI. JMS later til transportleverandøren å spesifisere nøyaktig hvilke egenskaper å sette og de verdiene som skal brukes. De JMS spec forby dette heller ikke håndheve på noen måte at dette må gjøres via JNDI. – T.Rob 10 august ’11 på 16:41

Kilde: stackoverflow.com

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

4 × four =