簡體   English   中英

如何將Java JMS與MQseries一起使用

[英]How to use Java JMS with MQseries

我正在嘗試開發一個JMS 獨立應用程序來讀取和寫入MQSeries上的Queue。 我的老板讓我使用純java JMS (不是ibm.mq lib)來做到這一點。

以下是進行jms連接所需的信息:

  mq.hostname=10.10.10.10
  mq.channel=API.CLIENTCHL
  mq.queueManager=MQPETAPI
  mq.port=1422

你知道怎么做嗎?或者你有任何鏈接教我這樣做。

這里的問題是要求“我的老板讓我使用純Java JMS(而不是ibm.mq lib)來做到這一點。” JMS是一個規范,每個實現必須符合API和語義,但可以自由地在低級別做任何他們想做的事情。 始終需要使用傳輸供應商提供的實現類。 因此,如果使用WebSphere MQ作為傳輸,則需要使用IBM MQ JMS類來編寫JMS應用程序。

也就是說,如果你堅持使用純JMS API調用,你就可以插入任何傳輸供應商的類。 當您獲得原始帖子中提到的要求時,通常會這樣做。

有一篇文章准確描述了您在WebSphere MQ V6.0上運行獨立Java應用程序的目的。它僅使用JMS API,並在本地文件系統(.bindings文件)中使用JNDI。 通過為另一個供應商交換IBM JMS類並使用他們的JNDI工具,您可以插入任何JMS傳輸,而無需使用此方法更改代碼。

如果您想在沒有JNDI的情況下執行相同的操作,請查看隨獲取Java類的MQ客戶機安裝提供的示例程序。 在UNIX / Linux系統中,這些在/opt/mqm/samp ,在Windows上,它們在install_dir/tools/jms/samples SimpleRequestor.java示例具有以下代碼,用於在沒有JNDI的情況下初始化連接工廠:

try {
  // Create a connection factory
  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "localhost");
  cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
  cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
  cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM1");

由於此方法不使用JNDI,因此您需要編寫不能跨傳輸供應商傳輸的代碼。 它特定於IBM WebSphere MQ。

如果您從某個地方抓取MQ jar並且沒有完整安裝(因此沒有樣本),您可以將其下載為SupportPac MQC7 下載是免費的。 通常,您應該使用最新的客戶端,即使使用后端級別的隊列管理器也是如此。 顯然,您沒有從V6 QMgr獲得V7功能,但V7客戶端中的JMS實現得到了很大改進,即使對於V6功能也是如此。 如果由於某種原因你真的必須使用V6客戶端,你可以下載它作為SupportPacMQC6 無論您使用哪種客戶端版本,請務必使用相應的信息中心。

V6信息中心
V7信息中心

最后,帶有所有SupportPac索引的登錄頁面就在這里

具有TextMessage的完整(同步)獨立JMS應用程序。
它特定於IBM WebSphere MQ。

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

public class JMSApplicationStandAlone {
    public static void main(String[] args) {
        try {
            /*MQ Configuration*/
            MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
            mqQueueConnectionFactory.setHostName("localhost");
            mqQueueConnectionFactory.setChannel("MQ.CHANNEL");//communications link
            mqQueueConnectionFactory.setPort(1416);
            mqQueueConnectionFactory.setQueueManager("QUEUE.MGR");//service provider 
            mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

            /*Create Connection */
            QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
            queueConnection.start();

            /*Create session */
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            /*Create response queue */
            Queue queue = queueSession.createQueue("QUEUE.RESPONSE");


            /*Create text message */
            TextMessage textMessage = queueSession.createTextMessage("put some message here");
            textMessage.setJMSReplyTo(queue);
            textMessage.setJMSType("mcd://xmlns");//message type
            textMessage.setJMSExpiration(2*1000);//message expiration
            textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

            /*Create sender queue */
            QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));
            queueSender.setTimeToLive(2*1000);
            queueSender.send(textMessage);

            /*After sending a message we get message id */
            System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
            String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


            /*Within the session we have to create queue reciver */
            QueueReceiver queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);


            /*Receive the message from*/
            Message message = queueReceiver.receive(60*1000);
            String responseMsg = ((TextMessage) message).getText();

            queueSender.close();
            queueReceiver.close();
            queueSession.close();
            queueConnection.close();


        } catch (JMSException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:替換配置值

如果您不介意編寫特定於WMQ的代碼,那么您可以這樣做

MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);

然后是通常的JMS資源

Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue"); // replace with real queue name
MessageProducer p = s.createProducer(q);

最后創建並發送一條消息

Message m = s.createTextMessage("Hello, World!);
p.send(m);

(我已經把它排在了我的頭頂,所以不能排除一個錯字,但它從根本上說是正確的)。 如果你真的應該使用'純JMS' - 即沒有特定於提供者的對象 - 那么你需要在JNDI中綁定一個MQConnectionFactory對象(看一下JMSAdmin工具,它在文檔中)然后查找它從你的應用程序,即

InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name

通常使用JMS,您可以通過它提供的任何配置機制在容器中定義QueueConnectionFactory ,然后將其添加到容器的JNDI注冊表中。 每個容器都有自己的方法(即Tomcat與WebSphere)。

如果要放棄JNDI,可以直接創建com.ibm.mq.jms.MQQueueConnectionFactory的實例,並在其上設置主機名,端口,隊列管理器和通道屬性。 然后,您可以像使用javax.jms.QueueConnectionFactory實例一樣使用該對象,因為它實現了它。

我不能在一篇文章中教你JMS,但我可以指出一些我自己用來學習它的資源:

  1. O'Reilly Java消息服務
  2. IBM Developerworks JMS教程 (更多MQSeries / Websphere MQ特定)
  3. Spring框架可以幫助您更有效地使用JMS,尤其是當您在J2EE應用服務器之外開發獨立應用程序時: Spring Java Message Service文檔

這很常見。 是一些例子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM