Ricerca…


introduzione

Java Message Service è un'API Java che consente alle applicazioni di creare, inviare, ricevere e leggere messaggi. L'API JMS definisce un insieme comune di interfacce e semantica associata che consente ai programmi scritti nel linguaggio di programmazione Java di comunicare con altre implementazioni di messaggistica. JMS consente comunicazioni che non solo sono accoppiate liberamente ma anche asincrone e affidabili.

Osservazioni

Java Message Service (JMS) è un'API Java standard che consente alle applicazioni di creare, inviare, ricevere e leggere i messaggi in modo asincrono.

JMS definisce un insieme generale di interfacce e classi che consentono alle applicazioni di interagire con altri provider di messaggi.

JMS è simile a JDBC: JDBC si connette a diversi database (Derby, MySQL, Oracle, DB2 ecc.) E JMS si collega con diversi provider (OpenMQ, MQSeries, SonicMQ e così via).

L'implementazione di riferimento JMS è Open Message Queue (OpenMQ). È un progetto open source e può essere utilizzato in applicazioni standalone o può essere integrato nel server delle applicazioni. È il provider JMS predefinito integrato in GlassFish.

Creazione di ConnectionFactory

Le factory di connessione sono gli oggetti gestiti che consentono all'applicazione di connettersi al provider creando l'oggetto Connection . javax.jms.ConnectionFactory è un'interfaccia che incapsula i parametri di configurazione definiti da un amministratore.

Per l'utilizzo di ConnectionFactory client deve eseguire la ricerca JNDI (o utilizzare l'iniezione). Il seguente codice ottiene l'oggetto InitialContext JNDI e lo utilizza per cercare l'oggetto ConnectionFactory sotto il nome JNDI:

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

I metodi disponibili in questa interfaccia sono metodi createConnection() che restituiscono un oggetto Connection e nuovi metodi createContext() JMS 2.0 che restituiscono un JMSContext .

È possibile creare una Connection o un JMSContext con l'identità dell'utente predefinita o specificando un nome utente e una password:

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

Utilizzo della libreria ActiveMQ per la messaggistica (implementazioni specifiche del provider activemq jms)

Imposta ActiveMQ

  • Scarica una distribuzione ActiveMQ da activemq.apache.org e decomprimila da qualche parte
  • È possibile avviare immediatamente il server, eseguendo unsecured su localhost, utilizzando lo script bin / activemq
  • Quando è in esecuzione, puoi accedere alla console del tuo server locale su http: // localhost: 8161 / admin /
  • Configuralo modificando conf / activemq.xml
  • Come suggerisce il titolo seguente esempi di implementazioni specifiche del provider activemq jms utente e quindi activemq-all.jar deve essere aggiunto al classpath.

Invio di un messaggio tramite client standalone

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

Polling per i messaggi

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

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

Utilizzo della ricerca basata su jndi per la messaggistica (esempio non specifico dell'implementazione)

Questo metodo consente di scrivere e distribuire codice non specifico per l'implementazione su più piattaforme jms. Sotto l'esempio di base si connette al server jms activemq e invia un messaggio.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow