2009-08-25 6 views
7

Jak rozumiem, kontener J2EE jest wymagany, aby dołączyć dostawcę JMS. Czy samodzielna aplikacja Java może wysyłać wiadomości do kolejki JMS dostarczanej przez kontener? Jeśli tak, w jaki sposób uzyskać dostęp do odnośników JNDI spoza kontenera?Czy mogę wysyłać wiadomości do kolejki JMS spoza serwera aplikacji?

(próbuję to z Geronimo jeśli czyni żadnej różnicy, ale mam nadzieję, że nie jest to standardowy sposób to robi.)

Odpowiedz

5

Powinieneś być w stanie stworzyć InitialContext który używa serwer JNDI w Geronimo. Możesz użyć tego do sprawdzenia fabryki połączeń JMS i kolejki.

Poniższy przykład został zaadaptowany z http://forums.sun.com/thread.jspa?threadID=5283256 do korzystania z fabryki Geronimo JNDI.

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

Możesz dodać, że to zakłada, że ​​masz uruchomiony lokalny JNDI. – Robin

0

można umieszczać wiadomości w kolejce JMS bez serwera aplikacji.

Musisz jednak wiedzieć, jak uzyskać bezpośredni dostęp do dostawcy JMS - bez korzystania z JNDI, ponieważ jest on dostarczany przez serwer aplikacji JavaEE.

0

Możesz to zrobić i może być wiele sposobów w zależności od cienkiego klienta, który uzyskuje dostęp do kolejki. Przykład podany przez @pjp będzie działał pod warunkiem, że masz odpowiednie pliki jar, aby uzyskać dostęp do danego serwera, w tym słoik, który dostarczy twoją aplikację z instancją JNDI. Te słoiki powinny być dostarczone przez sprzedawcę i mogą zawierać instrukcje dotyczące łączenia bez użycia JNDI. Chociaż myślę, że metoda JNDI jest najprostsza i utrzymuje kodowanie spójne zarówno na serwerze, jak i poza nim.

Każdy sprzedawca będzie miał inne słoiki zapewniające dostęp klienta, w przypadku IBM są one inne dla wewnętrznego dostawcy JMS względem produktu WebSphere MQ (ponieważ są to dwie różne implementacje).