通过TCP连接器连接时超时

时间:2014-08-17 23:37:56

标签: sql-server sockets jdbc tcp mule

我想通过Mule为MSSQL数据库路由流量。数据库在端口1433上的URL“internalserverurl”上运行。

Mule将充当TCP服务器/代理,只需将1433上的传入TCP流量重新路由到端口1433上“internalserverurl”的地址,处理响应并将其返回。

示例代码:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:tcp="http://www.mulesoft.org/schema/mule/tcp" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:spring="http://www.springframework.org/schema/beans" version="CE-3.3.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/tcp http://www.mulesoft.org/schema/mule/tcp/current/mule-tcp.xsd 
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd 
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd ">
    <tcp:connector name="TCP_C_L" validateConnections="false" receiveBufferSize="102400" sendBufferSize="102400" doc:name="TCP connector">
    <tcp:streaming-protocol/>
    </tcp:connector>
    <tcp:connector name="TCP_C_81" validateConnections="false" receiveBufferSize="102400" sendBufferSize="102400" doc:name="TCP connector">
    <tcp:streaming-protocol/>
    </tcp:connector>
    <flow name="IncomingEndpoint" doc:name="IncomingEndpoint">
        <tcp:inbound-endpoint exchange-pattern="request-response" responseTimeout="10000" doc:name="TCP-Proxy" host="localhost" port="1433" connector-ref="TCP_C_L" />
        <tcp:outbound-endpoint exchange-pattern="request-response" host="internalserverurl" port="1433" responseTimeout="10000" doc:name="TCP" connector-ref="TCP_C_81" />
    </flow>
</mule>

如果我运行此代码,mule应用程序启动正常,我也可以通过JDBC连接到本地主机端口1433。 但数据库连接不成功。 Mule会抛出一个Socket Exception:

Exception stack is:
1. Socket is closed (java.net.SocketException)
  java.net.Socket:864 (null)
2. Failed to route event via endpoint: DefaultOutboundEndpoint{endpointUri=tcp://internalserverurl:1433, connector=TcpConnector
{
  name=TCP_C_81
  lifecycle=start
  this=7ffba3f9
  numberOfConcurrentTransactedReceivers=4
  createMultipleTransactedReceivers=true
  connected=true
  supportedProtocols=[tcp]
  serviceOverrides=<none>
}
,  name='endpoint.tcp.internalserverurl.1433', mep=REQUEST_RESPONSE, properties={}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: TcpMessageReceiver$TcpWorker$1 (org.mule.api.transport.DispatchException)
  org.mule.transport.AbstractMessageDispatcher:109 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/api/transport/DispatchException.html)

为什么有套接字超时?当我直接执行JDBC连接时(来自运行此Mule应用程序的同一台机器),连接就可以了。

如果我使用

<tcp:direct-protocol payloadOnly="true"/>

而不是

<tcp:streaming-protocol/>

然后我可以在MSSQL服务器上看到传入的TCP数据包,但SQL服务器会记录如下消息: 08/18/2014 12:16:41,登录,未知,用于打开连接的登录数据包在结构上无效;连接已关闭。请联系客户端库的供应商。 [客户:10.2.60.169] 08/18/2014 12:16:41,登录,未知,错误:17832严重性:20状态:2。

谢谢, 塞巴斯蒂安

1 个答案:

答案 0 :(得分:1)

查看TCP连接器协议表:http://www.mulesoft.org/documentation/display/current/TCP+Transport+Reference#TCPTransportReference-ProtocolTables

streaming-protocol具有此读取属性:

  

在套接字关闭之前发送的所有字节

如果客户端没有断开连接,Mule将继续阅读此协议。

请记住,Mule是面向消息的中间件:如果您希望TCP网桥正常工作,则需要使用与MSSQL协议兼容的协议。

这意味着协议必须识别SQL客户端使用的任何字符或字符序列来标记请求的结束,因此Mule可以从到目前为止收到的字节中删除一条消息,然后将其路由到流中。 / p>

可能没有提供的协议允许这样做,这意味着您必须创建自己的协议......