2

柑橘類のフレームワークを利用して、単純な tcp 送受信シーケンスをテストしようとしています。メッセージは問題なく送信できますが、メッセージの受信に問題があることがわかります。基本的に、リプライは柑橘類によって検出されず、柑橘類はタイムアウトします。

柑橘類の豆の構成:

<?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" />

柑橘類のテスト ケース:

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

シンプルなnetcatサーバーを使用してテストしています:

nc -kl 9123

テストケースを実行すると、「Req」テキストが netcat に正常に届きます。ただし、netcat で「Rsp」と入力すると、citrus テストにデータが届きません。約 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 が期待するものであるため、応答チャネルのキューを定義する必要があることに注意してください。応答チャネルは Interface PollableChannel を実装する必要があります。

Citrus がキューからデータを受信しない理由を理解してください。

4

2 に答える 2

2

デフォルトでは、tcp 接続ファクトリは、メッセージが で区切られていることを想定しています\r\n

nc\n接続ファクトリが完全なメッセージを認識しないように、応答を終了します。

serializers/deserializers に関するドキュメントの説明を参照してください。メッセージを終了することを期待する Beanを指すようにserializerandを構成する必要があります。deserializerByteArrayLfSerializer\n

于 2016-04-21T16:21:46.753 に答える
0

このテストを機能させるための正しい Bean 構成を次に示します。Gary の提案に従って、シリアライザー/デシリアライザーを追加しました。

Message トランスフォーマー (object-to-string-transformer) も追加する必要がありました。これは、応答チャネルで Spring によって提供されるデータが byte[] 型になるためです。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" />

于 2016-04-22T09:18:30.853 に答える