Oracle BPEL Server: как выдать ошибку из вызова BPEL Java?

Я вызываю класс Java из BPEL через bpelx:exec. Было бы намного проще, если бы класс мог генерировать конкретную ошибку (известную BPEL по одной из партнерских ссылок). Назовем его AdapterFault. AdapterFault генерируется wsimport и подклассами Exception.

Вот код внутри блока 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?


person Vladimir Dyuzhev    schedule 14.06.2011    source источник
comment
Какую версию вы имеете в виду привязку WSIF или bpelx:exec?   -  person oluies    schedule 14.06.2011


Ответы (2)


Если это привязка WSIF, инструкции приведены здесь в разделе "Обработка исключений". ", но эта статья довольно старая.

Для bpelx:exec (я думаю) вам нужно поймать исключение внутри блока и обновить переменную как таковую.

попробуй {
... сделай что-нибудь

} поймать (исключение) {

addAuditTrailEntry("Сообщение об исключении: " + ex.getMessage());

setVariableData("V_CreateServiceException",...

}

}

person oluies    schedule 14.06.2011
comment
Спасибо, но WSIF кажется излишним для простой выноски. Можно пойти по этому пути, если другого решения не существует. - person Vladimir Dyuzhev; 14.06.2011

Можно выдать только BPELFault:

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

Но он может включать вложенную часть, которая является «настоящим» исключением, которое можно извлечь в блоке Catch и повторно сгенерировать, если это необходимо.

Я реализовал это сегодня.

Гочки:

  • Блок catch должен перехватывать одно из системных исключений, например. удаленная ошибка.
  • RuntimeFault.wsdl должен быть импортирован (wsdl:import) в один из партнерских WSDL, в противном случае будет выдана неприятная ошибка о том, что BPELFault не найден.

BPELFault довольно ограничен в том смысле, что он может содержать только элементы кода, сообщений и деталей, все в виде простого текста. Передача сложного вложенного типа сбоя в BPEL возможна через bpelFault.setPart("myname",obj), но я не знаю, как извлечь его из BPELFault, поскольку BPEL не видит "динамических" частей. Однако для моих целей достаточно кода и сообщения.

person Vladimir Dyuzhev    schedule 14.06.2011
comment
Взгляните также на политики ошибок, я не уверен, что вы можете использовать их вместе с bpelx:exec, их довольно удобно использовать для вмешательства человека. Вот старый блог, который я сделал на этом. halfdecentoracle.blogspot.com/2007/08/ - person oluies; 16.06.2011