2011-08-26 101 views
0

我试图从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 但它似乎并没有工作。从远程GlassFish服务器接收JMS消息

我已经创建了用于测试的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提供程序。

+1

更新:如果我在与GlassFish相同的机器上运行我的客户端并使用iiop://127.0.0.1:3700,它可以工作,所以代码似乎是正确的,但我不知道需要做什么为了让它远程工作。 – Petter

+0

实际上,只有当我在GlassFish下以Web应用程序的形式运行时,它才能正常工作,即使在同一台计算机上,作为独立应用程序运行也不起作用。 – Petter

+0

使用IMQAdmin工具可以确认您的队列是否真的收到了消息? \ glassfish \ imq \ bin \ imqadmin.exe – Preston

回答

0

好吧,我找到了一个解决方案,这并不是很理想,但它很有效。

为了做到这一点,我需要在远程机器上运行一个额外的GlassFish实例。在这个实例中,我必须对JMS设置(配置 - > Java消息服务)进行一些更改,我必须将类型设置为REMOTE,并且必须将default_JMS_Host更改为使用其他GlassFish实例的IP地址。

我可以运行上面的代码作为一个Web应用程序,并接收消息按预期工作。如果我希望它作为独立应用程序运行,仍然不知道如何使其工作。

+0

可能你想使用'appclient'从客户机运行。它将加载JAR,注入等,并将消息发送到另一台机器。 – Thufir

0

如果先设置消息侦听器,会发生什么? (也可以使用相同的实例)

queueReceiver.setMessageListener(this); 
queueConnection.start(); 

奥赖利有一些在线的例子,这个人是有主题的,但不应该是很难比较/适应:

http://onjava.com/pub/a/onjava/excerpt/jms_ch2/index.html?page=2

+0

它似乎没有帮助改变顺序,或使用“this”,但我会看看例子,谢谢! – Petter