Oracle BPEL Server: как вызвать сбой из вызова BPEL Java?
Я вызываю Java-класс из BPEL через bpelx:exec. Это значительно упростило бы ситуацию, если бы класс смог выдать конкретный сбой (известный BPEL по одной из партнерских ссылок). Давайте назовем это AdapterFault. AdapterFault генерируется исключением wsimport и подклассами.
Вот код в блоке Embedded 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?
2 ответа
Только BPELFault может быть брошено:
http://forums.oracle.com/forums/thread.jspa?threadID=547192
Но он может включать в себя вложенную часть, которая является "настоящим" исключением, которое может быть извлечено в блоке Catch и повторно выброшено, если требуется.
Я реализовал это сегодня.
Gotchas:
- Блок Catch должен перехватить одно из системных исключений, например, remoteFault.
- RuntimeFault.wsdl должен быть импортирован (wsdl:import) в один из WSDL-партнеров, в противном случае будет выдано неприятное сообщение о том, что BPELFault не найден.
BPELFault довольно ограничен в том, что он может иметь только элементы кода, сообщения и подробности, все в виде простого текста. Передача сложного вложенного типа ошибки в BPEL возможна через bpelFault.setPart("myname",obj), но я не знаю, как извлечь его из BPELFault, поскольку BPEL не видит "динамических" частей. Код и сообщение достаточно для моих целей, хотя.
Если это привязка WSIF, здесь есть инструкции под заголовком "Обработка исключений", но эта статья довольно старая.
Для bpelx:exec (я думаю) вам нужно перехватить исключение внутри блока и обновить переменную как таковую
пытаться {
... заниматься вещами} catch(Exex ex) {
addAuditTrailEntry ("Сообщение об исключении:" + ex.getMessage ());
setVariableData ("V_CreateServiceException",...
}
}