WebSphere MQ, interakce s Javou
·3 min
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á konfigurace
Ať 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 Javu
Tří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 JMS
U 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):
Výsledná konfigurace vypadá takto:
- 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();
}
}

