java-ee
Java Messaging Service (JMS)
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();
}
}
}
}