2015-11-17 2 views
1

Я создал пружинный шлюз dsl с каналом запроса и каналом ответа. Этот шлюз производит выход.Ошибка канала ответа, даже если она определена в шлюзе

@MessaginGateway 
public interface Gateway{ 
@Gateway(requestChannel="reqChannel", replyChannel="replyChannel") 
String sayHello(String name); 
} 

Я пытаюсь проверить выход в модульном тестировании. Поэтому я создал мост в моем тестовом контексте. И когда я пытаюсь получить его из мостового канала, он дает мне «отсутствие выходного канала или заголовка канала ответа».

Я создал мост, как показано ниже.

@Bean 
@BridgeFrom("replyChannel") 
public QueueChannel bridgeOutput(){ 
return MessageChannels.queue.get(); 
} 

В моем тесте, я посылаю сообщение запроса канала reqChannel.send(MessageBuilder.withPayload("Name").build()); и я пытался получить ответ на bridgeOutput.receive(0). Это дает мне вышеуказанную ошибку.

Если я вызываю метод sayHello() напрямую, он работает нормально. Я просто пытаюсь протестировать шлюз, прямо вставляя сообщение в канал.

Что мне не хватает?

UPDATE:

<int-enricher request-channel="gatewayRequestChannel" > 
    <int-property name="name" expression="payload" /> 
</int-enricher> 

В выше, я кладу сообщение в requestChannel и установка свойства. Вместо 'gatewayRequestChannel' можно вызвать метод java и установить возвращаемое значение?

ответ

1

Вы не можете этого сделать; канал ответа вставляется в качестве заголовка шлюзом.

Ваш мост создает второго потребителя на канале ответа.

Если вы хотите, чтобы имитировать то, что шлюз делает в модульном тесте, удалите этот мост и использование:

QueueChannel replyChannel = new QueueChannel(); 
reqChannel.send(MessageBuilder.withPayload("Name") 
    .setReplyChannel(replyChannel) 
    .build()); 
Message<?> reply = replyChannel.receive(10000); 

Внутри шлюза, то reply-channel перекрывается в заголовок сообщения; этот мост - один потребитель, ваш мост - другой.

EDIT

Вы обходя обогатитель - вы, кажется, не поняли конфигурацию обогатителя. Enricher - это особый вид шлюза.

Использование:

<int-enricher input-channel="enricherChannel" 
     request-channel="gatewayRequestChannel" > 
    <int-property name="name" expression="payload" /> 
</int-enricher> 

и отправить тестовое сообщение enricherChannel. Обогатитель действует как шлюз к потоку на gatewayRequestChannel и обогащает результаты по результатам этого потока.

+0

Спасибо, еще одна проблема, с которой я столкнулся, я внедрил errorFlow из errorChannel. Поэтому я настроил setErrorChannel(), как вы уже объяснили выше. Но мой поток ошибок не получает сообщение, а исключение выбрасывается. Что может быть неправильно. – Manoj

+0

Логика обработки ошибок встроена в шлюз; если вы обходите его в своем тесте, он не может быть вызван. Просто установить канал ошибки в сообщении недостаточно. Непонятно, что вы пытаетесь проверить здесь. Лучше всего проверить свой поток, позвонив в шлюз. –

+0

Причина, по которой я хочу сделать этот путь, - это такие места, как обогащение, мы можем предоставить канал запроса этого шлюза и получить ответ и установить свойство. Есть ли другой способ вызвать шлюз непосредственно из обогатителя вместо использования активатора службы? – Manoj

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