Java 关闭到RabbitMQ的连接
我创建了一个简单的控制台应用程序,用于监听Rabbit MQ上的消息。很好。没问题。但我如何关闭连接。我在谷歌搜索了很多次,但没有找到任何明确的答案。我得到的最接近答案是这样一个问题:,但答案忽略了最重要的部分:代码 这是我的密码:Java 关闭到RabbitMQ的连接,java,rabbitmq,Java,Rabbitmq,我创建了一个简单的控制台应用程序,用于监听Rabbit MQ上的消息。很好。没问题。但我如何关闭连接。我在谷歌搜索了很多次,但没有找到任何明确的答案。我得到的最接近答案是这样一个问题:,但答案忽略了最重要的部分:代码 这是我的密码: package com.company; import com.rabbitmq.client.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; i
package com.company;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeoutException;
interface ObjectRecievedListener {
void objectRecieved(Object obj);
}
public class RabbitMQReceiver extends RabbitMQBase
{
ArrayList<DefaultConsumer> consumers = new ArrayList<>();
private List<ObjectRecievedListener> listeners = new ArrayList<>();
private final Connection connection;
private final Channel channel;
public RabbitMQReceiver(RabbitMQProperties properties) throws IOException, TimeoutException {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost(properties.getHost());
factory.setPassword(properties.getPassword());
factory.setUsername(properties.getLogin());
connection = factory.newConnection();
channel = connection.createChannel();
channel.queueDeclare(properties.getInboundQueueName(), true, false, false, null);
channel.basicQos(1);
final Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String message = new String(body, "UTF-8");
try {
doWork(message);
} finally {
channel.basicAck(envelope.getDeliveryTag(), false);
}
}
};
consumers.add((DefaultConsumer) consumer);
boolean autoAck = false;
channel.basicConsume(properties.getInboundQueueName(), autoAck, consumer);
}
public void addListener(ObjectRecievedListener listener) {
listeners.add(listener);
}
public void stop() {
try {
channel.close();
connection.close();
} catch (Exception e) {
}
}
private void doWork(String message) {
Object obj = getObjectFromXML(message);
for (ObjectRecievedListener l : listeners)
l.objectRecieved(obj);
stop();
}
}
package.com公司;
导入com.rabbitmq.client.*;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.concurrent.TimeoutException;
接口对象ReceivedListener{
收到的无效对象(对象对象);
}
公共类RabbitMQReceiver扩展RabbitMQBase
{
ArrayList使用者=新的ArrayList();
私有列表侦听器=新的ArrayList();
专用终端连接;
专用最终通道;
公共RabbitMQReceiver(RabbitMQProperties属性)引发IOException、TimeoutException{
ConnectionFactory工厂=新的ConnectionFactory();
setHost(properties.getHost());
setPassword(properties.getPassword());
setUsername(properties.getLogin());
connection=factory.newConnection();
channel=connection.createChannel();
channel.queueDeclare(properties.getInboundQueueName(),true、false、false、null);
基本频道(1);
最终消费者=新的默认消费者(渠道){
@凌驾
public void handleDelivery(字符串consumerTag、信封信封、AMQP.BasicProperties属性、字节[]正文)引发IOException{
字符串消息=新字符串(正文,“UTF-8”);
试一试{
道具(信息);
}最后{
channel.basicAck(envelope.getDeliveryTag(),false);
}
}
};
consumers.add((DefaultConsumer)consumer);
布尔自动确认=假;
channel.basicConsume(properties.getInboundQueueName(),autoAck,consumer);
}
public void addListener(objectReceivedListener侦听器){
添加(侦听器);
}
公共停车场(){
试一试{
channel.close();
connection.close();
}捕获(例外e){
}
}
专用void doWork(字符串消息){
Object obj=getObjectFromXML(消息);
for(ObjectReceivedListener l:侦听器)
l、 接收的对象(obj);
停止();
}
}
但它并不是因为我调用了stop()
简而言之:如何关闭与Rabbit MQ的连接?试试这个:
let connection = null;
connection = await amqp.connect(`amqp://${config.username}:${config.password}@${config.host}:${config.port}`);
connection.close();
RabbitMQ团队监视并仅有时回答有关StackOverflow的问题
当您说“它不停止”时,您是否确认实际调用了
stop()
方法?您的代码是否挂在某个close()
方法上
channel
实例将有一个实例,您可以在关闭频道和连接之前调用该实例以取消当前消费者。老实说,关闭频道将取消您的消费者,因此我怀疑这是问题的根本原因。这是JavaScript