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",...

}

}

Другие вопросы по тегам