我正在尝试远程从GlassFish(2.1)服务器接收JMS消息。我已按照此处的说明操作:http://www.tidytutorials.com/2009/06/jms-example-using-glassfish-and-remote.html以及此处:http://www.novell.com/documentation/extend52/Docs/help/MP/jms/tutorial/pointToPoint-1.htm 但它似乎不起作用。
我已经创建了QueueConnectionFactory sampleFactory和Queue sampleQueue进行测试。
我使用以下代码发送消息:
HashMap<String,List<String>> values = getValues();
InitialContext context = new InitialContext();
QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup("sampleFactory");
Queue queue = (Queue) context.lookup("sampleQueue");
queueConnection = factory.createQueueConnection();
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
queueSender = queueSession.createSender(queue);
ObjectMessage message = queueSession.createObjectMessage();
message.setObject(values);
queueSender.send(message);
我的客户正在使用以下代码:
class JMSListener implements Runnable, MessageListener {
....
public void run() {
try {
System.out.println("Started JMS Listener");
Properties props = new Properties();
props.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.appserv.naming.S1ASCtxFactory");
props.put(Context.PROVIDER_URL,"iiop://192.168.38.164:3700");
Context ctx = new InitialContext(props);
Queue queue = (Queue) ctx.lookup("sampleQueue");
QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ctx.lookup("sampleFactory");
QueueConnection queueConnection = connectionFactory.createQueueConnection();
QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueReceiver queueReceiver = queueSession.createReceiver(queue);
queueConnection.start();
queueReceiver.setMessageListener(new JMSListener());
while (true) {
if(!Thread.currentThread().equals(runner)) break;
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {
Logger.getLogger(JMSListenerRemote.class.getName()).log(Level.SEVERE, null, ex);
}
}
System.out.println("CLOSING!");
// Don't leak
queueConnection.close();
} catch (NamingException ex) {
Logger.getLogger(Listener.class.getName()).log(Level.SEVERE, null, ex);
} catch (JMSException ex) {
Logger.getLogger(Listener.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void onMessage(Message message) {
System.out.println("Got a message!");
try {
ObjectMessage obj = (ObjectMessage) message;
HashMap<String, List<String>> values = (HashMap<String, List<String>>) obj.getObject();
for (Entry<String, List<String>> entry : values.entrySet()) {
System.out.println("Got key: "+entry.getKey());
}
} catch (JMSException ex) {
Logger.getLogger(Listener.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
它似乎能够正确连接,因为我添加了一些日志记录,以查看队列和工厂是否都正常,它们是。如果我更改队列或工厂的名称,我会收到错误,因此按预期工作。
但不起作用的是实际接收消息。他们似乎被发送出去了,但他们从未接触过客户。
是否有人对可能出现的问题有任何想法?
谢谢!
编辑:哦,我正在使用GlassFish内置的JMS提供程序。
答案 0 :(得分:0)
如果先设置消息监听器会怎样? (另外,你可以使用相同的实例)
queueReceiver.setMessageListener(this);
queueConnection.start();
O'Reilly在线有一些例子,这个是主题,但不应该那么难以比较/适应:
http://onjava.com/pub/a/onjava/excerpt/jms_ch2/index.html?page=2
答案 1 :(得分:0)
好的,我找到了一个解决方案,这不是很理想,但它确实有效。
为了完成这项工作,我需要在远程计算机上运行另一个GlassFish实例。在这个例子中,我不得不在JMS设置(配置 - &gt; Java消息服务)中进行一些更改,我必须将类型设置为REMOTE,并且我必须更改default_JMS_Host以使用另一个GlassFish实例的IP地址。
然后,我可以将上述代码作为Web应用程序运行,并按预期接收消息。如果我希望它作为一个独立的应用程序运行,仍然不知道如何使它工作。