我在一个充当消息使用者的应用程序中使用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
}
}
答案 0 :(得分:0)
我想知道为什么RabbitAdmin
的开箱即用功能和Broker实体的bean不符合您的要求:
在监听器中执行自动声明的另一个好处是,如果连接因任何原因(例如代理死亡,网络故障等)被丢弃,它们将在下次需要时再次应用。
查看Reference Manual中的更多信息。