我正在尝试开发一个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
Run Code Online (Sandbox Code Playgroud)
你知道怎么做吗?或者你有任何链接教我这样做.
T.R*_*Rob 48
这里的问题是要求"我的老板让我使用纯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所在的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");
Run Code Online (Sandbox Code Playgroud)
由于此方法不使用JNDI,因此您需要编写不能跨传输供应商传输的代码.它特定于IBM WebSphere MQ.
如果您从某个地方抓取MQ jar并且没有完整安装(因此没有样本),您可以将其下载为SupportPac MQC7.下载是免费的.通常,您应该使用最新的客户端,即使使用后端级别的队列管理器也是如此.显然,您没有从V6 QMgr获得V7功能,但V7客户端中的JMS实现得到了很大改进,即使对于V6功能也是如此.如果由于某种原因你真的必须使用V6客户端,你可以下载它作为SupportPacMQC6.无论您使用哪种客户端版本,请务必使用相应的信息中心.
最后,带有所有SupportPac索引的登录页面就在这里.
Pre*_*raj 11
具有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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意:替换配置值
如果您不介意编写特定于WMQ的代码,那么您可以这样做
MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
Run Code Online (Sandbox Code Playgroud)
然后是通常的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);
Run Code Online (Sandbox Code Playgroud)
最后创建并发送一条消息
Message m = s.createTextMessage("Hello, World!);
p.send(m);
Run Code Online (Sandbox Code Playgroud)
(我已经把它排在了我的头顶,所以不能排除一个错字,但它从根本上说是正确的).如果你真的应该使用'纯JMS' - 即没有特定于提供者的对象 - 那么你需要在JNDI中绑定一个MQConnectionFactory对象(看一下JMSAdmin工具,它在文档中)然后查找它从你的应用程序,即
InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
91364 次 |
| 最近记录: |