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