Programación que utiliza directamente JMS y mensajería

Sus aplicaciones empresariales pueden utilizar interfaces de programación Java™ Message Service (JMS) directamente para proporcionar servicios de mensajería y métodos que implementen la lógica empresarial.

Acerca de esta tarea

WebSphere® Application Server admite mensajería asíncrona como método de comunicación basado en interfaces de programación JMS. Con JMS, las aplicaciones empresariales pueden intercambiar mensajes de forma asíncrona con otros clientes JMS mediante destinos de JMS (colas o temas). Una aplicación empresarial puede sondear de forma explícita los mensajes en un destino.

Si elige no utilizar JNDI para obtener la información de configuración del proveedor de mensajería, por ejemplo para fábricas de conexiones o destinos, puede utilizar en su lugar una API proporcionada por el proveedor de mensajería para especificar la información de configuración mediante programación.

Si desea transmitir mensajes entre aplicaciones JMS y tradicionales WebSphere MQ aplicaciones, debe considerar cómo se asigna la estructura del mensaje JMS a un WebSphere MQ mensaje. Esto incluye escenarios en los que desea utilizar WebSphere MQ manipular mensajes transmitidos entre dos aplicaciones JMS; por ejemplo, usando WebSphere MQ como intermediario de mensajes.

De forma predeterminada, los mensajes JMS retenidos WebSphere MQ Las colas utilizan un MQRFH2 encabezado para contener parte de la información del encabezado del mensaje JMS. Muchos tradicionales WebSphere MQ Las aplicaciones no pueden procesar mensajes con estos encabezados y requieren sus propios encabezados característicos, por ejemplo el MQWIH para WebSphere MQ Aplicaciones de flujo de trabajo. Para obtener más información sobre cómo se asigna la estructura del mensaje JMS a un WebSphere MQ mensaje, ver la sección Mapeo de mensajes JMS en el WebSphere MQ documentación.

Procedimiento

Ejemplo

Este ejemplo siguiente muestra cómo configurar mediante programación un recurso para el proveedor de mensajería predeterminado.

En este ejemplo, se crea una conexión JMS con un bus de integración de servicios utilizando la API del paquete com.ibm.websphere.sib. Esta es una alternativa al uso de JNDI para la búsqueda de fábricas de conexiones configuradas de forma programada. Una vez establecida la conexión, el programa de ejemplo lee las líneas de entrada de la consola y las envía como mensajes de texto JMS al destino especificado.

Este ejemplo se puede ejecutar como una aplicación de cliente ligero o como una aplicación de cliente estándar.

/* 
 * 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);
      }
      
    }
  }

}