rabbitmq / java - 按愿望接收消息,而不是订阅

时间:2018-05-05 06:49:33

标签: java rabbitmq

我为rabbitmq编写消费者,并且需要接收消息而不是订阅。我需要得到它,使用它,然后下班后获得下一条消息。它有点像

   while(true){
        String message = consumer.getNext();
        .......
   }

在google中,我发现了许多像QueueingConsumer这样的例子

    while (true) {
      QueueingConsumer.Delivery delivery = consumer.nextDelivery();
      String message = new String(delivery.getBody());

      System.out.println(" [x] Consumer : received '" + message + "'");
      doWork(message);

      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    }

但QueueingConsumer已被弃用并从上一个rabbitmq java lib中删除。我发现只有订阅这样的教程https://www.rabbitmq.com/tutorials/tutorial-one-java.html

请告诉我,我在哪里找到新的java coode示例,其中包含我需要的功能?

2 个答案:

答案 0 :(得分:0)

既然你在Java领域,你有多开放尝试spring-boot?

如果你需要一些帮助来引导它们,它们也有AMQP启动器。

https://projects.spring.io/spring-amqp/

1)创建一个将订阅队列的工作人员

package hello;

import java.util.concurrent.CountDownLatch;
import org.springframework.stereotype.Component;

@Component
public class Receiver {

    private CountDownLatch latch = new CountDownLatch(1);

    public void receiveMessage(String message) {
        System.out.println("Received <" + message + ">");
        latch.countDown();
    }

    public CountDownLatch getLatch() {
        return latch;
    }

}

2)然后根据拓扑结构将工作bean与队列绑定

package hello;

// imports omitted for brevity

@SpringBootApplication
public class Application {
    // code omitted for brevity 

    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(Application.class, args).close();
    }

}

如果您是Spring的新手,它提供了一个IoC容器。 Spring-boot简化了spring框架配置/设置(根据一些人的说法)。

以下是启动指南:https://spring.io/guides/gs/messaging-rabbitmq/

答案 1 :(得分:0)

我不是Java人,所以我没有代码。但是,如果您将prefetch (QoS) limit设置为1,那么您一次只能收到一条消息。一旦您手动收到消息,您就会立即得到另一个消息。

在您的频道上,将预取设置为1。

channel.basicQos(1);

所以你没有循环。只是标准的事件消费者方法,但您可以保证您将按顺序处理消息。