6.3. 接收消息
这个示例首先创建一个 JNDI 上下文,使用它查找 ConnectionFactory
和 Destination
,使用工厂创建并启动 Connection
,然后创建一个 Session
。然后为 Destination
创建 MessageConsumer
,会收到一条信息,其内容将输出到控制台。然后,连接关闭,程序退出。在发送示例中 使用相同的 JNDI 配置。
这个 Receiver
示例的可执行变体包含在客户端分发的示例目录中,以及前面在 第 3 章 入门 中使用的 Hello World 示例。
示例:接收消息
package org.jboss.amq.example; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.ExceptionListener; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.MessageConsumer; import javax.jms.Session; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; public class Receiver { public static void main(String[] args) throws Exception { try { Context context = new InitialContext(); 1 ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup"); Destination destination = (Destination) context.lookup("myDestinationLookup"); 2 Connection connection = factory.createConnection("<username>", "<password>"); connection.setExceptionListener(new MyExceptionListener()); connection.start(); 3 Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 4 MessageConsumer messageConsumer = session.createConsumer(destination); 5 Message message = messageConsumer.receive(5000); 6 if (message == null) { 7 System.out.println("A message was not received within given time."); } else { System.out.println("Received message: " + ((TextMessage) message).getText()); } connection.close(); 8 } catch (Exception exp) { System.out.println("Caught exception, exiting."); exp.printStackTrace(System.out); System.exit(1); } } private static class MyExceptionListener implements ExceptionListener { @Override public void onException(JMSException exception) { System.out.println("Connection ExceptionListener fired, exiting."); exception.printStackTrace(System.out); System.exit(1); } } }
- 1
- 2
ConnectionFactory
和Destination
对象使用它们的查找名称从 JNDIContext
检索。- 3
- 该工厂用于创建
Connection
,然后注册ExceptionListener
,然后启动。创建连接时提供的凭据通常从适当的外部配置源获取,确保它们与应用本身保持独立,并可独立更新。 - 4
- 在
Connection
上创建一个未翻译的、自动确认的Session
。 - 5
MessageConsumer
创建用于接收来自Destination
的信息。- 6
- 调用接收消息时会发出五秒超时。
- 7
- 将检查结果,如果收到消息,则打印其内容,或注意未收到任何消息。结果会显式转换为
TextMessage
,这就是我们知道Sender
发送的内容。 - 8
Connection
已关闭。Session
和MessageConsumer
隐式关闭。
请注意,这只是一个示例。现实应用程序通常会使用长期存在的 MessageConsumer
,并随着时间推移接收许多使用它的信息。打开并关闭每个消息的 Connection
、Session
和 MessageConsumer
通常并不高效。