据我了解,J2EE容器需要包含JMS提供者。独立的Java应用程序是否可以将消息发送到容器提供的JMS队列?如果是这样,我如何从容器外部访问JNDI查找?我可以从应用程序服务器外部向JMS队列发送消息吗?
(我与Geronimo想这一点,如果这有什么差别,但我希望有这样做的标准方式。)
据我了解,J2EE容器需要包含JMS提供者。独立的Java应用程序是否可以将消息发送到容器提供的JMS队列?如果是这样,我如何从容器外部访问JNDI查找?我可以从应用程序服务器外部向JMS队列发送消息吗?
(我与Geronimo想这一点,如果这有什么差别,但我希望有这样做的标准方式。)
您应该能够创建一个使用Geronimo中的JNDI服务器的InitialContext。然后,您可以使用它来查找JMS连接工厂和队列。
以下示例已从http://forums.sun.com/thread.jspa?threadID=5283256改编为使用Geronimo JNDI Factory。
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应用程序服务器提供的。
你可以做到这一点,并有可能因瘦客户机正在访问队列的多种方式。 @pjp给出的例子可以提供你正确的jar文件来访问相关的服务器,包括一个jar,它将为你的应用程序提供一个JNDI实例。这些罐子应由供应商提供,并且可能包含有关如何在不使用JNDI的情况下进行连接的说明。尽管我认为JNDI方法是最简单的,并且在服务器上和服务器上保持编码一致。在IBM的情况下,对于内部JMS提供者和WebSphere MQ(因为它们是两种不同的实现),每个供应商都会有不同的jar来提供客户端访问。
您可能想补充一点,假设您已经运行了本地JNDI。 – Robin 2009-08-25 18:54:59