繁体   English   中英

RabbitMQ 直接交换不消费消息

[英]RabbitMQ direct exchange is not consuming messages

编辑:编辑使其更通用

我有一个生产者线程想要使用 RabbitMQ 直接交换向 Java 中的消费者线程发送消息,但我的消费者没有收到菜。 下面是我的生产者用来发布消息的方法:

请注意, key是作为参数传递的,并在前面的 if-else 语句中确定为"key1""key2"字符串。

public void producerSend (Object object, String key) throws IOException, TimeoutException {
    
    String exchange = "directExchange";
    
    System.out.println("PRODUCER: Sent message);
    
    ConnectionFactory factory = new ConnectionFactory();
    byte[] byteArray = getByteArray(object);
    try (Connection con = factory.newConnection()){
        Channel chan = con.createChannel();
        chan.exchangeDeclare (exchange, BuiltinExchangeType.DIRECT);
        chan.basicPublish(exchange, key, null, byteArray);
    }
}

以下是我的消费者用来消费消息的方法:

public void consumerReceive() throws IOException, TimeoutException  {
String exchange = "directExchange";
String key = "key1";
    
    ConnectionFactory factory = new ConnectionFactory();
    try (Connection con = factory.newConnection()) {  // added a try clause 
    Channel chan = con.createChannel();
   chan.exchangeDeclare(exchange, "direct"); // direct exchange
    
    String queueName = chan.queueDeclare().getQueue();  
    chan.queueBind(queueName, exchange, key); 
    
    
    chan.basicConsume(queueName, true, (x, msg)->{
    byte[] byteArray = msg.getBody();
    try {
        Object object = (Object) deserialize(byteArray);
        System.out.println("CONSUMER: Received message. Bye!");
       
        
    } catch (Exception e) {}
    }, x->{}
    );
    }
}

请注意,我在为消费者创建新连接时添加了一个try clause ,因为有许多消费者(线程)不断创建以订购和获取消息,并且我希望他们只与生产者连接一次以获取消息,然后停止连接(消费者说再见)。

之前,当我没有添加try clause时,消费者能够收到消息并离开,但是当下一个消费者加入并等待他们的消息时,生产者最终将消息发送给之前的所有消费者收到他们的消息,因为与以前的消费者的连接仍然打开。 这就是为什么我添加了try clause ,但我不确定为什么添加它之后,消费者不再收到任何菜(没有创建消费者连接?)。

如果有人可以帮助我解决这个问题,我将不胜感激。 我只希望一个唯一的消费者接收每条消息并离开(关闭与该消费者的连接?)

我认为您无需等待消息即可关闭连接。 没有什么能阻止您的代码关闭所有代码,这会杀死正在启动的消费者线程。

所以你需要在一个while循环中等待:

private static final volatile boolean NO_LEFT = true;    
    public void tamagoReceiveDish() throws IOException, TimeoutException  {
    String sushiDishEx = "sushiDishExchange";
    String tamagoKey = "tamagoDishKey";
    
    ConnectionFactory factory = new ConnectionFactory();
    try (Connection con = factory.newConnection()) {  // added a try clause 
    Channel chan = con.createChannel();
   chan.exchangeDeclare(sushiDishEx, "direct"); // direct exchange
    
    String queueName = chan.queueDeclare().getQueue();  
    chan.queueBind(queueName, sushiDishEx, tamagoKey); 
    
    
    chan.basicConsume(queueName, true, (x, msg)->{
    byte[] byteArray = msg.getBody();
    try {
        Sushi sushi = (Sushi) deserialize(byteArray);
        System.out.println("CUSTOMER " + this.custNo + " (ordered Tamago Sushi): Received " + sushi.sushiName + ".");
        System.out.println("CUSTOMER " + this.custNo + ": Left the restaurant.");
        NO_LEFT = false;
        
    } catch (Exception e) {}
    }, x->{}
    );
   while(NO_LEFT){
     Thread.sleep(100);
    }
    }}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM