2016-04-21 12 views
2

Я пытаюсь протестировать простую последовательность отправки/получения tcp с использованием структуры цитрусовых. Я могу отправлять сообщения в порядке, но получение сообщений оказывается проблематичным. В принципе, ответ не обнаруживается цитрусовыми и цитрусовыми, а затем истекает время.Получение сообщений с сервера tcp с использованием инфраструктуры Citrus и времени интеграции с интеграцией Spring

Citrus конфигурации фасоли:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:citrus="http://www.citrusframework.org/schema/config" 
    xmlns:int="http://www.springframework.org/schema/integration" 
    xmlns:int-ip="http://www.springframework.org/schema/integration/ip" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 

    http://www.citrusframework.org/schema/config http://www.citrusframework.org/schema/config/citrus-config.xsd 
    http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
    http://www.springframework.org/schema/integration/ip http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd"> 

<citrus:channel-endpoint id="citrusServiceInputEndpoint" 
         channel-name="input" /> 

<citrus:channel-endpoint id="citrusServiceRepliesEndpoint" 
         channel-name="replies" /> 

<int-ip:tcp-connection-factory id="client" 
           type="client" host="localhost" port="9123" single-use="false" 
           so-timeout="10000" using-nio="true" /> 

<int:channel id="input" /> 

<int:channel id="replies"> 
    <int:queue capacity="10" /> 
</int:channel> 

<int-ip:tcp-outbound-channel-adapter 
     id="outboundClient" channel="input" connection-factory="client" /> 

<int-ip:tcp-inbound-channel-adapter 
     id="inboundClient" channel="replies" connection-factory="client" /> 

Citrus тест:

@Test 
@CitrusTest(name = "sendSpringIntegrationMessageTest") 
public void sendSpringIntegrationMessageTest() throws Exception { 
    send("citrusServiceInputEndpoint").payload("Req"); 
    receive("citrusServiceRepliesEndpoint").payload("Rsp"); 
} 

Im используя простой сервер NetCat для теста:

nc -kl 9123 

При запуске тестового примера текст «Req» поступает нормально на netcat. Однако при наборе «Rsp» на netcat данные не поступают на тест цитрусовых. Примерно через 5 секунд тестовый пример выходит из строя со следующим сообщением:

com.consol.citrus.exceptions.TestCaseFailedException: Test case failed 

at com.consol.citrus.TestCase.executeAction(TestCase.java:218) 
at com.consol.citrus.TestCase.doExecute(TestCase.java:139) 
at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
at com.consol.citrus.Citrus.run(Citrus.java:243) 
at com.consol.citrus.dsl.junit.JUnit4CitrusTest.invokeTestMethod(JUnit4CitrusTest.java:90) 
at com.consol.citrus.dsl.junit.JUnit4CitrusTestDesigner.invokeTestMethod(JUnit4CitrusTestDesigner.java:68) 
at com.consol.citrus.dsl.junit.JUnit4CitrusTest.run(JUnit4CitrusTest.java:71) 
at com.consol.citrus.junit.CitrusJUnit4Runner$InvokeRunMethod.evaluate(CitrusJUnit4Runner.java:212) 
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) 
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) 
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:254) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:193) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:137) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
Caused by: com.consol.citrus.exceptions.ActionTimeoutException: Action timeout while receiving message from channel 'replies' 
    at com.consol.citrus.channel.ChannelConsumer.receive(ChannelConsumer.java:97) 
    at com.consol.citrus.messaging.AbstractSelectiveMessageConsumer.receive(AbstractSelectiveMessageConsumer.java:50) 
    at com.consol.citrus.actions.ReceiveMessageAction.receive(ReceiveMessageAction.java:146) 
    at com.consol.citrus.actions.ReceiveMessageAction.doExecute(ReceiveMessageAction.java:125) 
    at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:42) 
    at com.consol.citrus.TestCase.executeAction(TestCase.java:211) 
    ... 33 more 

Так что в основном Цитрус не получил ответ. Обратите внимание, что я должен определить очередь для канала ответов, поскольку это то, что ожидает Citrus, канал ответа должен реализовать интерфейс PollableChannel.

Пожалуйста, помогите мне понять, почему данные не получены Citrus из очереди?

ответ

2

По умолчанию завод tcp-соединения ожидает, что сообщения будут разделены на \r\n.

nc завершает реакцию только \n, поэтому фабрика соединений не видит полного сообщения.

См. discussion in the documentation about serializers/deserializers. Вам необходимо сконфигурировать serializer и deserializer, чтобы указать на bean-компонент ByteArrayLfSerializer, который только что ожидает \n, чтобы завершить сообщение.

+0

Благодаря этим решить мою проблему! – mdewit

0

Вот правильная конфигурация bean для выполнения этой тестовой работы. Добавлен сериализатор/десериализатор, предложенный Гэри.

Мне также пришлось добавить трансформатор сообщений (преобразование объекта в строку), поскольку данные, предоставленные Spring на канале ответов, будут иметь тип байта []. Citrus ожидает проверки на тип String, поэтому необходимо преобразовать массив байтов в строку.

Надеюсь, это помогло бы кому-то в будущем!

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:citrus="http://www.citrusframework.org/schema/config" 
    xmlns:int="http://www.springframework.org/schema/integration" 
    xmlns:int-ip="http://www.springframework.org/schema/integration/ip" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 

http://www.citrusframework.org/schema/config http://www.citrusframework.org/schema/config/citrus-config.xsd 
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration.xsd 
http://www.springframework.org/schema/integration/ip http://www.springframework.org/schema/integration/ip/spring-integration-ip.xsd"> 

<citrus:channel-endpoint id="citrusServiceInputEndpoint" 
         channel-name="input" /> 

<citrus:channel-endpoint id="citrusServiceRepliesEndpoint" 
         channel-name="response" /> 

<int-ip:tcp-connection-factory id="client" 
           type="client" host="localhost" port="9123" single-use="false" 
           so-timeout="10000" using-nio="true" deserializer="javaSerializer" 
           serializer="javaSerializer" /> 

<bean id="javaSerializer" 
     class="org.springframework.integration.ip.tcp.serializer.ByteArrayLfSerializer" /> 

<int:channel id="input" /> 

<int:channel id="replies"> 
</int:channel> 

<int:channel id="response"> 
    <int:queue /> 
</int:channel> 

<int:object-to-string-transformer id="transformer" input-channel="replies" output-channel="response" /> 

<int-ip:tcp-outbound-channel-adapter 
     id="outboundClient" channel="input" connection-factory="client" /> 

<int-ip:tcp-inbound-channel-adapter 
     id="inboundClient" channel="replies" connection-factory="client" /> 

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