2011-06-14 63 views
1

我正在通過bpelx:exec從BPEL調用一個java類。如果該類能夠拋出一個特定的Fault(從其合作伙伴鏈接之一已知BPEL),它將簡化很多事情。我們稱之爲AdapterFault。 AdapterFault由wsimport和子類Exception生成。Oracle BPEL服務器:如何從BPEL Java調出中拋出錯誤?

這裏的嵌入式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拒絕部署抱怨例外是未捕獲的。 Java標註步驟似乎只聲明瞭BPELFault。

我只能拋出RuntimeException,它轉到CatchAll塊而不是catch(AdapterFault)。

是否有一個簡單的方法來從java調出中拋出一個檢查錯誤?

+0

哪個版本,你的意思是一個WSIF綁定或bpelx:exec? – oluies 2011-06-14 13:50:12

+0

對不起,bpelx:exec。 – 2011-06-14 14:26:45

回答

1

只有BPELFault可以拋出:

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

但它可能包括嵌套部分,這是「真正」的例外,它可以在Catch區塊中提取k並重新拋出,如果需要的話。

我今天實施了。

陷阱:

  • Catch塊應該捕獲系統例外之一,例如remoteFault。
  • RuntimeFault.wsdl應進口(WSDL:進口)到合作伙伴的WSDL之一,否則一個討厭的錯誤說BPELFault沒有找到,將會拋出

BPELFault是相當有限的,它只能有代碼,消息和細節元素,所有純文本。通過bpelFault.setPart(「myname」,obj)將複雜的嵌套錯誤類型傳遞給BPEL是可能的,但我不知道如何從BPELFault中提取它,因爲BPEL沒有看到「動態」部分。代碼和消息對我來說已經足夠了。

+1

查看故障策略,我也不確定您是否可以使用bpelx:exec,它們非常適合用於人類干預。這是一個我曾經做過的博客。 http://halfdecentoracle.blogspot.com/2007/08/soa-suite-10133-remote-fault-policies.html – oluies 2011-06-16 16:57:23

1

如果是WSIF綁定,則在「異常處理」標題下有指令here,但該文章相當陳舊。

對於bpelx:EXEC(我覺得)你需要捕捉塊中的異常,並更新變量作爲這樣

嘗試{
...做的事情

} 趕上( Exception ex){

addAuditTrailEntry(「Exception message:」+ ex.getMessage());

setVariableData( 「V_CreateServiceException」,...

}

}

+0

謝謝,但WSIF似乎是一個簡單標註的矯枉過正。如果沒有其他解決方案存在,可以走這條路線。 – 2011-06-14 14:27:22