我正在努力尝试使用这个网络服务(这是与家庭作业相关但不是实际的家庭作业)。这个BPEL流程似乎提供了异步回调,我只是不确定它是如何被使用的。 wsimport生成了以下类:
> AttributedQName.java
> AttributedURI.java
> EndpointReferenceType.java
> N6368808CreditFlow.java
> N6368808CreditFlowCallback.java
> N6368808CreditFlowCallbackService.java
> N6368808CreditFlowProcessRequest.java
> N6368808CreditFlowProcessResponse.java
> N6368808CreditFlow_Service.java
> ObjectFactory.java
> ReferencePropertiesType.java
> Relationship.java ServiceNameType.java
> package-info.java
N6368808CreditFlow.java是使用initiate方法的接口,我假设使用credit方法,因为它是唯一可用的方法,它将请求作为参数。而N6368808CreditFlowCallback.java包含一个onResult方法,该方法将Response作为参数。
如何使用此服务?我已经能够调用该方法,但没有得到回复的响应(不知道如何得到响应,因为onResult方法没有做任何事情,init方法返回void(甚至没有回调或响应))。
到目前为止,这是我的代码:
N6368808CreditFlow_Service service1 = new N6368808CreditFlow_Service();
N6368808CreditFlow port = service1.getN6368808CreditFlowPort();
N6368808CreditFlowProcessRequest rqt = new N6368808CreditFlowProcessRequest();
rqt.setSsn("123456789");
port.initiate(rqt);
System.out.println("Done");
根据BPEL控制台的工作原理并给出了“123456789”,我的问题是你如何得到答复?
以下是BPEL来源的摘录:
<sequence name="main">
<!--
Receive input from requestor. (Note: This maps to operation defined in n6368808_CreditFlow.wsdl)
-->
<receive name="receiveInput" partnerLink="client" portType="client:n6368808_CreditFlow" operation="initiate" variable="inputVariable" createInstance="yes"/>
<!--
Asynchronous callback to the requester. (Note: the callback location and correlation id is transparently handled using WS-addressing.)
-->
- <scope name="getCreditRating">
- <sequence name="Sequence_1">
- <assign name="assign_SSN">
- <copy>
<from variable="inputVariable" part="payload" query="/client:n6368808_CreditFlowProcessRequest/client:ssn"/>
<to variable="invoke_CRS_process_InputVariable" part="payload" query="/ns1:ssn"/>
</copy>
</assign>
<invoke name="invoke_CRS" partnerLink="CreditRatingService" portType="ns1:CreditRatingService" operation="process" inputVariable="invoke_CRS_process_InputVariable" outputVariable="invoke_CRS_process_OutputVariable"/>
- <assign name="return_SSN">
- <copy>
<from variable="invoke_CRS_process_OutputVariable" part="payload" query="/ns1:rating"/>
<to variable="outputVariable" part="payload" query="/client:n6368808_CreditFlowProcessResponse/client:creditRating"/>
</copy>
</assign>
</sequence>
</scope>
<invoke name="callbackClient" partnerLink="client" portType="client:n6368808_CreditFlowCallback" operation="onResult" inputVariable="outputVariable"/>
</sequence>
</process>
答案 0 :(得分:0)
您的BPEL流程确实是异步的,流程实例在接收活动使用消息时启动,响应通过调用活动发送。为了接收响应,您的Java客户端需要打开一个实现客户端的Web服务端点:n6368808_CreditFlowCallback端口类型。 BPEL引擎如何确定回调的端点地址是特定于引擎的。从理论上讲,合作伙伴链接的合作伙伴角色会使用收到的消息进行初始化(即消息需要传达回调EPR)。但是,这取决于您的BPEL引擎是否以及如何实现合作伙伴角色的初始化。
通常我建议使用异步流程建模范例,因为它始终支持长时间运行的流程。但是,如果您使用异步传输协议(如JMS)或绝对确定被调用的Web服务运行不足(即整个处理不可能比HTTP连接超时更长),您可以考虑对进程进行同步建模,通过用回复替换调用(与同一个partnerlink,porttype和操作作为接收)。如果有疑问,请坚持使用异步模型。