Programmation de l'utilisation directe de la messagerie et de JMS
Vos applications d'entreprise peuvent utiliser directement des interfaces de programmation JMS (Java™ Message Service) pour fournir des services de messagerie, et des méthodes qui implémentent la logique métier.
Pourquoi et quand exécuter cette tâche
WebSphere Application Server prend en charge la messagerie asynchrone comme méthode de communication basée sur les interfaces de programmation JMS. A l'aide de JMS, les applications d'entreprise peuvent échanger des messages en mode asynchrone avec d'autres clients JMS en utilisant des destinations JMS (files d'attente ou rubriques). Une application d'entreprise peut effectuer une interrogation explicite afin de collecter les messages sur une destination.
Si vous choisissez de ne pas utiliser JNDI pour obtenir des données de configuration pour votre fournisseur de messagerie, par exemple des fabriques de connexions ou des destinations, vous pouvez utiliser à la place, une API fournie par votre fournisseur de messagerie pour indiquer ces données de configuration à l'aide d'un programme.
Si vous souhaitez transférer des messages des applications JMS vers les applications IBM MQ traditionnelles, vous devez prendre en compte le mode de message de la structure de message JMS dans un message IBM MQ. Cela inclut les scénarios dans lesquels vous souhaitez utiliser IBM MQ pour manipuler les messages transmis entre deux applications JMS, par exemple, en utilisant IBM MQ en tant que courtier de messages.
Par défaut, les messages JMS des files d'attente IBM MQ utilisent un en-tête MQRFH2 afin d'y placer certaines des informations d'en-tête de message JMS. La plupart des applications IBM MQ traditionnelles ne peuvent pas traiter les messages avec ces en-têtes. Les applications doivent disposer de leurs propres en-têtes de caractéristique, par exemple l'élément MQWIH pour les applications IBM MQ Workflow. Pour plus d'informations sur le mappage de la structure de message JMS vers un message IBM MQ, voir la section Mappage des messages JMS dans le centre de documentation IBM MQ.
Procédure
Exemple
L'exemple ci-après illustre la configuration d'une ressource à l'aide d'un programme pour le fournisseur de messagerie par défaut.
Dans cet exemple, une connexion JMS à un bus d'intégration de services est créée à l'aide de l'API figurant dans le package com.ibm.websphere.sib. Ceci permet d'éviter d'utiliser JNDI pour rechercher les fabriques de connexions configurées de manière administrative. Une fois la connexion établie, le programme exemple lit les lignes d'entrée à partir de la console et les envoie sous forme de messages texte JMS à la destination indiquée.
Cet exemple peut être exécuté en tant qu'application client léger ou en tant qu'application client autonome.
/*
* Sample program
* © COPYRIGHT International Business Machines Corp. 2009
* All Rights Reserved * Licensed Materials - Property of IBM
*
* This sample program is provided AS IS and may be used, executed,
* copied and modified without royalty payment by customer
*
* (a) for its own instruction and study,
* (b) in order to develop applications designed to run with an IBM
* WebSphere product for the customer's own internal use.
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.jms.Connection;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import com.ibm.websphere.sib.api.jms.JmsConnectionFactory;
import com.ibm.websphere.sib.api.jms.JmsFactoryFactory;
import com.ibm.websphere.sib.api.jms.JmsQueue;
import com.ibm.websphere.sib.api.jms.JmsTopic;
/**
* Sample code to programmatically create a connection to a bus and
* send a text message.
*
* Example command lines:
* SIBusSender topic://my/topic?topicSpace=Default.Topic.Space MyBus localhost:7276
* SIBusSender queue://myQueue MyBus localhost:7286:BootstrapSecureMessaging InboundSecureMessaging
*/
public class SIBusSender {
/**
* @param args DEST_URL,BUS_NAME,PROVIDER_ENDPOINTS,[TRANSPORT_CHAIN]
*/
public static void main(String[] args) throws JMSException, IOException {
// Parse the arguments
if (args.length < 3) {
throw new IllegalArgumentException(
"Usage: SIBusSender <DEST_URL> <BUS_NAME> <PROVIDER_ENDPOINTS> [TARGET_TRANSPORT_CHAIN]");
}
String destUrl = args[0];
String busName = args[1];
String providerEndpoints = args[2];
String targetTransportChain = "InboundBasicMessaging";
if (args.length >= 4) targetTransportChain = args[3];
// Obtain the factory factory
JmsFactoryFactory jmsFact = JmsFactoryFactory.getInstance();
// Create a JMS destination
Destination dest;
if (destUrl.startsWith("topic://")) {
JmsTopic topic = jmsFact.createTopic(destUrl);
// Setter methods could be called here to configure the topic
dest = topic ;
}
else {
JmsQueue queue = jmsFact.createQueue(destUrl);
// Setter methods could be called here to configure the queue
dest = queue;
}
// Create a unified JMS connection factory
JmsConnectionFactory connFact = jmsFact.createConnectionFactory();
// Configure the connection factory
connFact.setBusName(busName);
connFact.setProviderEndpoints(providerEndpoints);
connFact.setTargetTransportChain(targetTransportChain);
// Create the connection
Connection conn = connFact.createConnection();
Session session = null;
MessageProducer producer = null;
try {
// Create a session
session = conn.createSession(false, // Not transactional
Session.AUTO_ACKNOWLEDGE);
// Create a message producer
producer = session.createProducer(dest);
// Loop reading lines of text from the console to send
System.out.println("Ready to send to " + dest + " on bus " + busName);
BufferedReader lineInput = new BufferedReader(new InputStreamReader(System.in));
String line = lineInput.readLine();
while (line != null && line.length() > 0) {
// Create a text message containing the line
TextMessage message = session.createTextMessage();
message.setText(line);
// Send the message
producer.send(message,
Message.DEFAULT_DELIVERY_MODE,
Message.DEFAULT_PRIORITY,
Message.DEFAULT_TIME_TO_LIVE);
// Read the next line
line = lineInput.readLine();
}
}
// Finally block to ensure we close our JMS objects
finally {
// Close the message producer
try {
if (producer != null) producer.close();
}
catch (JMSException e) {
System.err.println("Failed to close message producer: " + e);
}
// Close the session
try {
if (session != null) session.close();
}
catch (JMSException e) {
System.err.println("Failed to close session: " + e);
}
// Close the connection
try {
conn.close();
}
catch (JMSException e) {
System.err.println("Failed to close connection: " + e);
}
}
}
}