스프링 통합에는 TcpInboundGateway 및 ByteArrayStxEtxSerializer가있어 TCP 포트를 통해 오는 데이터를 처리합니다.일회용 소켓 연결 닫기 = false 스프링 통합 TCP 서버
ByteArrayStxEtxSerializer는 TCP 서버가 클라이언트에서 보낸 모든 데이터를 읽고 나서 처리해야하는 경우 잘 작동합니다. (요청 및 응답 모델) 단일 요청 = false를 사용하여 여러 요청을 동일한 연결에서 처리 할 수 있습니다.
예를 들어 클라이언트가 0x02AAPL0x03을 보내는 경우 Server는 AAPL 가격을 보낼 수 있습니다.
클라이언트가 0x02AAPL0x030x02GOOG0x03을 보내는 경우 My TCP Server가 작동합니다. 그것은 AAPL과 GOOG 가격의 가격을 보냅니다.
때때로 클라이언트는 EOT (0x04)를 보낼 수 있습니다. 클라이언트가 EOT를 보내면 소켓 연결을 닫고 싶습니다.
예 : 클라이언트 요청은 0x02AAPL0x030x02GOOG0x03 0x020x040x03이 될 수 있습니다. 참고 EOT가 마지막 패킷에 들어 왔습니다.
ByteArrayStxEtxSerializer 디시리얼라이저는 클라이언트가 보낸 바이트를 읽도록 사용자 정의 할 수 있습니다.
은 deserializer 소켓 연결을 닫기 좋은 곳입니까? 만약 아니라면 스프링 통합 프레임 워크가 소켓 연결을 닫도록 통보되어야 하는가?
도와주세요.
<int-ip:tcp-connection-factory id="crLfServer"
type="server"
port="${availableServerSocket}"
single-use="false"
so-timeout="10000"
using-nio="false"
serializer="connectionSerializeDeserialize"
deserializer="connectionSerializeDeserialize"
so-linger="2000"/>
<bean id="connectionSerializeDeserialize" class="org.springframework.integration.ip.tcp.serializer.ByteArrayStxEtxSerializer"/>
<int-ip:tcp-inbound-gateway id="gatewayCrLf"
connection-factory="crLfServer"
request-channel="serverBytes2StringChannel"
error-channel="errorChannel"
reply-timeout="10000"/> <!-- reply-timeout works on inbound-gateway -->
<int:channel id="toSA" />
<int:service-activator input-channel="toSA"
ref="myService"
method="prepare"/>
<int:object-to-string-transformer id="serverBytes2String"
input-channel="serverBytes2StringChannel"
output-channel="toSA"/>
<int:transformer id="errorHandler"
input-channel="errorChannel"
expression="payload.failedMessage.payload + ':' + payload.cause.message"/>
UPDATE : 추가 던져 새로운 SoftEndOfStreamException ("스트림이 닫혀") 직렬 작품의 스트림을 닫습니다 그리고 내가 가의 EventListener의 로그 항목을 CLOSED 볼 수 있습니다
여기 내 스프링 구성입니다. 서버가 연결을 닫으면 클라이언트에서 java.io.InputStream.read()를 -1로 수신 할 것으로 예상됩니다. 그러나 클라이언트는
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at sun.nio.cs.StreamDecoder.read0(StreamDecoder.java:107)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:93)
at java.io.InputStreamReader.read(InputStreamReader.java:151)
는 서버 측에서 연결을 종료하고 클라이언트에 전파하기 위해 다른 있나요 받고있다?
감사합니다.
는 디시리얼라이저, 그냥 입력 스트림을 소켓에 액세스 할 수없는 당신에게
. 연결을 닫을 때 프레임 워크가 로그합니까? 로그에서 닫는 시점을보고 싶을 때 (threadId를 사용하는 것이 좋습니다.) – kevin
"SoftEndOfStreamException"에 대한 로그가 "정상"닫기로 간주되기 때문에 로그가 없습니다. 그러나 'ApplicationListener'를 추가 할 수 있습니다. 이것은 디시리얼라이저를 호출하는 동일한 스레드에서 호출됩니다. 예를 들어 답을 편집했습니다. –
ApplicationListener는 매우 유용합니다. 고마워. – kevin