我正在尝试开发一个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
你知道怎么做吗?或者你有任何教导我这样做的链接。
答案 0 :(得分:48)
这里的问题是要求“我的老板让我使用纯Java JMS(不是ibm.mq lib)来做到这一点。” JMS是一个规范,每个实现必须符合API和语义,但可以自由地在低级别做任何他们想做的事情。始终需要使用传输供应商提供的实现类。因此,如果使用WebSphere MQ作为传输,则需要使用IBM MQ JMS类来编写JMS应用程序。
也就是说,如果你坚持使用纯JMS API调用,你就可以插入任何传输供应商的类。当您获得原始帖子中提到的要求时,这通常是预期的。
有一篇文章准确描述了您要做的事情,名为 Running a standalone Java application on WebSphere MQ V6.0 它仅使用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索引的着陆页为here。
答案 1 :(得分:10)
使用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();
}
}
}
注意:替换配置值
答案 2 :(得分:9)
如果您不介意编写特定于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
答案 3 :(得分:3)
通常使用JMS,您可以通过它提供的任何配置机制在容器中定义QueueConnectionFactory
,然后将其添加到容器的JNDI注册表中。每个容器都有自己的方法(即Tomcat与WebSphere)。
如果要放弃JNDI,可以直接创建com.ibm.mq.jms.MQQueueConnectionFactory
的实例,并在其上设置主机名,端口,队列管理器和通道属性。然后,您可以像使用javax.jms.QueueConnectionFactory
实例一样使用该对象,因为它实现了它。
答案 4 :(得分:2)
我不能在一篇文章中教你JMS,但我可以指出一些我自己用来学习它的资源:
答案 5 :(得分:0)
这很常见。 Here是一些例子。