Могу ли я отправлять сообщения в очередь JMS извне сервера приложений? - PullRequest
7 голосов
/ 25 августа 2009

Насколько я понимаю, J2EE-контейнер должен включать JMS-провайдера. Возможно ли для отдельного Java-приложения отправлять сообщения в очередь JMS, предоставляемую контейнером? Если да, то как мне получить доступ к поискам JNDI снаружи контейнера?

(Я пытаюсь сделать это с Geronimo, если это имеет какое-то значение, но я надеюсь, что есть стандартный способ сделать это.)

Ответы [ 3 ]

5 голосов
/ 25 августа 2009

Вы сможете создать InitialContext , который использует сервер JNDI в Geronimo. Затем вы можете использовать это для поиска вашей фабрики соединений JMS и очереди.

Следующий пример был адаптирован из http://forums.sun.com/thread.jspa?threadID=5283256 для использования Geronimo JNDI Factory.

Context                  jndiContext = null;
ConnectionFactory   connectionFactory = null;
Connection             connection = null;
Session                  session = null;
Queue                    queue = null;
MessageProducer     messageProducer = null;   

try
{
    //[1] Create a JNDI API InitialContext object.
    Hashtable properties = new Hashtable(2);

    // CHANGE these to match Geronimos JNDI service

    properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
    properties.put(Context.PROVIDER_URL, "ejbd://127.0.0.1:4201");
    jndiContext = new InitialContext(properties);

    //[2] Look up connection factory and queue.
    connectionFactory = (ConnectionFactory)jndiContext.lookup("jms/ConnectionFactory");
    queue = (Queue)jndiContext.lookup("jms/Queue");

    //[3]
    // - Create connection
    // - Create session from connection; false means session is not transacted.
    // - Create sender and text message.
    // - Send messages, varying text slightly.
    connection = connectionFactory.createConnection();
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    messageProducer = session.createProducer(queue);

   //send a message
   TextMessage message = session.createTextMessage(this.jTextSend.getText()); 
   messageProducer.send(message); 

   //example for send some object
   //ObjectMessage message = session.createObjectMessage();
   //MyObj myObj = new MyObj ("Name"); //this class must be serializable 
   //message.setObject(myObj );
   //messageProducer.send(message);
}
catch(Exception ex)
{
   LOG.error(ex);
}
finally
{
     if(connection !=null)
     {
         try
         {
             connection.close();
         }
         catch(JMSException e)
         {
              LOG.error(e);
         }
     }
}
0 голосов
/ 25 августа 2009

Вы можете сделать это, и может быть несколько способов, в зависимости от тонкого клиента, который обращается к очереди. Пример, приведенный @pjp, будет работать при условии, что у вас есть правильные файлы jar для доступа к рассматриваемому серверу, включая jar, который предоставит вашему приложению экземпляр JNDI. Эти файлы должны предоставляться поставщиком и могут включать инструкции о том, как подключиться без использования JNDI. Хотя я думаю, что метод JNDI является самым простым и поддерживает согласованность кодирования как на сервере, так и за его пределами.

У каждого поставщика будут разные jar-файлы для обеспечения клиентского доступа, в случае IBM они различаются для внутреннего JMS-провайдера и для WebSphere MQ (поскольку они представляют собой две разные реализации).

0 голосов
/ 25 августа 2009

Вы можете помещать сообщения в очередь JMS без сервера приложений.

Однако вам нужно знать, как напрямую связаться с провайдером JMS - без использования JNDI, поскольку это обеспечивается сервером приложений JavaEE.

...