TCP入站端点-Mule ESB-多线程
我有一个TCP入站端点,它引用TCP连接器。这是一个请求-响应端点。TCP客户端是第三方应用程序,它只在一个套接字上发送请求。这就是我设置TCP端点的方式。 终点:TCP入站端点-Mule ESB-多线程,tcp,mule,mule-studio,mule-component,Tcp,Mule,Mule Studio,Mule Component,我有一个TCP入站端点,它引用TCP连接器。这是一个请求-响应端点。TCP客户端是第三方应用程序,它只在一个套接字上发送请求。这就是我设置TCP端点的方式。 终点: <tcp:inbound-endpoint exchange-pattern="request-response" responseTimeout="10000" doc:name="TCP" address="${Endpoint}" encoding="ISO-8859-1" connector-r
<tcp:inbound-endpoint exchange-pattern="request-response"
responseTimeout="10000" doc:name="TCP" address="${Endpoint}" encoding="ISO-8859-1" connector-ref="TCP"/>
连接器:
<tcp:connector name="TCP" doc:name="TCP connector"
clientSoTimeout="${Client_SO_Timeout}" receiveBacklog="0" receiveBufferSize="0"
sendBufferSize="0" serverSoTimeout="${Server_SO_Timeout}" socketSoLinger="0"
validateConnections="true" keepAlive="true" sendTcpNoDelay="true">
<receiver-threading-profile maxThreadsActive="${TCP_MaxThreadsActive}" maxThreadsIdle = "${TCP_MaxThreadsIdle}" />
<reconnect-forever />
<service-overrides messageReceiver="CustomMessageReceiver" />
<tcp:custom-protocol ref="CustomLengthProtocol" />
</tcp:connector>
流程运行良好。但当必须处理并发请求时,最后几个请求会超时。我从中了解到,消息在接收方等待处理,因为只有一个TCP会话被使用,直到mule流完成前一个请求
为了对此进行调优,我正在寻找一种如下更改mule流的方法:在收到来自客户端的请求后,我需要将其发送到mule流,mule流可以异步处理它,并将响应推送到同一套接字。一旦在端点接收到请求,就不需要等待前一个请求的流完成,然后再处理下一个请求。不需要保留mule流的请求/响应序列。
有没有办法通过扩展mule TCP端点功能来实现这一点?这与排队异步流处理策略类似,只是响应必须发送回原始TCP套接字 我就是这样解决的: 我没有使用tcp请求-响应入站端点,而是使用tcp入站单向和tcp出站单向 ii TCP入站接收请求,自定义长度协议将消息拆分并提供给流。 iii对入站和出站VM端点使用请求-应答作用域 iv vm端点将消息定向到单独的流,该流具有队列异步的处理策略。我计划在此流级别上设置maxThreads以进行线程池。 v第二个流执行业务逻辑,并将响应发送回要发送到套接字的主流。 vi为了从入站端点访问套接字,我已经重写了TCPMessageReceiver类中的PreRouteMessage方法,并向mulemessage添加了一个名为ClientSocket的出站属性。然后,我将此属性传播到主流的末尾,再传播到出站端点。在TCPOutbound端点,我创建了自己的TCPMessageDispatcher并扩展了doDispatch方法。我没有使用出站端点线程池中的套接字,而是使用作为mulemessage的一部分共享的套接字对象。 样本流:
<tcp:connector name="TCP" doc:name="TCP connector"
clientSoTimeout="70000" receiveBacklog="0" receiveBufferSize="0"
sendBufferSize="0" serverSoTimeout="70000" socketSoLinger="0"
validateConnections="true" keepAlive="true" sendTcpNoDelay="true" keepSendSocketOpen="true">
<receiver-threading-profile
maxThreadsActive="1" maxThreadsIdle="1" />
<reconnect-forever />
<service-overrides messageReceiver="CustomMessageReceiver" />
<tcp:custom-protocol ref="CustomLengthProtocol" />
</tcp:connector>
<tcp:connector name="TCP2" doc:name="TCP connector"
clientSoTimeout="70000" receiveBacklog="0" receiveBufferSize="0"
sendBufferSize="0" serverSoTimeout="70000" socketSoLinger="0"
validateConnections="true" keepAlive="true" sendTcpNoDelay="true"
keepSendSocketOpen="true">
<receiver-threading-profile
maxThreadsActive="1" maxThreadsIdle="1" />
<reconnect-forever />
<service-overrides dispatcherFactory="CustomMessageDispatcherFactory"/>
<tcp:custom-protocol ref="CustomLengthProtocol" />
</tcp:connector>
<spring:beans>
<spring:bean id="CustomLengthProtocol" name="CustomLengthProtocol"
class="CustomLengthProtocol" />
</spring:beans>
<flow name="tcptestFlow" doc:name="tcptestFlow">
<tcp:inbound-endpoint address="tcp://localhost:4444"
responseTimeout="100000" doc:name="TCP" connector-ref="TCP" />
<byte-array-to-string-transformer
doc:name="Byte Array to String" />
<logger level="INFO" category="Expression" doc:name="Logger" />
<set-session-variable variableName="Socket"
value="#[message.outboundProperties['ClientSocket']]"
doc:name="Session Variable" />
<logger message="#[payload] - #[Socket]" level="INFO" category="Request"
doc:name="Logger" />
<request-reply doc:name="Request-Reply">
<vm:outbound-endpoint exchange-pattern="one-way"
path="/qin" doc:name="VM" >
<message-properties-transformer scope="outbound">
<delete-message-property key="MULE_REPLYTO"></delete-message-property>
</message-properties-transformer>
</vm:outbound-endpoint>
<vm:inbound-endpoint exchange-pattern="one-way"
path="/qout" doc:name="VM" />
</request-reply>
<logger message="#[payload]" level="INFO" doc:name="Logger"
category="Response" />
<string-to-byte-array-transformer
doc:name="String to Byte Array" />
<tcp:outbound-endpoint address="tcp://localhost:4444"
responseTimeout="10000" doc:name="TCP" connector-ref="TCP2" />
</flow>
<flow name="tcptestFlow1" processingStrategy="queued-asynchronous"
doc:name="tcptestFlow1">
<vm:inbound-endpoint exchange-pattern="one-way"
path="/qin" doc:name="VM" />
<logger message="Inside VM Flow" level="INFO" doc:name="Logger" />
<set-payload value="Appended Response - #[payload]"
doc:name="Set Payload" />
<vm:outbound-endpoint exchange-pattern="one-way"
path="/qout" doc:name="VM" />
</flow>