今天又被WSO2的官方文檔坑了一把。
按官網的教程配置WSO2 EI與IBM MQ的集成後,從IBM MQ的queue中取報文沒有遇到問題,然而往queue裏寫報文卻遇到了麻煩。
先上最終配置成功的proxy:
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="MQTest2" startOnLoad="true" transports="http" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<header action="remove" name="User-Agent" scope="transport"/>
<header action="remove" name="Content-Type" scope="transport"/>
<header action="remove" name="Transfer-Encoding" scope="transport"/>
<send description="">
<endpoint>
<address uri="jms:/LocalQueue1"/>
<property name="transport.jms.DestinationType" value="queue"/>
<property name="transport.jms.ConnectionFactoryType" value="queue"/>
<property name="java.naming.factory.initial" value="com.sun.jndi.fscontext.RefFSContextFactory"/>
<property name="java.naming.provider.url" value="file:///D:/jndidirectory"/>
<property name="transport.jms.ConnectionFactoryJNDIName" value="MyQueueConnectionFactory"/>
</endpoint>
</send>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
</proxy>
遇到的最大的麻煩在兩處
1. proxy的transport配成“jms"或”http jms",WSO2 ESB一看到jms,就會按axis2.xml裏Receiver的配置去監聽隊列,而因爲此處proxy Send的目標地址也是同一個隊列,就成了死循環,系統log裏會出現無限循環的報錯
2. 官方文檔中沒有提要配置那三個“remove" http header的Mediator,但實際上如果不配置,就會遇到報錯,大意是jms不接受Content-Type,或User-Agent或Transfer-Encoding這個header
不過到這裏發現還有已給問題,就是上有系統會一直在等HTTP返回信息,然而因爲queue的特性,根本不會有返回信息,所以就會報超時錯誤。解決方法是配置FORCE_SC_ACCEPTED表頭,注意scope得是"axis2"而不是"transport"或"synapse",但是配了這個表頭後,發現又得額外"remove"三個HTTP表頭了。最終的proxy配置如下。
<?xml version="1.0" encoding="UTF-8"?>
<proxy name="MQTest2" startOnLoad="true" transports="http" xmlns="http://ws.apache.org/ns/synapse">
<target>
<inSequence>
<property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
<property name="FORCE_SC_ACCEPTED" scope="axis2" type="STRING" value="true"/>
<header action="remove" name="Content-Length" scope="transport"/>
<header action="remove" name="Accept-Language" scope="transport"/>
<header action="remove" name="Accept-Encoding" scope="transport"/>
<header action="remove" name="User-Agent" scope="transport"/>
<header action="remove" name="Content-Type" scope="transport"/>
<header action="remove" name="Transfer-Encoding" scope="transport"/>
<send description="">
<endpoint>
<address uri="jms:/LocalQueue1"/>
<property name="transport.jms.DestinationType" value="queue"/>
<property name="transport.jms.ConnectionFactoryType" value="queue"/>
<property name="java.naming.factory.initial" value="com.sun.jndi.fscontext.RefFSContextFactory"/>
<property name="java.naming.provider.url" value="file:///D:/jndidirectory"/>
<property name="transport.jms.ConnectionFactoryJNDIName" value="MyQueueConnectionFactory"/>
</endpoint>
</send>
</inSequence>
<outSequence/>
<faultSequence/>
</target>
</proxy>