簡體   English   中英

從遠程GlassFish服務器接收JMS消息

[英]Receiving JMS messages from remote GlassFish server

我正在嘗試從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提供程序。

如果首先設置消息監聽器,會發生什么? (此外,您可以使用相同的實例)

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

O'Reilly在線提供了一些示例,其中有一些主題,但是比較/適應起來應該不難:

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

好的,我找到了解決方案,雖然這不是很理想,但是可以用。

為了使此工作有效,我需要在遠程計算機上運行的GlassFish的其他實例。 在此實例上,我必須在JMS設置(配置-> Java消息服務)中進行一些更改,將類型設置為REMOTE,並且必須更改default_JMS_Host以使用其他GlassFish實例的IP地址。

然后,我可以將上述代碼作為Web應用程序運行,並按預期方式接收消息。 如果我希望它作為獨立的應用程序運行,仍然不知道如何使它工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM