我有一个侦听端口的外部TCP服务器,一旦客户端成功建立连接,它就会开始推送数据(可以将其视为典型的发布 - 订阅模型)。只有初始请求才会从应用程序到服务器创建套接字连接,不会发送其他请求。服务器只要有数据就会推送数据。 这里的问题是,我使用TCP出站端点与服务器建立了连接但是如何连续监听我的出站创建的套接字以接收服务器发布的数据?
答案 0 :(得分:1)
与侦听器共享客户端套接字连接的一种方法是在TCP出站连接器中使用自定义MessageDispatcher,如 -
<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:connector>
您将拥有一个调度员工厂类,如
import org.mule.api.MuleException;
import org.mule.api.endpoint.OutboundEndpoint;
import org.mule.api.transport.MessageDispatcher;
import org.mule.transport.tcp.TcpMessageDispatcherFactory;
public class CustomMessageDispatcherFactory extends TcpMessageDispatcherFactory {
public MessageDispatcher create(OutboundEndpoint endpoint) throws MuleException
{
return new CustomMessageDispatcher(endpoint);
}
}
以及下面的CustomMessageDispatcher.class -
import org.mule.api.MuleEvent;
import org.mule.api.MuleMessage;
import org.mule.api.endpoint.OutboundEndpoint;
import org.mule.api.transformer.TransformerException;
import org.mule.transport.AbstractMessageDispatcher;
import org.mule.transport.NullPayload;
import org.mule.transport.tcp.TcpConnector;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.Socket;
/**
* Send transformed Mule events over TCP.
*/
public class CustomMessageDispatcher extends AbstractMessageDispatcher
{
private final TcpConnector connector;
public CustomMessageDispatcher (OutboundEndpoint endpoint)
{
super(endpoint);
this.connector = (TcpConnector) endpoint.getConnector();
}
@Override
protected synchronized void doDispatch(MuleEvent event) throws Exception
{
/* Share the socket with the mule flow as a session variable */
Socket socket = connector.getSocket(endpoint);
event.getMessage().setInvocationProperty("ClientSocket", socket);
/* If you have something to be dispatched, you can use the below section of code */
try
{
dispatchToSocket(socket, event);
}
finally
{
connector.releaseSocket(socket, endpoint);
}
}
@Override
protected MuleMessage doSend(MuleEvent event) throws Exception {
// Not used since we do not do request-response for the outbound endpoint
return null;
}
}
如果您希望收听同一个套接字,您也可以使用同一个类进行收听。您可以为doSend()方法编写自己的实现。当端点设置为&#34;请求 - 响应&#34;时,将触发此方法。它接收字节数组并在将其指定为有效负载后将其发送回mule流。请参阅org.mule.transport.tcp.TcpMessageDispatcher.class类以获取这些方法的默认用法。 仅供参考 - 我自己没有测试过上面的逻辑,但我有一个类似的实现来发送套接字对象跨越mule流。希望这会对你有所帮助。