【发布时间】:2020-09-21 15:06:15
【问题描述】:
我正在编写一个简单的 java 程序来创建一个 JMSConsumer。我希望消费者等到生产者发布一些东西,然后主程序终止。这是我的主要内容:
JMSContext context;
Destination destination;
JMSConsumer consumer;
JmsConnectionFactory connectionFactory = createJMSConnectionFactory();
setJMSProperties(connectionFactory);
System.out.println("MQ Test: Connecting to " + HOST + ", Port " + PORT + ", Channel " + CHANNEL
+ ", Connecting to " + QUEUE_NAME);
try {
context = connectionFactory.createContext();
destination = context.createQueue("queue:///" + QUEUE_NAME);
consumer = context.createConsumer(destination);
MessageListener ml = new DemoMessageListener();
consumer.setMessageListener(ml);
System.out.println("The message listener is running."); // (Because the connection is started by default)
context.start();
} catch (Exception e){}
问题是当程序到达main的底部时,程序就结束了。
我试图获得的结果类似于 RabbitMq 的 basicConsuime(下面的示例):
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
String queueName = channel.queueDeclare().getQueue();
channel.queueBind(queueName, EXCHANGE_NAME, "");
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });
}
当main结束时,读取消息的线程还活着,每次向队列发送消息时都会调用deliverCallback。
有什么想法吗?
【问题讨论】:
-
您实际上想在这里实现什么?如果您的程序只有一个线程,则根本不需要使用
MessageListener——只需在循环中调用receive()即可获取每条消息。或者只是在main()的末尾加上一个长的Thread.sleep()。很难知道该建议什么,因为我不知道您希望程序如何运行。