代码之家  ›  专栏  ›  技术社区  ›  Simon Nickerson

我可以从应用服务器外部向JMS队列发送消息吗?

  •  7
  • Simon Nickerson  · 技术社区  · 16 年前

    据我所知,J2EE容器需要包含JMS提供程序。独立的Java应用程序可以将消息发送到容器提供的JMS队列吗?如果是,如何从容器外部访问JNDI查找?

    (如果这有什么不同的话,我正在和Geronimo一起尝试,但是我希望有一种标准的方法来实现这一点。)

    3 回复  |  直到 16 年前
        1
  •  5
  •   pjp    16 年前

    您应该能够创建 初始上下文 使用 JNDI公司 Geronimo中的服务器。然后,您可以使用它来查找JMS连接工厂和队列。

    以下示例改编自 http://forums.sun.com/thread.jspa?threadID=5283256 使用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);
             }
         }
    }
    
        2
  •  0
  •   dustmachine    16 年前

    您可以在没有应用程序服务器的情况下将消息放入JMS队列。

    但是,您需要知道如何直接访问JMS提供者——而不使用JNDI,因为这是由JavaEE应用服务器提供的。

        3
  •  0
  •   Robin    16 年前

    您可以这样做,根据访问队列的瘦客户机,可能有多种方法。@pjp给出的示例将起作用,前提是您具有访问相关服务器的正确JAR文件,包括一个JAR,它将为您的应用程序提供一个JNDI实例。这些JAR应该由供应商提供,并且可能包括关于如何在不使用JNDI的情况下进行连接的说明。尽管我认为JNDI方法是最简单的,并且在服务器上和服务器外都保持一致的编码。

    每个供应商都有不同的JAR来提供客户机访问,在IBM的情况下,对于内部JMS提供程序和WebSphere MQ,它们是不同的(因为它们是两种不同的实现)。

    推荐文章