Szukaj…


Wprowadzenie

Java Message Service to interfejs API języka Java, który umożliwia aplikacjom tworzenie, wysyłanie, odbieranie i czytanie wiadomości. JMS API definiuje wspólny zestaw interfejsów i powiązaną semantykę, które pozwalają programom napisanym w języku programowania Java komunikować się z innymi implementacjami przesyłania komunikatów. JMS umożliwia komunikację nie tylko luźno sprzężoną, ale także asynchroniczną i niezawodną.

Uwagi

Java Message Service (JMS) to standardowy interfejs API języka Java, który umożliwia aplikacjom tworzenie, wysyłanie, odbieranie i odczytywanie wiadomości asynchronicznie.

JMS definiuje ogólny zestaw interfejsów i klas, które umożliwiają aplikacjom interakcję z innymi dostawcami komunikatów.

JMS jest podobny do JDBC: JDBC łączy się z różnymi bazami danych (Derby, MySQL, Oracle, DB2 itp.), A JMS łączy się z różnymi dostawcami (OpenMQ, MQSeries, SonicMQ i tak dalej).

Implementacją referencyjną JMS jest otwarta kolejka komunikatów (OpenMQ). Jest to projekt typu open source i może być stosowany w samodzielnych aplikacjach lub może być wbudowany w serwer aplikacji. Jest domyślnym dostawcą JMS zintegrowanym z GlassFish.

Tworzenie fabryki połączeń

Fabryki połączeń to zarządzane obiekty, które umożliwiają aplikacji łączenie się z dostawcą poprzez utworzenie obiektu Connection . javax.jms.ConnectionFactory to interfejs, który zawiera parametry konfiguracyjne zdefiniowane przez administratora.

Aby korzystać z ConnectionFactory klient musi wykonać wyszukiwanie JNDI (lub użyć wstrzyknięcia). Poniższy kod pobiera obiekt InitialContext JNDI i używa go do wyszukiwania obiektu ConnectionFactory pod nazwą JNDI:

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

Metody dostępne w tym interfejsie to metody createConnection() zwracające obiekt Connection oraz nowe metody createContext() JMS 2.0 zwracające obiekt JMSContext .

Możliwe jest utworzenie Connection lub JMSContext z domyślną tożsamością użytkownika lub poprzez podanie nazwy użytkownika i hasła:

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

Korzystanie z biblioteki ActiveMQ do przesyłania wiadomości (implementacje określone przez dostawcę Activemq JMS)

Skonfiguruj ActiveMQ

  • Pobierz dystrybucję ActiveMQ ze strony activemq.apache.org i rozpakuj ją gdzieś
  • Możesz natychmiast uruchomić serwer, działając niezabezpieczony na localhost, używając skryptu bin / activemq
  • Gdy jest uruchomiony, możesz uzyskać dostęp do konsoli serwera lokalnego na http: // localhost: 8161 / admin /
  • Skonfiguruj go, modyfikując conf / activemq.xml
  • Jak tytuł sugeruje następujące przykłady, implementacje specyficzne dla dostawcy ActivMq jms dla użytkownika, a zatem do ścieżki klas należy dodać plik Activemq-all.jar.

Wysyłanie wiadomości za pośrednictwem samodzielnego klienta

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

Odpytywanie o wiadomości

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

Korzystanie z MessageListener

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();
            } 
        }
    }
}

Korzystanie z wyszukiwania opartego na jndi do przesyłania wiadomości (przykład nieswoisty dla implementacji)

Ta metoda umożliwia pisanie i wdrażanie kodu niespecyficznego dla implementacji na wielu platformach JMS. Poniżej podstawowy przykład łączy się z serwerem Activemq JMS i wysyła komunikat.

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow