Получение сообщений JMS с удаленного сервера GlassFish - PullRequest
0 голосов
/ 26 августа 2011

Я пытаюсь получать сообщения 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.

Ответы [ 2 ]

0 голосов
/ 29 августа 2011

ОК, я нашел решение, которое на самом деле не идеальное, но оно работает.

Чтобы сделать это, мне понадобился дополнительный экземпляр GlassFish, запущенный на удаленной машине.В этом случае мне пришлось внести некоторые изменения в настройки JMS (Конфигурация -> Служба сообщений Java), мне пришлось установить тип на REMOTE, и мне пришлось изменить default_JMS_Host, чтобы использовать IP-адрес другого экземпляра GlassFish.

Затем я мог запустить приведенный выше код как веб-приложение, и получение сообщений работало, как ожидалось.Все еще не знаю, как заставить это работать, если я хочу, чтобы это работало как отдельное приложение.

0 голосов
/ 26 августа 2011

Что произойдет, если вы сначала установите прослушиватель сообщений? (также вы можете использовать тот же экземпляр)

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

У О'Рейли есть несколько примеров в Интернете, на этот раз с темами, но их не так сложно сравнить / адаптировать:

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

...