我有一个场景,我正在呼叫第三方休息服务。我希望每当调用其余服务 BPEL 时出现
remote fault
时,BPEL 都应尝试 2 次重试,间隔 30 秒。如果重试失败,控制权应该转到 BPEL 的 catchAll
块,我将在其中处理故障、发送电子邮件通知等。
现在的问题是,如果我使用错误策略和绑定来配置重试,控件不会返回到 BPEL 中的 catchAll。我尝试将 default failure action
设置为 rethrow fault
中的 retry properties
但它忽略了 catchAll 块。如果我不使用故障策略,那么在失败时,控件将转到 catchAll,但它不会尝试重试以防远程故障。
[
这是我的故障策略 abd 绑定文件。 故障政策:
<?xml version="1.0" encoding="UTF-8"?>
<faultPolicies
xmlns="http://schemas.oracle.com/bpel/faultpolicy"
xmlns:bpelx="http://schemas.oracle.com/bpel/extension"
xmlns:bpel1="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:bpel2="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
xmlns:medns="http://schemas.oracle.com/mediator/faults"
xmlns:rjm="http://schemas.oracle.com/sca/rejectedmessages">
<faultPolicy id="policy1">
<Conditions>
<faultName name="bpelx:remoteFault" xmlns:bpelx="http://schemas.oracle.com/bpel/extension">
<condition>
<action ref="default-retry"/>
</condition>
</faultName>
<faultName name="bpelx:bindingFault" xmlns:bpelx="http://schemas.oracle.com/bpel/extension">
<condition>
<action ref="default-retry"/>
</condition>
</faultName>
</Conditions>
<Alerts/>
<Actions>
<Action id="default-termination">
<abort/>
</Action>
<Action id="default-human">
<humanIntervention/>
</Action>
<Action id="default-java">
<javaAction className="oracle.integration.platform.faultpolicy.IFaultRecoveryJavaClass" defaultAction="default-termination"/>
</Action>
<Action id="default-replay">
<replayScope/>
</Action>
<Action id="default-rethrow">
<rethrowFault/>
</Action>
<Action id="default-ws">
<invokeWS uri="WebServiceURI"/><!-- format - <Absolute wsdl path>|service name|port name -->
</Action>
<Action id="default-enqueue">
<enqueue uri="QueueURI"/> <!-- QueueURI format - jdbc:oracle:thin:@<host>:<port>:<sid>#<un>/<pw>#queue -->
</Action>
<Action id="default-file">
<fileAction>
<location>FOLDER_LOCATION</location>
<fileName>FILE_NAME</fileName><!-- FILE_NAME will support %ID%(rejected message instance id) or %TIMESTAMP% wildcards -->
</fileAction>
</Action>
<Action id="default-retry">
<retry>
<retryCount>2</retryCount>
<retryInterval>30</retryInterval>
<retryFailureAction ref="default-rethrow"/>
<exponentialBackoff/>
</retry>
</Action>
</Actions>
<Properties/>
</faultPolicy>
</faultPolicies>
故障绑定:
<?xml version="1.0" encoding="UTF-8"?>
<faultPolicyBindings version="2.0.1" xmlns="http://schemas.oracle.com/bpel/faultpolicy">
<reference faultPolicy="policy1">
<name>SOAPReference</name>
</reference>
</faultPolicyBindings>
SOA 是否不允许使用故障策略和绑定以及 catchAll?
默认情况下,Rest Adapter 不支持像其他数据库或文件适配器那样的重试,理想情况下,无论您提到什么,如果您使用故障策略和故障绑定,重试都应该起作用,并且最后它也会进入 catch all 块。 您可以在这里分享故障策略和故障绑定片段以供参考吗?
你的错误绑定应该是这样的
<reference faultPolicy="FaultPolicy">
<name>your adapter name</name>
</reference>
故障策略应该是这样的
<?xml version="1.0" encoding="UTF-8"?>
<faultPolicies
xmlns="http://schemas.oracle.com/bpel/faultpolicy"
xmlns:bpelx="http://schemas.oracle.com/bpel/extension"
xmlns:bpel1="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:bpel2="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
xmlns:medns="http://schemas.oracle.com/mediator/faults"
xmlns:rjm="http://schemas.oracle.com/sca/rejectedmessages">
<faultPolicy id="FaultPolicy">
<Conditions>
<faultName>
<condition>
<action ref="default-retry"/>
</condition>
</faultName>
</Conditions>
<Alerts/>
<Actions>
<Action id="default-termination">
<abort/>
</Action>
<Action id="default-retry">
<retry>
<retryCount>3</retryCount>
<retryInterval>2</retryInterval>
</retry>
</Action>
</Actions>
<Properties/>
</faultPolicy>
</faultPolicies>