これは質問のバリエーションです。Camelの CXF コンポーネントで onException(Exception.class) をキャッチしないで質問しました。
上記でClausが提案したソリューションを実装しましたが、機能しません。グローバル レベルで HandleFault = true を設定したときに onCompletion がトリガーされる理由がわかりません。
コードを大幅に変更したため、同じ質問をしますが、いくつか変更があります。
私のルートは次のようになります: ルート 1(camel-cxf エンドポイント) -> ルート 2(直接) -> ルート 3(直接)。ルート 3 では、ランタイム例外である WebApplicationException をスローしています (これを MyWSException でラップしています)。
コンテキスト レベルで HandleFault を true に設定しました。
getContext().setHandleFault(true);
グローバル レベルでの onException ハンドルは次のようになります。
onException(Exception.class, MyWSException.class)
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("In onException Exception and IServicesWSException");
}
})
.to("direct:IServicesWSExceptionHandler");
私はまた、このように見えるローカルのもの(ルート固有)を持っています。
from("cxf:bean:ordermanagementservice")
.routeId("ordermanagementservice")
.startupOrder(2)
.onException(Throwable.class)
.handled(true)
.setBody().simple(PROCESS_RESULT_FAILED)
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(AuditConstants.AUDIT_MAP_KEY.getValue(), AuditParam.AUDIT_ATTR_STATUS_ORDER);
}
})
.beanRef("AuditManager", "audit")
.to("direct:IServicesWSExceptionHandler")
.end()
私の onCompletion(ルート固有) は次のようになります。
.onCompletion()
.setBody().simple(PROCESS_RESULT_SUCCESS)
.process(new Processor(){
@Override
public void process(Exchange exchange) throws Exception {
exchange.getIn().setHeader(AuditConstants.AUDIT_MAP_KEY.getValue(), AuditParam.AUDIT_ATTR_STATUS_ORDER);
}
})
.beanRef("AuditManager", "audit")
.end()
助けてください。質問が重複していると思われる場合は、お詫び申し上げます。非常に絶望的です。
前もって感謝します。