Я пытаюсь получать сообщения JMS с сервера GlassFish (2.1) удаленно.Я следовал инструкциям здесь: 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 и образец-очередь очереди для тестирования,
Я использую следующий код для отправки сообщения:
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);
}
}
}
Кажется, что он может подключитьсяправильно, потому что я добавил некоторые записи, чтобы увидеть, были ли очередь и фабрика в порядке, и они есть.И если я изменяю имя очереди или фабрики, я получаю сообщение об ошибке, так что оно работает, как и ожидалось.
Что не работает, так это фактический прием сообщений.Кажется, что они отправлены нормально, но они никогда не доходят до клиента.
Есть ли у кого-нибудь идеи относительно того, что может быть не так?
Спасибо!
Редактировать:О, и я использую встроенный в JMS провайдер GlassFish.