WSO2 ESB 5.0 上的运行时错误

Runtime error on WSO2 ESB 5.0

我正在尝试使用 WS02 ESB 5.0 每 15 秒调用一次 Web 服务,所以我有这个任务:

<?xml version="1.0" encoding="UTF-8"?>
<task class="org.apache.synapse.startup.tasks.MessageInjector"
group="synapse.simple.quartz" name="UpdateName" xmlns="http://ws.apache.org/ns/synapse">
<trigger cron="0/15 * * * * ?" />
<property name="message"
xmlns:task="http://www.wso2.org/products/wso2commons/tasks">
<def:login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:def="http://DefaultNamespace" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id xsi:type="xsd:string">usr</id>
<pw xsi:type="xsd:string">pwd</pw>
</def:login>
</property>
<property name="sequenceName" value="main"
xmlns:task="http://www.wso2.org/products/wso2commons/tasks" />
<property name="injectTo" value="sequence"
xmlns:task="http://www.wso2.org/products/wso2commons/tasks" />
</task>

这个序列:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="main" xmlns="http://ws.apache.org/ns/synapse">
<in>
<send>
<endpoint>
<wsdl port="SakaiLogin" service="SakaiLoginService" trace="disable"
uri="http://myserver/sakai-axis/SakaiLogin.jws?wsdl" />
</endpoint>
</send>
</in>
<out>
<send />
</out>
<log level="full" />
</sequence>

均来自文档中显示的示例: https://docs.wso2.com/display/ESB500/Adding+and+Scheduling+Tasks(参见 "Injecting the message to a named sequence or proxy service")。 https://docs.wso2.com/display/ESB500/Sample+56:+Using+a+WSDL+Endpoint+as+the+Target+Endpoint(参见 "Building the sample")。

但是,我在启动 Carbon WSO2 ESB 服务器后遇到此错误:

[2017-01-27 17:03:45,005] ERROR - InMediator Runtime error occurred while mediating the message
java.lang.NullPointerException
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.isTransportSwitching(Axis2SynapseEnvironment.java:783)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:545)
        at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:382)
        at org.apache.synapse.endpoints.WSDLEndpoint.send(WSDLEndpoint.java:75)
        at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:121)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
        at org.apache.synapse.mediators.filters.InMediator.mediate(InMediator.java:74)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
        at org.apache.synapse.mediators.MediatorWorker.run(MediatorWorker.java:80)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
[2017-01-27 17:03:45,023]  INFO - LogMediator To: , 
MessageID: urn:uuid:097fb69e-6461-428e-ac85-93cfde65d02e, 
Direction: request, 
MESSAGE = Executing default 'fault' sequence, 
ERROR_CODE = 0, 
ERROR_MESSAGE = Runtime error occurred while mediating the message, Envelope:



<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Body>
<def:login xmlns:def="http://DefaultNamespace"         xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<id xmlns="http://ws.apache.org/ns/synapse" xsi:type="xsd:string">usr</id>
<pw xmlns="http://ws.apache.org/ns/synapse" xsi:type="xsd:string">pwd</pw>
</def:login></soapenv:Body></soapenv:Envelope>

任何人都可以告诉我发生了什么事吗? 非常感谢!

在 wsdl 端点中,uri 值必须是 WSDL 地址,而不是服务端点:

WSDL URI    The URI of the WSDL. Click Test to test the URI.

因此,发送中介内的 WSDL 端点使用服务和端口名称从 WSDL 文档中提取服务端点,以在 wsdl 文档中找到它。

更新 1:

我的任务配置xml:

<?xml version="1.0" encoding="UTF-8"?>
<task xmlns="http://ws.apache.org/ns/synapse"
      name="UpdateName"
      class="org.apache.synapse.startup.tasks.MessageInjector"
      group="synapse.simple.quartz">
   <trigger cron="0/15 * * * * ?"/>
   <property name="proxyName" value="testTask"/>
   <property name="message">
      <moc:QRY_SELECT_SRH_EMPLEADO xmlns:moc="http://www.example.org/mockWS/">
         <INT_ID>gero et</INT_ID>
      </moc:QRY_SELECT_SRH_EMPLEADO>
   </property>
   <property name="soapAction"
             value="http://www.example.org/mockWS/QRY_SELECT_SRH_EMPLEADO"/>
   <property name="injectTo" value="proxy"/>
</task>

我的序列名为 main1:

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="main1">
   <in>
      <header name="Action" scope="default" value="http://www.example.org/mockWS/QRY_SELECT_SRH_EMPLEADO"/>
      <send>
         <endpoint>
            <wsdl service="mockWS"
                  port="mockWSSOAP"
                  uri="http://localhost:8088/mockmockWSSOAP?wsdl"/>
         </endpoint>
      </send>
   </in>
   <out>
   <log level="full"/>
<drop/>
   </out>
</sequence>

最后我创建了一个具有相同逻辑的代理,因为序列中的 drop 中介存在问题:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="testTask"
       transports="https http"
       startOnLoad="true">
   <target>
      <inSequence>
      <header name="Action" scope="default" value="http://www.example.org/mockWS/QRY_SELECT_SRH_EMPLEADO"/>
      <send>
         <endpoint>
            <wsdl service="mockWS"
                  port="mockWSSOAP"
                  uri="http://localhost:8088/mockmockWSSOAP?wsdl"/>
         </endpoint>
      </send>
      </inSequence>
      <outSequence>
         <log level="full"/>
         <drop/>
      </outSequence>
      <faultSequence/>
   </target>
</proxy>