2015-04-12 2 views
1

У меня есть простое рабочее приложение Spring Integration, которое перемещает сообщения из входящего шлюза RabbitMQ через цепочку обработчиков и в базу данных MongoDB. Когда я переключился с прямого канала на канал исполнителя, я начал получать ошибки подписчика. Наблюдая за событиями в отладчике, я увидел, что после создания компонента ExecutorChannel метод onInit() запускается и сбрасывает все значения по умолчанию. Я не могу понять, почему код будет структурирован для этого? Я посмотрел на DirectChannel.onInit(), и он только модифицирует вещи, если значения ранее не были установлены. Есть идеи? Я использую Spring Integration 4.1.2.Почему ExecutorChannel.onInit() перезагружает диспетчер?

// from 
@Bean 
DirectChannel uploadChannel(MessageHandlerChain uploadMessageHandlerChain) { 
    def bean = new DirectChannel() 
    bean.subscribe(uploadMessageHandlerChain) 
    bean 
} 

// to 
@Bean 
ExecutorChannel uploadChannel(MessageHandlerChain uploadMessageHandlerChain) { 
    def bean = new ExecutorChannel(Executors.newCachedThreadPool()) 
    bean.subscribe(uploadMessageHandlerChain) 
    bean 
} 

org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers 

ответ

1

При создании каналов с помощью контекста приложения XML, необходимо сначала определить канал и после того, как вы используете его в качестве шаблона EIP:

<int:channel id="directChannel"/> 
<int:service-activator input-channel="directChannel"/> 

Это позволяет по-моему лучшее разделение беспокойства. Тот же шаблон должен быть использован с конфигурацией Java, сначала объявить канал затем объявить MessageHandlerChain и подписаться на канал

@Bean 
ExecutorChannel uploadChannel() { 
    def bean = new ExecutorChannel(Executors.newCachedThreadPool()) 
    bean 
} 

@Bean 
MessageHandlerChain uploadMessageHandlerChain(){ 
    def uploadMessageHandlerChain = new MessageHandlerChain() 
    uploadChannel().subscribe(uploadMessageHandlerChain) 
    uploadMessageHandlerChain 
} 
+0

Николаса, что упорядочение именно то, что мне было нужно. Спасибо. – user1836542

+0

Если мой ответ решает ваш вопрос, пожалуйста, примите мой ответ и поддержите его –

+1

Ребята, мне интересно, почему '@ ServiceActivator' на том, что' MessageHandlerChain' '@ Bean' вам не подходит? Даже если этот материал 'subscribe' работает хорошо, у вас нет конечной точки, и вы не сможете« остановить »прослушивание с канала во время выполнения. '' создает точно конечную точку и 'MessageHandler'. То же самое делается в упоминании аннотации выше. –

Смежные вопросы