rabbitmq / java - получать сообщения по желанию, а не по подписке - PullRequest
0 голосов
/ 05 мая 2018

Я пишу потребитель для 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 голосов
/ 11 мая 2018

Я не Java-парень, поэтому у меня нет кода. Но если вы установите ограничение prefetch (QoS) на 1, то вы будете получать только одно сообщение за раз. Как только вы вручную подтвердите сообщение, вы сразу же получите другое сообщение.

На вашем канале установите предварительную выборку на 1.

channel.basicQos(1);

Так что у вас не будет петли. Просто стандартный подход к обработке событий, но вы можете гарантировать, что будете обрабатывать сообщения последовательно.

0 голосов
/ 05 мая 2018

Поскольку вы находитесь на земле Java, насколько вы открыты для пробной загрузки?

У них также есть стартеры 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) Затем свяжите рабочий бин с очередью согласно вашей топологии

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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...