【发布时间】:2010-11-22 16:23:16
【问题描述】:
据我了解,J2EE 容器需要包含 JMS 提供程序。独立的 Java 应用程序是否可以将消息发送到容器提供的 JMS 队列?如果是这样,我如何从容器外部访问 JNDI 查找?
(如果有什么不同,我会在 Geronimo 上尝试这个,但我希望有一个标准的方法来做到这一点。)
【问题讨论】:
标签: java jakarta-ee jms
据我了解,J2EE 容器需要包含 JMS 提供程序。独立的 Java 应用程序是否可以将消息发送到容器提供的 JMS 队列?如果是这样,我如何从容器外部访问 JNDI 查找?
(如果有什么不同,我会在 Geronimo 上尝试这个,但我希望有一个标准的方法来做到这一点。)
【问题讨论】:
标签: java jakarta-ee jms
您可以这样做,并且可能有多种方法,具体取决于访问队列的瘦客户端。 @pjp 给出的示例将为您提供用于访问相关服务器的正确 jar 文件,包括将为您的应用程序提供 JNDI 实例的 jar 文件。这些 jars 应该由供应商提供,并且可能包含有关如何在不使用 JNDI 的情况下进行连接的说明。虽然我认为 JNDI 方法是最简单的,并且在服务器内外保持编码一致。
每个供应商都有不同的 jar 来提供客户端访问,在 IBM 的情况下,对于内部 JMS 提供者和 WebSphere MQ,它们是不同的(因为它们是两种不同的实现)。
【讨论】:
您应该能够在 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);
}
}
}
【讨论】:
您可以在没有应用程序服务器的情况下将消息放置在 JMS 队列中。
但是,您需要知道如何直接访问 JMS 提供程序 -- 不使用 JNDI,因为它是由 JavaEE 应用程序服务器提供的。
【讨论】: