Programação para Usar o JMS e o Sistema de Mensagens Diretamente
Os aplicativos corporativos podem usar as interfaces de programação do Java™ Message Service (JMS) diretamente para fornecer serviços de sistemas de mensagens e métodos que implementam a lógica de negócios.
Sobre Esta Tarefa
O WebSphere Application Server suporta um sistema de mensagens assíncrono como um método de comunicação com base nas interfaces de programação do JMS. Usando o JMS, os aplicativos corporativos podem trocar mensagens de forma assíncrona com outros clientes do JMS usando destinos JMS (filas ou tópicos). Um aplicativo corporativo pode pesquisar mensagens de forma explícita em um destino.
Se você escolher não usar o JNDI para obter informações de configuração para seu provedor de sistemas de mensagens, por exemplo, para connection factories ou destinos, você poderá, em vez disso, usar uma API fornecida pelo provedor de sistemas de mensagens para especificar essas informações de configuração programaticamente.
Se desejar transmitir mensagens entre aplicativos JMS e aplicativos IBM MQ tradicionais, você deve considerar o modo como a estrutura da mensagem do JMS é mapeada em uma mensagem do IBM MQ. Isso inclui cenários nos quais você deseja usar o IBM MQ para manipular mensagens transmitidas entre dois aplicativos JMS; por exemplo, usando o IBM MQ como um message broker.
Por padrão, as mensagens JMS mantidas em filas do IBM MQ usam um cabeçalho MQRFH2 para manter algumas das informações do cabeçalho da mensagem JMS. Vários aplicativos tradicionais do IBM MQ não podem processar mensagens com esses cabeçalhos e requerem seus próprios cabeçalhos característicos, por exemplo, os aplicativos MQWIH para IBM MQ Workflow. Para obter informações adicionais sobre como a estrutura da mensagem JMS é mapeada em um uma mensagem do IBM MQ, consulte a seção Mapeando Mensagens do JMS no centro de informações do IBM MQ.
Procedimento
Exemplo
O exemplo a seguir mostra como configurar um recurso programaticamente para o provedor de sistemas de mensagens padrão.
Nesse exemplo, a conexão JMS com um barramento de integração de serviços é criada usando a API no pacote com.ibm.websphere.sib. Essa é uma alternativa ao uso do JNDI para consultar os connection factories configurados administrativamente. Após o estabelecimento da conexão, o programa de amostra lê as linhas de entrada do console e as envia como mensagens de texto JMS para o destino especificado.
Esse exemplo pode ser executado como um aplicativo thin client ou como um aplicativo cliente independente.
/*
* Sample program
* © COPYRIGHT International Business Machines Corp. 2009
* Todos os Direitos Reservados * Materiais Licenciados - Propriedade da 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();
}
}
// Finalmente, bloquear para assegurar que fechamos nossos objetos JMS
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);
}
}
}
}