Direkte Verwendung von JMS und Messaging programmieren
Ihre Unternehmensanwendungen können JMS-Programmierschnittstellen (Java™ Message Service) direkt verwenden, um Messaging-Services und -Methoden bereitzustellen, die Geschäftslogik implementieren.
Informationen zu diesem Vorgang
WebSphere Application Server unterstützt asynchrones Messaging als eine Methode der Kommunikation, die auf den JMS-Programmierschnittstellen basiert. Mit JMS können Unternehmensanwendungen Nachrichten über JMS-Ziele (Warteschlangen oder Topics) asynchron mit anderen JMS-Clients austauschen. Eine Unternehmensanwendung kann explizit Nachrichten an einem Ziel abfragen.
Wenn Sie sich gegen die Verwendung von JNDI für das Abrufen von Konfigurationsdaten, z. B. für Verbindungsfactorys oder Ziele, für Ihren Messaging-Provider entscheiden, können Sie stattdessen eine von Ihrem Messaging-Provider bereitgestellte Anwendungsprogrammierschnittstelle verwenden, um diese Konfigurationsdaten über das Programm anzugeben.
Wenn Sie Nachrichten zwischen JMS-Anwendungen und traditionellen IBM MQ-Anwendungen übertragen möchten, müssen Sie berücksichtigen, wie die JMS-Nachrichtenstruktur einer IBM MQ-Nachricht zugeordnet wird. Dazu gehören Szenarien, in denen Sie IBM MQ verwenden möchten, um Nachrichten zu bearbeiten, die zwischen zwei JMS-Anwendungen übertragen werden, z. B. über IBM MQ als Nachrichtenbroker.
Standardmäßig verwenden JMS-Nachrichten, die in IBM MQ-Warteschlangen gehalten werden, einen MQRFH2-Header, um einige der JMS-Nachrichtenheaderinformationen zu speichern. Viele traditionelle IBM MQ-Anwendungen können Nachrichten mit diesen Headern nicht verarbeiten und setzen eigene Merkmalheader voraus, z. B. MQWIH für IBM MQ-Workflow-Anwendungen. Weitere Informationen zur Zuordnung der JMS-Nachrichtenstruktur zu einer IBM MQ-Nachricht finden Sie im Abschnitt Mapping JMS messages im Information Center von IBM MQ.
Vorgehensweise
Beispiel
Im folgenden Beispiel wird gezeigt, wie Sie eine Ressource für den Standard-Messaging-Provider über das Programm konfigurieren.
In diesem Beispiel wird eine JMS-Verbindung zu einem Service Integration Bus über die Anwendungsprogrammierschnittstelle im Paket com.ibm.websphere.sib erstellt. Dies ist eine Alternative zur Verwendung von JNDI für die Suche administrativ konfigurierter Verbindungsfactorys. Nachdem die Verbindung hergestellt wurde, liest das Beispielprogramm Eingabezeilen aus der Konsole und sendet diese als JMS-Textnachrichten an das angegebene Ziel.
Dieses Beispielprogramm kann als Thin-Client-Anwendung oder als eigenständige Clientanwendung ausgeführt werden.
/*
* Beispielprogramm
* © COPYRIGHT International Business Machines Corp. 2009
* Alle Rechte vorbehalten * Lizenziertes Material - Eigentum der IBM
*
* Dieses Beispielprogramm wird ohne Wartung (auf "as-is"-Basis)
* bereitgestellt und kann vom Kunden
*
* (a) zu Schulungs- und Studienzwecken,
* (b) zum Entwickeln von Anwendungen für ein IBM WebSphere-Produkt zur
* internen Nutzung beim Kunden gebührenfrei genutzt, ausgeführt,
* kopiert und geändert werden.
*/
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;
/**
* Beispielcode zur Erstellung einer Verbindung zu einem Bus und zum Senden einer Textnachricht
* über das Programm.
*
* Beispielbefehlszeilen:
* SIBusSender-Topic://my/topic?topicSpace=Default.Topic.Space MyBus localhost:7276
* SIBusSender-Warteschlange://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 {
// Argumente syntaktisch analysieren
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];
// Factory-Factory abrufen
JmsFactoryFactory jmsFact = JmsFactoryFactory.getInstance();
// JMS-Ziel erstellen
Destination dest;
if (destUrl.startsWith("topic://")) {
JmsTopic topic = jmsFact.createTopic(destUrl);
// Setter-Methoden könnten hier aufgerufen werden, um das Topic zu konfigurieren
dest = topic ;
}
else {
JmsQueue queue = jmsFact.createQueue(destUrl);
// Setter-Methoden könnten hier aufgerufen werden, um die Warteschlange zu konfigurieren
dest = queue;
}
// Eine einheitliche JMS-Verbindungsfactory erstellen
JmsConnectionFactory connFact = jmsFact.createConnectionFactory();
// Verbindungsfactory konfigurieren
connFact.setBusName(busName);
connFact.setProviderEndpoints(providerEndpoints);
connFact.setTargetTransportChain(targetTransportChain);
// Verbindung erstellen
Connection conn = connFact.createConnection();
Session session = null;
MessageProducer producer = null;
try {
// Sitzung erstellen
session = conn.createSession(false, // Not transactional
Session.AUTO_ACKNOWLEDGE);
// Nachrichtenerzeuger erstellen
producer = session.createProducer(dest);
// Zu sendende Textzeilen aus der Konsole im Schleifenmodus lesen
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) {
// Textnachricht erstellen, die die Zeile enthält
TextMessage message = session.createTextMessage();
message.setText(line);
// Nachricht senden
producer.send(message,
Message.DEFAULT_DELIVERY_MODE,
Message.DEFAULT_PRIORITY,
Message.DEFAULT_TIME_TO_LIVE);
// Nächste Zeile lesen
line = lineInput.readLine();
}
}
// Letztendlich blockieren, um sicherzustellen, dass die JMS-Objekte geschlossen werden
finally {
// Nachrichtenerzeuger schließen
try {
if (producer != null) producer.close();
}
catch (JMSException e) {
System.err.println("Failed to close message producer: " + e);
}
// Sitzung schließen
try {
if (session != null) session.close();
}
catch (JMSException e) {
System.err.println("Failed to close session: " + e);
}
// Verbindung schließen
try {
conn.close(); }
catch (JMSException e) {
System.err.println("Failed to close connection: " + e);
}
}
}
}