Suche…


Einführung

Der Java Message Service ist eine Java-API, mit der Anwendungen Nachrichten erstellen, senden, empfangen und lesen können. Die JMS-API definiert einen gemeinsamen Satz von Schnittstellen und die zugehörige Semantik, mit der Programme, die in der Java-Programmiersprache geschrieben sind, mit anderen Messaging-Implementierungen kommunizieren können. JMS ermöglicht eine Kommunikation, die nicht nur lose gekoppelt, sondern auch asynchron und zuverlässig ist.

Bemerkungen

Java Message Service (JMS) ist eine Standard-Java-API, mit der Anwendungen Nachrichten asynchron erstellen, senden, empfangen und lesen können.

JMS definiert allgemeine Schnittstellen und Klassen, mit denen Anwendungen mit anderen Nachrichtenanbietern interagieren können.

JMS ähnelt JDBC: JDBC stellt eine Verbindung zu verschiedenen Datenbanken (Derby, MySQL, Oracle, DB2 usw.) her und JMS stellt eine Verbindung zu verschiedenen Anbietern (OpenMQ, MQSeries, SonicMQ usw.) her.

Die Implementierung der JMS-Referenz ist Open Message Queue (OpenMQ). Es ist ein Open Source-Projekt und kann in eigenständigen Anwendungen verwendet oder in Anwendungsserver integriert werden. Es ist der Standard-JMS-Anbieter, der in GlassFish integriert ist.

ConnectionFactory erstellen

Verbindungsfactorys sind die verwalteten Objekte, mit denen die Anwendung eine Verbindung zum Provider herstellen kann, indem ein Connection wird. javax.jms.ConnectionFactory ist eine Schnittstelle, die von einem Administrator definierte Konfigurationsparameter enthält.

Für die Verwendung von ConnectionFactory muss der Client eine JNDI-Suche ausführen (oder Injektion verwenden). Der folgende Code ruft das JNDI- InitialContext Objekt ab und verwendet es, um das ConnectionFactory Objekt unter dem JNDI-Namen zu suchen:

Context ctx = new InitialContext();
ConnectionFactory connectionFactory = 
                    (ConnectionFactory) ctx.lookup("jms/javaee7/ConnectionFactory");

Die in dieser Schnittstelle verfügbaren Methoden sind createConnection() -Methoden, die ein Connection Objekt zurückgeben, und neue JMS 2.0- createContext() -Methoden, die einen JMSContext .

Es ist möglich, eine Connection oder einen JMSContext zu erstellen, entweder mit der Standardbenutzeridentität oder durch Angabe eines Benutzernamens und Kennworts:

public interface ConnectionFactory {
    Connection createConnection() throws JMSException;
    Connection createConnection(String userName, String password) throws JMSException;

    JMSContext createContext();
    JMSContext createContext(String userName, String password);
    JMSContext createContext(String userName, String password, int sessionMode);
    JMSContext createContext(int sessionMode);
}

Verwenden der ActiveMQ-Bibliothek für das Messaging (für spezifische Implementierungen von activemq jms-Providern)

Richten Sie ActiveMQ ein

  • Laden Sie eine ActiveMQ-Distribution von activemq.apache.org herunter und entpacken Sie sie irgendwo
  • Sie können den Server sofort starten und mit dem Skript bin / activemq unsicher auf localhost ausführen
  • Wenn es ausgeführt wird, können Sie unter http: // localhost: 8161 / admin / auf die Konsole Ihres lokalen Servers zugreifen.
  • Konfigurieren Sie es durch Ändern von conf / activemq.xml
  • Da der Titel folgende Beispiele vorschlägt, müssen benutzeraktivierte jms-Provider-spezifische Implementierungen und daher activemq-all.jar zum Klassenpfad hinzugefügt werden.

Senden einer Nachricht über einen Standalone-Client

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JmsClientMessageSender {

    public static void main(String[] args) {
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
        Connection con = null;
        try {
            con = factory.createConnection();
            Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session

            Queue queue = session.createQueue("test.queue"); // only specifies queue name

            MessageProducer producer = session.createProducer(queue);
            Message msg = session.createTextMessage("hello queue"); // text message
            producer.send(msg);

        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            if (con != null) {
                try {
                    con.close(); // free all resources
                } catch (JMSException e) { /* Ignore */ }
            }
        }
    }
}

Nachrichten abfragen

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JmsClientMessagePoller {

    public static void main(String[] args) {
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
        Connection con = null;

        try {
            con = factory.createConnection();
            Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session

            Queue queue = session.createQueue("test.queue"); // only specifies queue name

            MessageConsumer consumer = session.createConsumer(queue);

            con.start(); // start the connection
            while (true) { // run forever
                Message msg = consumer.receive(); // blocking!
                if (!(msg instanceof TextMessage))
                    throw new RuntimeException("Expected a TextMessage");
                TextMessage tm = (TextMessage) msg;
                System.out.println(tm.getText()); // print message content
            }
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();
            } catch (JMSException e) {/* Ignore */ }
        }
    }
}

MessageListener verwenden

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;

public class JmsClientMessageListener {

    public static void main(String[] args) {
        ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); // ActiveMQ-specific
        Connection con = null;

        try {
            con = factory.createConnection();
            Session session = con.createSession(false, Session.AUTO_ACKNOWLEDGE); // non-transacted session
            Queue queue = session.createQueue("test.queue"); // only specifies queue name

            MessageConsumer consumer = session.createConsumer(queue);

            consumer.setMessageListener(new MessageListener() {
                public void onMessage(Message msg) {
                    try {
                        if (!(msg instanceof TextMessage))
                            throw new RuntimeException("no text message");
                        TextMessage tm = (TextMessage) msg;
                        System.out.println(tm.getText()); // print message
                    } catch (JMSException e) {
                        System.err.println("Error reading message");
                    }
                }
            });
            con.start(); // start the connection
            Thread.sleep(60 * 1000); // receive messages for 60s
        } catch (JMSException e1) {
            e1.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            try {
                con.close();        // free all resources
            } catch (JMSException e) {
                e.printStackTrace();
            } 
        }
    }
}

Verwenden der jndi-basierten Suche für Messaging (nicht implementierungsspezifisches Beispiel)

Mit dieser Methode kann nicht implementierungsspezifischer Code auf mehreren JMS-Plattformen geschrieben und bereitgestellt werden. Das folgende grundlegende Beispiel stellt eine Verbindung zum activemq jms-Server her und sendet eine Nachricht.

import java.util.Properties;

import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class JmsClientJndi {

    public static void main(String[] args) {

        Properties jndiProps = new Properties();
        // Following two could be set via a system property for flexibility in the code.
        jndiProps.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
        jndiProps.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
        
        QueueConnection conn = null;
        QueueSession session = null;
        QueueSender sender = null;
        InitialContext jndi = null;
        try {
            jndi = new InitialContext(jndiProps);
            QueueConnectionFactory factory = (QueueConnectionFactory) jndi.lookup("ConnectionFactory");
            conn = factory.createQueueConnection();
            conn.start();

            session = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
            Queue queue = (Queue) jndi.lookup("dynamicQueues/test.queue");
            sender = session.createSender(queue);
            
            TextMessage msg = session.createTextMessage();
            msg.setText("Hello worlds !!!!! ");
            sender.send(msg);
            
            
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            try {
                if (sender != null)
                    sender.close();
                if (session != null)
                    session.close();
                if (conn != null)
                    conn.close();
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow