![](/img/trans.png)
[英]How to use Java JMS Authentication only on ConnectionFactory
[英]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 。 無論您使用哪種客戶端版本,請務必使用相應的信息中心。
最后,帶有所有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,但我可以指出一些我自己用來學習它的資源:
這很常見。 這是一些例子。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.