我想通过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。
谢谢, 塞巴斯蒂安
答案 0 :(得分:1)
streaming-protocol
具有此读取属性:
在套接字关闭之前发送的所有字节
如果客户端没有断开连接,Mule将继续阅读此协议。
请记住,Mule是面向消息的中间件:如果您希望TCP网桥正常工作,则需要使用与MSSQL协议兼容的协议。
这意味着协议必须识别SQL客户端使用的任何字符或字符序列来标记请求的结束,因此Mule可以从到目前为止收到的字节中删除一条消息,然后将其路由到流中。 / p>
可能没有提供的协议允许这样做,这意味着您必须创建自己的协议......