Spring amqp - 代理失败后未重新创建队列



我正在其中一个充当消息消费者的应用程序中使用Spring-AMQP-rabbit。队列在启动时创建并订阅交易所。

我的问题:当 RabbitMq 服务器重新启动或删除并完全添加时,不会重新创建队列。与 RabbitMq 服务器的连接将被重新存储,但不会重新存储队列。

我尝试在连接侦听器中进行队列管理,但这在启动时挂起。我想管理员知道连接,应该在连接恢复时进行队列管理不是吗?

我的队列由服务创建:

@Lazy
@Service
public class AMQPEventSubscriber implements EventSubscriber {
    private final ConnectionFactory mConnectionFactory;
    private final AmqpAdmin mAmqpAdmin;
     @Autowired
    public AMQPEventSubscriber(final AmqpAdmin amqpAdmin,
            final ConnectionFactory connectionFactory,
            final ObjectMapper objectMapper) {
        mConnectionFactory = connectionFactory;
        mAmqpAdmin = amqpAdmin;
        mObjectMapper = objectMapper;
    }
    @Override
    public <T extends DomainEvent<?>> void subscribe(final Class<T> topic, final EventHandler<T> handler) {
        final EventName topicName =  topic.getAnnotation(EventName.class);
        if (topicName != null) {
            final MessageListenerAdapter adapter = new MessageListenerAdapter(handler, "handleEvent");
            final Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter();
            converter.setJsonObjectMapper(mObjectMapper);
            adapter.setMessageConverter(converter);

            final Queue queue = new Queue(handler.getId(), true, false, false, QUEUE_ARGS);
            mAmqpAdmin.declareQueue(queue);
            final Binding binding = BindingBuilder.bind(queue).to(Constants.DOMAIN_EVENT_TOPIC).with(topicName.value());
            mAmqpAdmin.declareBinding(binding);
            final SimpleMessageListenerContainer listener = new SimpleMessageListenerContainer(mConnectionFactory);
            listener.setQueues(queue);
            listener.setMessageListener(adapter);
            listener.start();
        } else {
            throw new IllegalArgumentException("subscribed Event type has no exchange key!");
        }
    }
}

我的处理程序应用程序的一部分:

@Component
public class FooEventHandler implements EventHandler<FooEvent> {
    private final UserCallbackMessenger mUserCallbackMessenger;
    private final HorseTeamPager mHorseTeamPager;
    @Autowired
    public FooEventHandler(final EventSubscriber subscriber) {
        subscriber.subscribe(FooEvent.class, this);
    }
    @Override
    public void handleEvent(final FooEvent event) {
      // do stuff
    }
}

我想知道为什么经纪人实体的RabbitAdmin和豆子的开箱即用功能不符合您的要求:

在侦听器中执行自动声明的另一个好处是,如果连接因任何原因(例如代理死亡、网络故障等)而断开,它们将在下次需要时再次应用。

有关详细信息,请参阅参考手册。

最新更新