【问题标题】:Oracle BPEL Server: How to throw a Fault from a BPEL Java call-out?Oracle BPEL 服务器:如何从 BPEL Java 调用中引发故障?
【发布时间】:2011-06-14 13:31:49
【问题描述】:

我正在通过 bpelx:exec 从 BPEL 调用一个 java 类。如果该类能够抛出特定的故障(BPEL 从其合作伙伴链接之一知道),这将大大简化事情。我们称它为 AdapterFault。 AdapterFault 由 wsimport 和子类 Exception 生成。

这是嵌入式 Java 块中的代码:

Object wfr = getVariableData("inputVariable","request");
Object req = getVariableData("V_CreateServiceRequest","createTNRequestPart");

somepackage.EndpointIterator it =
new somepackage.EndpointIterator();

it.setWFRequest(wfr);
it.setPlatformName("MMSC");
it.setOperationName("createTN");
it.setRequest(req);

Object reply = it.invoke();

setVariableData("V_CreateServiceResponse","createTNResponsePart",reply);

当我将 java 方法声明为抛出 AdapterFault 时,BPEL 拒绝部署并抱怨 Exception 未被捕获。似乎Java标注步骤只声明了BPELFault。

我只能抛出 RuntimeException,它会转到 CatchAll 块而不是 catch(AdapterFault)。

有没有一种简单的方法可以从 java 调用中抛出已检查的故障?

【问题讨论】:

  • 哪个版本,你的意思是 WSIF 绑定还是 bpelx:exec?

标签: oracle bpel bpelxexec


【解决方案1】:

如果它是 WSIF 绑定,则在“异常处理”标题下有说明 here,但那篇文章已经很老了。

对于 bpelx:exec(我认为),您需要在块中捕获异常并更新变量

试试{
...做事

} 捕捉(异常前){

addAuditTrailEntry("异常消息:" + ex.getMessage());

setVariableData("V_CreateServiceException",...

}

}

【讨论】:

  • 谢谢,但是对于简单的标注来说,WSIF 似乎有点过头了。如果没有其他解决方案,可以走这条路。
【解决方案2】:

只能抛出 BPELFault:

http://forums.oracle.com/forums/thread.jspa?threadID=547192

但它可能包括嵌套部分,这是“真正的”异常,可以在 Catch 块中提取并在需要时重新抛出。

我今天已经实现了。

陷阱:

  • Catch 块应捕获系统异常之一,例如远程故障。
  • 应将 RuntimeFault.wsdl 导入 (wsdl:import) 到合作伙伴 WSDL 之一,否则将抛出一个令人讨厌的错误,指出未找到 BPELFault

BPELFault 相当有限,因为它只能包含代码、消息和详细信息元素,全都是纯文本。可以通过 bpelFault.setPart("myname",obj) 将复杂的嵌套故障类型传递给 BPEL,但我不知道如何从 BPELFault 中提取它,因为 BPEL 看不到“动态”部分。代码和消息对于我的目的来说已经足够了。

【讨论】:

  • 看看故障策略,我不确定你是否可以将它与 bpelx:exec 一起使用,它们非常适合用于人类干预。这是我在上面写的一个旧博客。 halfdecentoracle.blogspot.com/2007/08/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
相关资源
最近更新 更多