我为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示例,其中包含我需要的功能?
答案 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框架配置/设置(根据一些人的说法)。
答案 1 :(得分:0)
我不是Java人,所以我没有代码。但是,如果您将prefetch (QoS) limit设置为1,那么您一次只能收到一条消息。一旦您手动收到消息,您就会立即得到另一个消息。
在您的频道上,将预取设置为1。
channel.basicQos(1);
所以你没有循环。只是标准的事件消费者方法,但您可以保证您将按顺序处理消息。