Sök…


Introduktion

Java Message Service är ett Java API som gör det möjligt för applikationer att skapa, skicka, ta emot och läsa meddelanden. JMS API definierar en gemensam uppsättning gränssnitt och tillhörande semantik som tillåter program skrivna på Java-programmeringsspråket att kommunicera med andra meddelandenimplementeringar. JMS möjliggör kommunikation som inte bara är löst kopplad utan också asynkron och pålitlig.

Anmärkningar

Java Message Service (JMS) är ett standard Java API som gör att applikationer kan skapa, skicka, ta emot och läsa meddelanden asynkront.

JMS definierar den allmänna uppsättningen gränssnitt och klasser som tillåter applikationer att interagera med andra meddelandeleverantörer.

JMS liknar JDBC: JDBC ansluter till olika databaser (Derby, MySQL, Oracle, DB2 etc.) och JMS ansluter till olika leverantörer (OpenMQ, MQSeries, SonicMQ och så vidare).

JMS-referensimplementering är Open Message Queue (OpenMQ). Det är öppen källkodsprojekt och kan användas i fristående applikationer eller kan byggas i applikationsserver. Det är standardleverantören för JMS som är integrerad i GlassFish.

Skapa ConnectionFactory

Anslutningsfabriker är de hanterade objekten som gör att applikationen kan ansluta till leverantören genom att skapa Connection . javax.jms.ConnectionFactory är ett gränssnitt som kapslar konfigurationsparametrar definierade av en administratör.

För att använda ConnectionFactory måste klienten utföra JNDI-uppslag (eller använda injektion). Följande kod får JNDI InitialContext objekt och använder det för att leta efter ConnectionFactory objekt under JNDI-namn:

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

Metoderna som finns tillgängliga i detta gränssnitt är createConnection() som returnerar ett Connection och nya JMS 2.0 createContext() -metoder som returnerar en JMSContext .

Det är möjligt att skapa en Connection eller en JMSContext antingen med standardanvändaridentiteten eller genom att ange ett användarnamn och lösenord:

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

Använda ActiveMQ-bibliotek för meddelanden (Activemq jms-leverantörsspecifika implementationer)

Ställ in ActiveMQ

  • Ladda ner en ActiveMQ-distribution från activemq.apache.org och packa upp den någonstans
  • Du kan starta servern omedelbart, utan säkerhet på localhost med skriptfacket / activemq
  • När den körs kan du komma åt din lokala serverns konsol på http: // localhost: 8161 / admin /
  • Konfigurera det genom att ändra conf / activemq.xml
  • Som titeln föreslår följande exempel måste användaraktivemq jms-leverantörsspecifika implementationer och därmed activemq-all.jar läggas till klassvägen.

Skickar ett meddelande via fristående klient

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

Fråga efter meddelanden

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

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

Använda jndi-baserad uppslagning för meddelanden (Ej implementeringsspecifikt exempel)

Denna metod tillåter att icke-implementeringsspecifik kod kan skrivas och distribueras över flera jms-plattformar. Nedanstående grundexempel ansluter till activemq jms-server och skickar ett meddelande.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow