2010-01-21 51 views
0

我有一组参数需要用来访问JMS队列。基本的JMS查询

任何人都可以提供一个基本的例子,说明如何使用这些参数将XML块发送到等待服务器。对于这个初始版本,我不介意对这些参数进行硬编码。

我目前正在此:

Context ctx = new InitialContext(); 
QueueConnectionFactory queueConnectionFactory = (QueueConnectionFactory) ctx.lookup("QueueConnectionFactory"); 
Queue queue = (Queue) ctx.lookup("OCP.GET.PRODUCTS.COMSRV"); 
QueueConnection queueConnection = queueConnectionFactory.createQueueConnection(); 
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE); 
QueueSender queueSender = queueSession.createSender(queue); 
TextMessage message = queueSession.createTextMessage(); 
message.setText(xmlString); 

但我不知道如何设置参数主机,端口的QueueManager或通道

提供给我的参数是

  • 管理人:OCP.QMGR
  • 频道:OCP.SVRCONN
  • 端口:14234
  • 主持人:host.server.com
  • sentToQueue:OCP.GET.PRODUCTS.COMSRV
  • replyToQueue:COMSRV.GET.PRODUCTS.OCP

我很新到Java和JMS,并开始淹没与此。

+0

什么是监听主机:端口?你的JMS提供商是什么?你在使用MQ系列吗? – 2010-01-21 10:58:36

+0

我被告知我应该使用javax.jms ...有帮助吗? – Xetius 2010-01-21 11:41:04

+0

不,至少不是我(因为你提到的概念不是JMS的一部分)。 – 2010-01-21 11:59:06

回答

4

我的理解是,您正尝试连接到MQSeries(QueueManager和Channel是MQ概念,不属于JMS API AFAIK),所以我认为您必须使用MQ特定的客户端API。我真的不是一个MQ专家,但似乎以下(见Implementing vendor-independent JMS solutions)的代码是接近你所寻找的:

MQQueueConnectionFactory qconFactory = new MQQueueConnectionFactory(); 
qconFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); //Used when the MQSeries server is on a different host from the client 
qconFactory.setQueueManager(queueManager); 
qconFactory.setHostName(hostName); 
qconFactory.setPort(port); 
qconFactory.setChannel(channel); 
connection = qconFactory.createQueueConnection(); 
session1 = connection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);..... 

正如我所说的,我不是一个MQ专家,但MQQueueConnectionFactory似乎要了解你正在谈论的大部分事情。


侧面说明:

使用JNDI,你需要建立像初始上下文工厂提供商URL JNDI环境属性。基本上,这些属性用于声明创建初始上下文以及在哪里找到JNDI服务器的类。显然,这些属性的值取决于您要连接的JNDI服务。

您可以通过使用非空InitialContext constructor并将environment参数传递给它来指定环境属性。例如连接到BEA WebLogic JNDI服务:

Properties p = new Properties(); 
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); 
p.put(Context.PROVIDER_URL,"t3://myhost:7001"); 
ctx = new InitialContext(p); 

或者你可以提供一个jndi.properties文件,并使用无参InitialContext constructor。例如,要连接到的IBM WebSphere JNDI服务,你会放一个jndi.properties文件,在类路径中包含以下内容:

java.naming.provider.url=iiop://myhost:9001 
java.naming.factory.initial=com.ibm.websphere.naming.WsnInitialContextFactory 

第二种方法当然是更便携,你做的不硬编码值Java代码中的参数(尽管这可能不是问题)。因为你没有提供关于你的上下文的任何细节(比如应用服务器或者JMS提供者或者你的上下文),所以我不能告诉你是否需要这个(甚至更少使用什么值)您尝试连接的消息传递解决方案)。

+0

非常好的答案,你解释了两种方法。可能希望添加运行,因为瘦客户机将需要您提到的JNDI设置,以及来自供应商的支持JAR。 – Robin 2010-01-21 14:09:43