我正在尝试使用Apache-ODE设置HelloWorld bpel流程。 我已将ode.war(1.3.5 / 1.3.6)放入Tomcat 7.0.50,并使用ODE的Web界面部署了我的helloworld流程。
我的流程只是收到一条消息。 然后,该消息将转换为另一个Web服务的命名空间并调用它。 然后结果转换回第一个命名空间并用作回复。 所有wsdl文件和portLinkType都包含在进程中。 这是我的过程:
<bpel:assign name="myInputInitialization">
<bpel:copy>
<bpel:from>
<bpel:literal>
<ns2:sayHi xmlns:ns2="http://samples.orchestrator.intrinsec.com/">
<text>NoBody</text>
</ns2:sayHi>
</bpel:literal>
</bpel:from>
<bpel:to variable="myInput" part="parameters"/>
</bpel:copy>
</bpel:assign>
<bpel:assign name="sayHiResponseInitialization">
<bpel:copy>
<bpel:from>
<bpel:literal>
<ns2:sayHiResponse xmlns:ns2="http://samples.orchestrator.intrinsec.com/">
<myHelloText>
<text>Bye</text>
</myHelloText>
</ns2:sayHiResponse>
</bpel:literal>
</bpel:from>
<bpel:to variable="sayHiResponse" part="parameters"/>
</bpel:copy>
</bpel:assign>
<bpel:assign validate="no" name="myAssignIn"> <!-- validate="yes" is not supported by ODE. -->
<bpel:copy>
<bpel:from variable="sayHiRequest" part="parameters">
<bpel:query>text</bpel:query>
</bpel:from>
<bpel:to variable="myInput" part="parameters">
<bpel:query>text</bpel:query>
</bpel:to>
</bpel:copy>
</bpel:assign>
<bpel:invoke
name="myInvoke"
partnerLink="helloWorldPartnerLinkService"
operation="sayHi"
portType="samples:IHelloWorld"
inputVariable="myInput"
outputVariable="myOutput">
</bpel:invoke>
<bpel:assign validate="no" name="myAssignOut">
<bpel:copy>
<bpel:from variable="myOutput" part="parameters">
<bpel:query>myHelloText/text</bpel:query>
</bpel:from>
<bpel:to variable="sayHiResponse" part="parameters">
<bpel:query>myHelloText/text</bpel:query>
</bpel:to>
</bpel:copy>
</bpel:assign>
<bpel:reply
name="myReply"
partnerLink="helloWorldPartnerLinkClient"
operation="sayHi"
portType="bonjourlemonde:IHelloWorld"
variable="sayHiResponse">
</bpel:reply>
我削减了wsdl-imports,partnerLinks和变量定义,因为这已经很长了。
提供实现的Web服务由以下内容定义:
@WebService(serviceName = "HelloWorldService", portName="HelloWorldPort")
public interface IHelloWorld
{
@GET @Path("sayHi")
public @WebResult(name = "myHelloText") HelloText sayHi(final @WebParam(name = "text") String text);
}
和
public class HelloWorld implements IHelloWorld
{
@Override
public HelloText sayHi(final String text)
{
return new HelloText((text == null)?"Hello":"Hello " + text);
}
}
这个调用的webService是使用CXF的代码,工作正常,并且部署在同一个Tomcat中(一个独立的服务器以jetty Endpoint.publish开头,给出相同的行为)。
然后使用标准wsimport工具,我为ODE公开的webService创建了一个客户端。
调用此Web服务可以获得预期的结果(非常非常乔治)。我还可以在ODE界面中看到deployement包,进程和实例。我可以使用3个管理Web服务查询ODE,并获得与Web界面相同的信息。
直到这里的每件事情都是完美的。
现在我第二次使用我生成的客户端;然后我得到一个404 http错误。在我的BPEL流程中对Web服务设计的所有进一步调用都将导致404 http错误,同时可以访问与Web服务相对应的wsdl(并用于生成客户端)。
再次启动BPEL流程的唯一方法是重新启动Tomcat(或取消部署ODE,重新部署ODE,重新部署BPEL流程)。
catalina.out中没有出现任何错误,除非我激活更改为DEBUG ODE的日志级别(该日志对于该问题来说过于冗长)。
该过程的第一次运行是大约800行没有错误的调试消息,并且该过程的成功可以一步一步地进行。 该过程的第二次运行显示此错误:
15:35:20,866 DEBUG [DataRetrievalUtil] File does not exist in the Service Repository! File=META-INF/ServiceData.xml
15:35:20,866 DEBUG [AxisDataLocatorImpl] Check loading failure for file, META-INF/ServiceData.xml.Message = Failed to load from file, META-INF/ServiceData.xml
15:35:20,866 DEBUG [AxisDataLocatorImpl] Check loading failure for file, META-INF/ServiceData.xml
org.apache.axis2.dataretrieval.DataRetrievalException: Failed to load from file, META-INF/ServiceData.xml
at org.apache.axis2.dataretrieval.DataRetrievalUtil.buildOM(DataRetrievalUtil.java:64)
at org.apache.axis2.dataretrieval.AxisDataLocatorImpl.loadServiceData(AxisDataLocatorImpl.java:104)
at org.apache.axis2.description.AxisService.getDefaultDataLocator(AxisService.java:2949)
...
Caused by: javax.xml.stream.XMLStreamException: File does not exist in the Service Repository! File=META-INF/ServiceData.xml
at org.apache.axis2.dataretrieval.DataRetrievalUtil.getInputStream(DataRetrievalUtil.java:103)
...
'ServiceData.xml'错误促使我添加'axis2'标记。 在ODE文档/ examples / UnitTests中没有任何与service.xml / ServiceData.xml相关的内容,并且在这种错误上进行Google搜索并没有提供任何解决方案。
答案 0 :(得分:1)
这是与ODE公开的Web服务的wsdl相关的功能。 在所有wsdl中,服务端口位置可能是错误的(缺少url的require'ode / processes'部分。)。对于ODE的所有3个嵌入式管理服务也是如此。在第一次调用正在使用“调用”活动的进程后,wsdl可以更改。
如果使用某些工具(如“wsimport”)生成客户端代码,则必须覆盖服务的端点URL(通过在两个'/'之间添加'ode / process')。