代理失败后无法重新创建队列

时间:2016-07-08 12:04:05

标签: spring-amqp spring-rabbit spring-rabbitmq

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

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

我已尝试在ConnectionListener中执行队列管理,但在启动时挂起。我想管理员是连接感知的,应该在连接恢复时进行队列管理不是<?p?

我的队列由服务创建:

@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
    }

}

1 个答案:

答案 0 :(得分:0)

我想知道为什么RabbitAdmin的开箱即用功能和Broker实体的bean不符合您的要求:

  

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

查看Reference Manual中的更多信息。