6.3. 接收信息
本例首先创建一个 JNDI 上下文,使用它来查找 ConnectionFactory 和 Destination,使用工厂创建和启动 连接,然后创建一个 Session。然后,为 Destination 创建一个 MessageConsumer,使用它收到一条消息,其内容会输出到控制台。然后,连接关闭,程序会退出。相同的 JNDI 配置与 发送示例 中相同。
此 Receiver 示例的一个可执行变体包含在客户端分发的示例目录中,以及之前在 第 3 章 开始使用 中涵盖的 Hello World 示例。
示例:接收信息
package org.jboss.amq.example;
import jakarta.jms.Connection;
import jakarta.jms.ConnectionFactory;
import jakarta.jms.Destination;
import jakarta.jms.ExceptionListener;
import jakarta.jms.JMSException;
import jakarta.jms.Message;
import jakarta.jms.MessageConsumer;
import jakarta.jms.Session;
import jakarta.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();
ConnectionFactory factory = (ConnectionFactory) context.lookup("myFactoryLookup");
Destination destination = (Destination) context.lookup("myDestinationLookup");
Connection connection = factory.createConnection("<username>", "<password>");
connection.setExceptionListener(new MyExceptionListener());
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer messageConsumer = session.createConsumer(destination);
Message message = messageConsumer.receive(5000);
if (message == null) {
System.out.println("A message was not received within given time.");
} else {
System.out.println("Received message: " + ((TextMessage) message).getText());
}
connection.close();
} 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对象利用其查找名称从 JNDI上下文检索。- 3
- 工厂用于创建
Connection,然后注册了ExceptionListener,然后启动。创建连接时给出的凭证通常来自适当的外部配置源,确保它们与应用程序本身保持独立,并可独立更新。 - 4
- 在连接上创建了非转换的
、自动确认会话。 - 5
- 创建
MessageConsumer以接收来自Destination的信息。 - 6
- 发出对接收消息的调用,显示 5 秒超时。
- 7
- 检查结果,如果收到了消息,则其内容会被打印或注意没有收到消息。结果明确发送到
TextMessage,因为这是我们知道发送者发送的内容。 - 8
连接关闭。Session和MessageConsumer被隐式关闭。
请注意,这只是一个示例。现实应用通常使用长期的 MessageConsumer,并随着时间的推移接收许多消息。打开然后关闭每个消息 和 的连接、会话MessageConsumer 通常效率较低。