Объявление обменов и очередей в Spring AMQP - PullRequest
4 голосов
/ 06 октября 2010

Я использую RabbitMQ и пытаюсь изменить мою текущую нативную реализацию Java на использование абстракции Spring AMQP.

Объявление обменов, очередей и их привязки с использованием библиотеки Spring осуществляется через интерфейс AMQPAdmin, но я не уверен, когда должна произойти такая конфигурация.

У меня есть веб-приложение, которое использует Rabbit для создания сообщений. И еще одно приложение, которое потребляет эти сообщения. Шокер:)

Но когда показывают декларации обменов / очередей?

Развертываю ли я AMQPAdmin с веб-приложениями и выполняю ли администрирование обмена / очереди внутри конструкторов производителей и потребителей?

Декларация об этих вещах однозначна, о них не нужно знать снова, поэтому любой код будет NOOP при последующих выполнениях.

Создать отдельное приложение для администрирования брокера?

Каково текущее мышление или лучшие практики здесь?

1 Ответ

6 голосов
/ 14 октября 2010

Похоже, что очень немногие используют Spring AMQP M1, поэтому я отвечу на свой вопрос тем, что я сделал.

В конструкторе производителя объявляю обмен. Затем установите обмен на шаблоне Rabbit. Я также установил ключ маршрутизации на RabbitTemplate в качестве имени очереди, но это не обязательно, но это был маршрут, который я бы использовал.

@Service("userService")
public class UserService {
    private final RabbitTemplate rabbitTemplate;

    @Autowired
    public UserService(final RabbitAdmin rabbitAdmin,
                       final Exchange exchange,
                       final Queue queue,
                       @Qualifier("appRabbitTemplate") final RabbitTemplate rabbitTemplate) {

        this.rabbitTemplate = rabbitTemplate;

        rabbitAdmin.declareExchange(exchange);
        rabbitTemplate.setExchange(exchange.getName());
        rabbitTemplate.setRoutingKey(queue.getName());  
    }


    public void createAccount(final UserAccount userAccount) {
        rabbitTemplate.convertAndSend("Hello message sent at " + new DateTime());
    }
}

В конструкторе потребителя я объявляю очередь и создаю привязку.

public class Consumer implements ChannelAwareMessageListener<Message> {

    public Consumer(final RabbitAdmin rabbitAdmin, final Exchange exchange, final Queue queue) {
        rabbitAdmin.declareQueue(queue);

        rabbitAdmin.declareBinding(BindingBuilder.from(queue).to((DirectExchange) exchange).withQueueName());
    }

    @Override
    public void onMessage(Message message, Channel channel) throws Exception {

        System.out.println(new String(message.getBody()));

        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }
}

Хотя конструкторы могут запускаться много раз, RabbitMQ объявляет обмен, очередь и привязки только один раз.

Если вам нужен весь источник для этого небольшого примера проекта, спросите, и я его где-нибудь выложу.

...