WebSphere MQ, interakce s Javou

Pokud se chceme k WebShere MQ (WMQ) připojit z Javy, máme k dispozici dvě možnosti - buď použít WMQ třídy pro Javu, nebo je možné komunikovat pomocí Java Message Service (JMS). Obě možnosti mají svoje pro a proti, takže krátké shrnutí v pár bodech:WMQ třídy pro Javu:zapouzdřují Message Queue Interface (MQI),poskytují plnou sadu funkčností WMQ,je to proprietární řešení, ale jednodušší k používání, než JMS.(WMQ třídy pro) JMS:Java “industry standard” pro messaging,je součástí Java EE specifikace (a tedy součástí většiny (Java) aplikačních serverů),umožňuje spravovat administrované objekty (connection factory, fronty ad.) v centrální repository.Společná konfiguraceAť už použijeme jeden, nebo druhý způsob, v obou případech je potřeba mít vytvořené některé objekty. Všechny použité typy objektů jsem popisoval již v minulém zápisu. Jedinou informací navíc je, že vytvořený kanál musí být typu server-connection.WMQ třídy pro JavuTřídy pro Javu jsou poměrně přímočaré - stačí, pokud člověk rozumí hierarchii a funkci základních objektů ve WMQ:Vytvoří se instance Queue Manageru.Z něj se získá instace Queue, s parametrem daného typu otevření (procházení, vstup, výstup atd.).Vytvoří se Message a nastaví se jí nějaká data.Zpráva se vloží do (nebo načte z) fronty.Zavřou se zdroje.package com.adastracorp.jprase.wmq.java;import com.ibm.mq.MQMessage;import com.ibm.mq.MQQueue;import com.ibm.mq.MQQueueManager;import com.ibm.mq.constants.CMQC;public class JavaProvider { private static final String QM_NAME = “QM_JAVA”; private static final String HOSTNAME = “192.168.6.128”; private static final String CHANNEL = “JAVA.CHANNEL”; private static final int PORT = 5557; private static final String QUEUE = “JPRASE”; private static void init() { MQEnvironment.hostname = HOSTNAME; MQEnvironment.channel = CHANNEL; MQEnvironment.port = PORT; } public static void main(String[] args) throws Exception { init(); MQQueueManager queueManager = new MQQueueManager(QM_NAME); MQQueue queue = queueManager .accessQueue(QUEUE, CMQC.MQOO_OUTPUT | CMQC.MQOO_INQUIRE); MQMessage message = new MQMessage(); message.writeUTF(“Hello, WMQ!"); queue.put(message); queue.close(); queueManager.disconnect(); }}WMQ třídy pro JMSU JMS je trochu více konfigurace - je potřeba vytvořit Initial Context a do něj vložit Connection Factory a Destination. Destination je mapovaná na (existující) frontu a queue managera. WMQ v současné verzi (7.0.1.2) poskytuje pro JNDI dvě implementace (ale je možné použít i jiné, např. JNDI na WebSphere AS):LDAP server (com.sun.jndi.ldap.com.sun.jndi.fscontext.RefFSContextFactory),File system (com.sun.jndi.fscontext.RefFSContextFactory).Výsledná konfigurace vypadá takto:Kód samotný je pak klasické JMS:Vytvoření InitialContext.Vyhledání ConnectionFactory.Vytvoření Connection.Vytvoření Session.Vytvoření Destination.Vytvoření MessageProducer/MessageConsumer.Vytvoření Message (pro producenta).Odeslání (příjem) Message.Zavření zdrojů.package com.adastracorp.jprase.wmq.jms;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import javax.naming.Context;public class JmsProvider { private static final String CONTEXT_FACTORY = “com.sun.jndi.fscontext.RefFSContextFactory”; private static final String PROVIDER_URL = “file:///jms”; private static Context getContext() throws NamingException { Properties env = new Properties(); env.put(Context.INITIAL_CONTEXT_FACTORY, CONTEXT_FACTORY); env.put(Context.PROVIDER_URL, PROVIDER_URL); return new InitialContext(env); } public static void main(String[] args) throws Exception { Context context = getContext(); ConnectionFactory factory = (ConnectionFactory) context.lookup(“jmsConnFact”); Connection connection = factory .createConnection(); Session session = connection .createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session .createQueue(“JPRASE”); MessageProducer producer = session .createProducer(destination); producer.setDeliveryMode( DeliveryMode.NON_PERSISTENT); TextMessage message = session .createTextMessage( “Hello, JMS!"); producer.send(message); producer.close(); session.close(); connection.close(); }}