【问题标题】:Can I send messages to a JMS queue from outside the app server?我可以从应用服务器外部向 JMS 队列发送消息吗?
【发布时间】:2010-11-22 16:23:16
【问题描述】:

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

(如果有什么不同,我会在 Geronimo 上尝试这个,但我希望有一个标准的方法来做到这一点。)

【问题讨论】:

    标签: java jakarta-ee jms


    【解决方案1】:

    您可以这样做,并且可能有多种方法,具体取决于访问队列的瘦客户端。 @pjp 给出的示例将为您提供用于访问相关服务器的正确 jar 文件,包括将为您的应用程序提供 JNDI 实例的 jar 文件。这些 jars 应该由供应商提供,并且可能包含有关如何在不使用 JNDI 的情况下进行连接的说明。虽然我认为 JNDI 方法是最简单的,并且在服务器内外保持编码一致。

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

    【讨论】:

      【解决方案2】:

      您应该能够在 Geronimo 中创建一个使用 JNDI 服务器的 InitialContext。然后,您可以使用它来查找您的 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);
               }
           }
      }
      

      【讨论】:

      • 您可能需要补充一点,这假设您有一个本地 JNDI 正在运行。
      【解决方案3】:

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

      但是,您需要知道如何直接访问 JMS 提供程序 -- 不使用 JNDI,因为它是由 JavaEE 应用程序服务器提供的。

      【讨论】:

        猜你喜欢
        • 2014-02-02
        • 2013-05-22
        • 2013-10-27
        • 2012-02-05
        • 1970-01-01
        • 2015-08-25
        • 2020-04-05
        • 1970-01-01
        • 2021-07-16
        相关资源
        最近更新 更多