Citrus示例TCP发送和接收失败

时间:2018-10-09 13:43:06

标签: java spring-integration citrus-framework

我正在尝试通过Citrus-Framework发送和接收TCP消息,在这里我将此线程用作参考:

Receiving messages from tcp server with Citrus framework and Spring Integration times out

我正在使用python消息转发器,它返回接收到的消息。我通过python收到了一个有效负载,并将其返回,但柑橘类超时。我尝试了所有序列化程序(SingleTerminatior除外,会导致上下文错误)。

我尝试了不同的序列化器,但似乎都无法解决我的问题,Citrus总是超时。

C:\Users\xxx\Downloads\Installations\FFMPEG\bin>ffmpeg -i udp://@xxx.x.x.xx:xxxx -f mpegts udp://@xxx.x.x.xx.xxxx
ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 7.3.1 (GCC) 20180722
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-bzlib --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 14.100 / 56. 14.100
  libavcodec     58. 18.100 / 58. 18.100
  libavformat    58. 12.100 / 58. 12.100
  libavdevice    58.  3.100 / 58.  3.100
  libavfilter     7. 16.100 /  7. 16.100
  libswscale      5.  1.100 /  5.  1.100
  libswresample   3.  1.100 /  3.  1.100
  libpostproc    55.  1.100 / 55.  1.100
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] decode_slice_header error
[h264 @ 000001c3a9dff900] no frame!
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] decode_slice_header error
[h264 @ 000001c3a9dff900] no frame!
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] decode_slice_header error
[h264 @ 000001c3a9dff900] no frame!
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] decode_slice_header error
[h264 @ 000001c3a9dff900] no frame!
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] decode_slice_header error
[h264 @ 000001c3a9dff900] no frame!
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] non-existing SPS 0 referenced in buffering period
[h264 @ 000001c3a9dff900] SPS unavailable in decode_picture_timing
[h264 @ 000001c3a9dff900] non-existing PPS 0 referenced
[h264 @ 000001c3a9dff900] decode_slice_header error
[h264 @ 000001c3a9dff900] no frame!
[mpegts @ 000001c3a9dea3c0] PES packet size mismatch
[h264 @ 000001c3a9dff900] Reference 2 >= 2
[h264 @ 000001c3a9dff900] error while decoding MB 62 39, bytestream 99129
[h264 @ 000001c3a9dff900] reference picture missing during reorder
[h264 @ 000001c3a9dff900] Missing reference picture, default is 65373
Input #0, mpegts, from 'udp://@xxx.x.x.xx:xxxx':
  Duration: N/A, start: 87772.784411, bitrate: N/A
  Program 4030
    Metadata:
      service_name    : SONY TV HD
      service_provider: BSkyB
    Stream #0:0[0x208]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 50 tbr, 90k tbn, 50 tbc
    Stream #0:1[0x281](eng): Audio: ac3 ([6][0][0][0] / 0x0006), 48000 Hz, 5.1(side), fltp, 384 kb/s
    Stream #0:2[0x243](eng): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
[udp @ 000001c3aa7aaa00] getaddrinfo(xxx.x.x.xx.xxxx, 0): The name does not resolve for the supplied parameters
udp://@xxx.x.x.xx.xxxx: I/O error

我的上下文似乎是正确的(我使用的是spring-integration-ip 5.0.8-RELEASE),执行测试时也不例外(使用SingleTerminatior除外):

15:03:58,013 DEBUG t.TestContextFactory| Created new test context - using global variables: '{}'
15:03:58,024 INFO  port.LoggingReporter| 
15:03:58,024 INFO  port.LoggingReporter|------------------------------------------------------------------------
15:03:58,024 DEBUG port.LoggingReporter| STARTING TEST sendSpringIntegrationMessageTest <com.consol.citrus.samples>
15:03:58,025 INFO  port.LoggingReporter| 
15:03:58,025 DEBUG      citrus.TestCase| Initializing test case
15:03:58,026 DEBUG  context.TestContext| Setting variable: citrus.test.name with value: 'sendSpringIntegrationMessageTest'
15:03:58,027 DEBUG  context.TestContext| Setting variable: citrus.test.package with value: 'com.consol.citrus.samples'
15:03:58,028 DEBUG      citrus.TestCase| Test variables:
15:03:58,028 DEBUG      citrus.TestCase| citrus.test.name = sendSpringIntegrationMessageTest
15:03:58,028 DEBUG      citrus.TestCase| citrus.test.package = com.consol.citrus.samples
15:03:58,029 INFO  port.LoggingReporter| 
15:03:58,030 DEBUG port.LoggingReporter| TEST STEP 1/2: send
15:03:58,049 DEBUG nnel.ChannelProducer| Sending message to channel: 'input'
15:03:58,055 DEBUG nnel.ChannelProducer| Message to send is:
DEFAULTMESSAGE [id: c5c61991-f567-42bd-9302-1f8e1fa16225, payload: Req][headers: {citrus_message_type=XML, citrus_message_id=c5c61991-f567-42bd-9302-1f8e1fa16225, citrus_message_timestamp=1539090238031}]
15:03:58,164 INFO  nnel.ChannelProducer| Message was sent to channel: 'input'
15:03:58,165 INFO  port.LoggingReporter| 
15:03:58,166 DEBUG port.LoggingReporter| TEST STEP 1/2 SUCCESS
15:03:58,166 INFO  port.LoggingReporter| 
15:03:58,166 DEBUG port.LoggingReporter| TEST STEP 2/2: receive
15:03:58,168 DEBUG nnel.ChannelConsumer| Receiving message from: replies
15:04:03,171 INFO  port.LoggingReporter| 
15:04:03,172 ERROR port.LoggingReporter| TEST FAILED sendSpringIntegrationMessageTest <com.consol.citrus.samples> Nested exception is:
at 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:141)
at com.consol.citrus.actions.ReceiveMessageAction.doExecute(ReceiveMessageAction.java:120)
at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:46)
at com.consol.citrus.dsl.actions.DelegatingTestAction.doExecute(DelegatingTestAction.java:54)
at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:46)
at com.consol.citrus.TestCase.executeAction(TestCase.java:234)
at com.consol.citrus.TestCase.doExecute(TestCase.java:153)
at com.consol.citrus.actions.AbstractTestAction.execute(AbstractTestAction.java:46)
at com.consol.citrus.Citrus.run(Citrus.java:403)
at com.consol.citrus.dsl.testng.TestNGCitrusTest.invokeTestMethod(TestNGCitrusTest.java:125)
at com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner.invokeTestMethod(TestNGCitrusTestDesigner.java:73)
at com.consol.citrus.dsl.testng.TestNGCitrusTest.run(TestNGCitrusTest.java:110)
...

我感谢任何帮助

谢谢

因为我是新手,所以这里是我添加的依赖项:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       ... >

   <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="127.0.0.1"
                              port="33500" 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:queue />
    </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" />

</beans>

1 个答案:

答案 0 :(得分:1)

这是citrus的调试输出:

Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();

byte[] bigIntegerBytes = BigInteger.valueOf(4294967295l).toByteArray();
String base64EncodedBigIntegerBytes = encoder.encodeToString(bigIntegerBytes);
System.out.println(base64EncodedBigIntegerBytes);

byte[] decodedBigIntegerBytes = decoder.decode(base64EncodedBigIntegerBytes);
BigInteger decodedBigInteger = new BigInteger(decodedBigIntegerBytes);
System.out.println(decodedBigInteger);

我检查了Wireshark,并返回了包含换行符的有效负载(“ Req”),可以在屏幕截图中看到。也许我应该提到我正在Ubuntu VM中运行它。

Wireshark screenshot

22:47:41,071 DEBUG port.LoggingReporter| TEST STEP 1/2: send
22:47:41,085 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'citrusServiceInputEndpoint'
22:47:41,086 DEBUG nnel.ChannelProducer| Sending message to channel: 'input'
22:47:41,086 DEBUG nnel.ChannelProducer| Message to send is:
DEFAULTMESSAGE [id: 7d4f4c7a-92d0-462c-b695-c32fc7e697ae, payload: Req][headers: {citrus_message_type=XML, citrus_message_id=7d4f4c7a-92d0-462c-b695-c32fc7e697ae, citrus_message_timestamp=1539118061073}]
22:47:41,087 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'input'
22:47:41,091 DEBUG hannel.DirectChannel| preSend on channel 'input', message: 
GenericMessage [payload=Req, headers={citrus_message_timestamp=1539118061073, citrus_message_type=XML, id=33295f63-948f-6bcf-289f-d5e1df8dc98b, citrus_message_id=7d4f4c7a-92d0-462c-b695-c32fc7e697ae, timestamp=1539118061091}]
22:47:41,092 DEBUG endingMessageHandler| org.springframework.integration.ip.tcp.TcpSendingMessageHandler#0 received message:
GenericMessage [payload=Req, headers={citrus_message_timestamp=1539118061073, citrus_message_type=XML, id=33295f63-948f-6bcf-289f-d5e1df8dc98b, citrus_message_id=7d4f4c7a-92d0-462c-b695-c32fc7e697ae, timestamp=1539118061091}]
22:47:41,092 DEBUG entConnectionFactory| Opening new socket connection to 127.0.0.1:33500
22:47:41,106 DEBUG ion.TcpNioConnection| New connection localhost:33500:55108:33be3b24-f5ae-4594-83e9-c7eb0f104b1f
22:47:41,110 DEBUG entConnectionFactory| client: Added new connection: localhost:33500:55108:33be3b24-f5ae-4594-83e9-c7eb0f104b1f
22:47:41,113 DEBUG endingMessageHandler| Got Connection localhost:33500:55108:33be3b24-f5ae-4594-83e9-c7eb0f104b1f
22:47:41,114 DEBUG ion.TcpNioConnection| localhost:33500:55108:33be3b24-f5ae-4594-83e9-c7eb0f104b1f writing 4
22:47:41,116 DEBUG ion.TcpNioConnection| localhost:33500:55108:33be3b24-f5ae-4594-83e9-c7eb0f104b1f Message sent GenericMessage [payload=Req, headers={citrus_message_timestamp=1539118061073, citrus_message_type=XML, id=33295f63-948f-6bcf-289f-d5e1df8dc98b, citrus_message_id=7d4f4c7a-92d0-462c-b695-c32fc7e697ae, timestamp=1539118061091}]
22:47:41,117 DEBUG channel.DirectChannel| postSend (sent=true) on channel 'input', message: GenericMessage [payload=Req, headers={citrus_message_timestamp=1539118061073, citrus_message_type=XML, id=33295f63-948f-6bcf-289f-d5e1df8dc98b, citrus_message_id=7d4f4c7a-92d0-462c-b695-c32fc7e697ae, timestamp=1539118061091}]
22:47:41,118 INFO  nnel.ChannelProducer| Message was sent to channel: 'input'
22:47:41,118 INFO  port.LoggingReporter| 
22:47:41,119 DEBUG port.LoggingReporter| TEST STEP 1/2 SUCCESS
22:47:41,119 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'citrusServiceRepliesEndpoint'
22:47:41,120 INFO  port.LoggingReporter| 
22:47:41,121 DEBUG port.LoggingReporter| TEST STEP 2/2: receive
22:47:41,122 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'citrusServiceRepliesEndpoint'
22:47:41,124 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'response'
22:47:41,125 DEBUG nnel.ChannelConsumer| Receiving message from: response
22:47:46,130 INFO  port.LoggingReporter| 
22:47:46,131 ERROR port.LoggingReporter| TEST FAILED
sendSpringIntegrationMessageTest <com.consol.citrus.samples> Nested exception is: 
com.consol.citrus.exceptions.ActionTimeoutException: Action timeout while receiving message from channel 'response'
    ...

编辑

好的,我的python服务器似乎有问题。我稍稍更改了代码以查看控制台上收到的字节(之前我只是在计算字节数),然后突然改变了柑橘的输出。

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

EDIT2

由于以下帖子: How to use Spring Integration 5 with Spring Boot 1.5.x 我从spring-integration-ip 5.0.8切换到4.3.9,然后输出又改变了一次。现在,我的问题似乎已经从TCP问题转移到了实际的Spring专有技术上。

11:40:54,924 DEBUG port.LoggingReporter| TEST STEP 2/2: receive
11:40:54,925 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'citrusServiceRepliesEndpoint'
11:40:54,925 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'response'
11:40:54,925 DEBUG nnel.ChannelConsumer| Receiving message from: response
11:40:54,928 DEBUG ion.TcpNioConnection| localhost:33500:55890:7537f5ed-f447-4b76-ba66-2ec59c7619a9 Reading...
11:40:54,929 DEBUG ion.TcpNioConnection| localhost:33500:55890:7537f5ed-f447-4b76-ba66-2ec59c7619a9 Running an assembler
11:40:54,929 DEBUG ion.TcpNioConnection| Read 4 into raw buffer
Exception in thread "pool-1-thread-3" java.lang.AbstractMethodError: org.springframework.integration.ip.tcp.connection.TcpMessageMapper.toMessage(Ljava/lang/Object;)Lorg/springframework/messaging/Message;
    at org.springframework.integration.ip.tcp.connection.TcpNioConnection.convert(TcpNioConnection.java:358)
    at org.springframework.integration.ip.tcp.connection.TcpNioConnection.run(TcpNioConnection.java:235)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
11:40:54,937 DEBUG ion.TcpNioConnection| localhost:33500:55890:7537f5ed-f447-4b76-ba66-2ec59c7619a9 Reading...
11:40:54,938 DEBUG ion.TcpNioConnection| Read 0 into raw buffer
11:40:59,930 INFO  port.LoggingReporter| 
11:40:59,931 ERROR port.LoggingReporter| TEST FAILED sendSpringIntegrationMessageTest <com.consol.citrus.samples> Nested exception is: 
com.consol.citrus.exceptions.ActionTimeoutException: Action timeout while receiving message from channel 'response'

EDIT3

好像在调整环境以进行测试后,我最后在上下文文件中错过了这一行:

15:04:12,318 DEBUG port.LoggingReporter| TEST STEP 2/2: receive
15:04:12,319 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'citrusServiceRepliesEndpoint'
15:04:12,319 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'replies'
15:04:12,319 DEBUG nnel.ChannelConsumer| Receiving message from: replies
15:04:12,327 DEBUG ion.TcpNioConnection| localhost:33500:56004:1174f4c6-608c-44c6-aeec-33da4074e195 Reading...
15:04:12,328 DEBUG ion.TcpNioConnection| localhost:33500:56004:1174f4c6-608c-44c6-aeec-33da4074e195 Running an assembler
15:04:12,329 DEBUG ion.TcpNioConnection| Read 4 into raw buffer
15:04:12,329 DEBUG ion.TcpNioConnection| localhost:33500:56004:1174f4c6-608c-44c6-aeec-33da4074e195 Reading...
15:04:12,330 DEBUG ion.TcpNioConnection| Read 0 into raw buffer
15:04:12,332 DEBUG yteArrayLfSerializer| Available to read:4
15:04:12,333 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'messageBuilderFactory'
15:04:12,336 DEBUG channel.QueueChannel| preSend on channel 'replies', message: GenericMessage [payload=byte[3], headers={ip_tcp_remotePort=33500, ip_connectionId=localhost:33500:56004:1174f4c6-608c-44c6-aeec-33da4074e195, ip_localInetAddress=0.0.0.0/0.0.0.0, ip_address=127.0.0.1, id=9bd90a54-cc2b-d3d0-ca63-6355f53dee7c, ip_hostname=localhost, timestamp=1539176652336}]
15:04:12,339 DEBUG channel.QueueChannel| postReceive on channel 'replies', message: GenericMessage [payload=byte[3], headers={ip_tcp_remotePort=33500, ip_connectionId=localhost:33500:56004:1174f4c6-608c-44c6-aeec-33da4074e195, ip_localInetAddress=0.0.0.0/0.0.0.0, ip_address=127.0.0.1, id=9bd90a54-cc2b-d3d0-ca63-6355f53dee7c, ip_hostname=localhost, timestamp=1539176652336}]
15:04:12,340 DEBUG nnel.ChannelConsumer| Received message from: replies
15:04:12,340 DEBUG tListableBeanFactory| Returning cached instance of singleton bean 'citrusServiceRepliesEndpoint'
15:04:12,354 DEBUG channel.QueueChannel| postSend (sent=true) on channel 'replies', message: GenericMessage [payload=byte[3], headers={ip_tcp_remotePort=33500, ip_connectionId=localhost:33500:56004:1174f4c6-608c-44c6-aeec-33da4074e195, ip_localInetAddress=0.0.0.0/0.0.0.0, ip_address=127.0.0.1, id=9bd90a54-cc2b-d3d0-ca63-6355f53dee7c, ip_hostname=localhost, timestamp=1539176652336}]
15:04:12,379 INFO  port.LoggingReporter| 
15:04:12,381 ERROR port.LoggingReporter| TEST FAILED sendSpringIntegrationMessageTest <com.consol.citrus.samples> Nested exception is: 
com.consol.citrus.exceptions.CitrusRuntimeException: Could not find proper message validator for message type 'XML', please define a capable message validator for this message type

感谢您将我推向正确的方向。