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

Java 我可以从应用服务器外部向JMS队列发送消息吗?,java,jakarta-ee,jms,Java,Jakarta Ee,Jms,据我所知,J2EE容器需要包含JMS提供程序。独立Java应用程序是否可以向容器提供的JMS队列发送消息?如果是这样,我如何从容器外部访问JNDI查找 (如果Geronimo有什么不同的话,我会尝试使用它,但我希望有一种标准的方法来做到这一点。)您可以在没有应用服务器的情况下将消息放入JMS队列 但是,您需要知道如何直接访问JMS提供程序,而不使用JNDI,因为JNDI是由JavaEE应用服务器提供的。您应该能够创建一个使用Geronimo中的JNDI服务器的InitialContext。然后,

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


(如果Geronimo有什么不同的话,我会尝试使用它,但我希望有一种标准的方法来做到这一点。)

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


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

您应该能够创建一个使用Geronimo中的JNDI服务器的InitialContext。然后,您可以使用它来查找JMS连接工厂和队列

下面的示例改编自,以使用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);
         }
     }
}

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


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

您可能需要补充一点,这假设您有一个本地JNDI在运行。