JMS客户端独立Java程序

时间:2011-07-31 22:36:43

标签: java jms

我想使用独立的java程序来轮询和检索来自JMS队列的消息,而不是使用MDB。有可能吗?

如果是,是否可以分享任何示例/链接?感谢。

的问候,V

2 个答案:

答案 0 :(得分:5)

我同意Spring JMS很简单的其他响应(让你知道一点Spring,并拥有框架),但它也很简单,从普通的旧Java开始。只需在main中编写一些代码来设置ConnectionFactory,Connection和Session,例如见

http://download.oracle.com/javaee/1.4/tutorial/doc/JMS4.html

您可以从JNDI查找ConnectionFactory,也可以自己实例化特定于提供者的ConnectionFactory;例如对于WebSphere MQ,您可以编写如下内容:

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

(其他提供商可用,我只是不能把代码写在我的头顶:)然后标准JMS

Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue");
MessageConsumer c = s.createConsumer(q);

此时你有两个选择。您可以创建一个javax.jms.MessageListener实现并在MessageConsumer上设置它,或者如果您想要更直接的控制,您可以启动一个使用MessageConsumer进行get-with-wait的线程(receive(int timeout) )或没有等待获得(receiveNoWait())然后睡觉直到下一次接收。不要使用receive(),但这对JMS来说绝不是一个好主意。如果您需要多个轮询线程,则应检查JMS会话/使用者对象的并发限制。

如果您想要发生任何事情,请不要忘记在设置完成后调用Connection.start()

优点是你只需要类路径上的JMS提供者.jars,没有框架等。缺点是它比Spring更复杂,它提供了相当优雅的解决方案 - 注意这里有多少设置代码,相比之下春天将它全部抽象出来。真的取决于您的喜好,其他要求等。

答案 1 :(得分:3)

到目前为止,我知道使用JMS消息的最简单方法是使用Spring JMS。特别是,使用Spring JMS namespace,它可以很简单:

<jms:listener-container connection-factory="aJmsConnectionFactory">
    <jms:listener destination="someQueue" ref="theBeanToDelegateTo" method="theMethodToInvoke"/>
</jms:listener-container>

将消耗“someQueue”并将消息传递给名为“theBeanToDelegateTo”的bean,方法“theMethodToInvoke”,将消息转换为SimpleMessageConverter指定的Java类型。

编辑:我刚刚在github上创建了一个示例项目,它完全符合您的要求。在https://github.com/zzantozz/testbed/tree/master/basic-spring-jms浏览源代码或克隆并运行它:

git clone git://github.com/zzantozz/testbed.git tmp
cd tmp
mvn compile exec:java -Dexec.mainClass=rds.jms.Main -pl basic-spring-jms

总共有两个类 - 可能只有一个,但是两个感觉更干净 - 它处理启动和停止JMS代理和Spring容器。有一个主类可以启动并等待用户关闭它。当Spring启动时,它会启动一个开始发送JMS消息的bean。如上所述,还有一个Spring消息监听器,它使用消息并将它们传递给同一个bean,然后将它们打印到stdout。