java-ee
जावा मैसेजिंग सर्विस (JMS)
खोज…
परिचय
जावा संदेश सेवा एक जावा एपीआई है जो अनुप्रयोगों को संदेश बनाने, भेजने, प्राप्त करने और पढ़ने के लिए अनुमति देता है। जेएमएस एपीआई इंटरफेस और संबंधित शब्दार्थों के एक सामान्य समूह को परिभाषित करता है जो जावा प्रोग्रामिंग भाषा में लिखे गए कार्यक्रमों को अन्य संदेशवाहकों के साथ संवाद करने की अनुमति देता है। जेएमएस संचार को सक्षम बनाता है जो न केवल शिथिल है बल्कि अतुल्यकालिक और विश्वसनीय भी है।
टिप्पणियों
जावा संदेश सेवा (JMS) एक मानक जावा एपीआई है जो एप्लिकेशन को अतुल्यकालिक रूप से संदेश बनाने, भेजने, प्राप्त करने और पढ़ने की अनुमति देता है।
जेएमएस इंटरफेस और वर्गों के सामान्य सेट को परिभाषित करता है जो अनुप्रयोगों को अन्य संदेश प्रदाताओं के साथ बातचीत करने की अनुमति देता है।
JMS JDBC के समान है: JDBC विभिन्न डेटाबेस (डर्बी, MySQL, Oracle, DB2 आदि) से जुड़ता है और JMS विभिन्न प्रदाताओं (OpenMQ, MQSeries, SonicMQ और इसी तरह) से जुड़ता है।
JMS संदर्भ कार्यान्वयन ओपन मैसेज क्यू (OpenMQ) है। यह ओपन सोर्स प्रोजेक्ट है और इसे स्टैंडअलोन एप्लिकेशन में इस्तेमाल किया जा सकता है या एप्लिकेशन सर्वर में बनाया जा सकता है। यह डिफ़ॉल्ट JMS प्रदाता ग्लासफिश में एकीकृत है।
कनेक्शन बनाना
कनेक्शन कारखाने प्रबंधित ऑब्जेक्ट हैं जो एप्लिकेशन को Connection
ऑब्जेक्ट बनाकर प्रदाता से कनेक्ट करने की अनुमति देते हैं। javax.jms.ConnectionFactory
एक इंटरफ़ेस है जो किसी व्यवस्थापक द्वारा परिभाषित कॉन्फ़िगरेशन मापदंडों को javax.jms.ConnectionFactory
है।
ConnectionFactory
ग्राहक का उपयोग करने के लिए JNDI लुकअप (या इंजेक्शन का उपयोग करें) को निष्पादित करना चाहिए। निम्न कोड को JNDI InitialContext
ऑब्जेक्ट मिलता है और इसका उपयोग JNDI नाम के तहत ConnectionFactory
वस्तु की खोज के लिए करता है:
Context ctx = new InitialContext();
ConnectionFactory connectionFactory =
(ConnectionFactory) ctx.lookup("jms/javaee7/ConnectionFactory");
इस इंटरफ़ेस में उपलब्ध तरीके createConnection()
तरीके हैं जो एक Connection
ऑब्जेक्ट और नए JMS 2.0 createContext()
तरीके जो एक JMSContext
वापस JMSContext
।
डिफ़ॉल्ट उपयोगकर्ता पहचान के साथ या उपयोगकर्ता नाम और पासवर्ड निर्दिष्ट करके Connection
या JMSContext
बनाना संभव है:
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);
}
संदेश भेजने के लिए ActiveMQ पुस्तकालय का उपयोग करना (सक्रिय एमएमएस प्रदाता विशिष्ट कार्यान्वयन)
ActiveMQ सेटअप करें
- ActiveMQ वितरण को Activemq.apache.org से डाउनलोड करें और इसे कहीं अनपैक करें
- आप स्क्रिप्ट बिन / activemq का उपयोग करके, स्थानीयहोस्ट पर असुरक्षित चल रहे तुरंत सर्वर शुरू कर सकते हैं
- जब यह चल रहा हो, आप अपने स्थानीय सर्वर के कंसोल को http: // localhost: 8161 / admin / पर एक्सेस कर सकते हैं
- Conf / activemq.xml को संशोधित करके इसे कॉन्फ़िगर करें
- जैसा कि शीर्षक निम्नलिखित उदाहरणों से पता चलता है कि उपयोगकर्ता activemq jms प्रदाता विशिष्ट कार्यान्वयन और इसलिए activemq-all.jar को क्लासपाथ में जोड़ने की आवश्यकता है।
स्टैंडअलोन क्लाइंट के माध्यम से संदेश भेजना
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 */ }
}
}
}
}
संदेशों के लिए मतदान
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 */ }
}
}
}
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();
}
}
}
}
मैसेजिंग के लिए jndi आधारित लुकअप का उपयोग करना (गैर-कार्यान्वयन-विशिष्ट उदाहरण)
यह विधि गैर-कार्यान्वयन-विशिष्ट कोड को कई jms प्लेटफार्मों में लिखा और तैनात किया जा सकता है। बेसिक उदाहरण के नीचे Activemq jms सर्वर से जुड़ता है और एक संदेश भेजता है।
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();
}
}
}
}