Как при использовании SAP JCO (v3.0) обрабатывать исключение во время JCoContext.end()?

Все,

В настоящее время мы разработали клиентское приложение Java, которое взаимодействует с SAP через API JCO v3.0. Во время вызова с отслеживанием состояния, когда вызываются несколько функций BAPI, мы используем класс JCoContext для установления сеанса с отслеживанием состояния. Мы вызываем JCoContext.begin() перед выполнением JCoFunctions и JCoContext.end() в блоке finally после завершения всех функций.

Проблема возникает в JCoContext.end(). Потенциально это может вызвать JCoException. В документации не очень ясно, почему может возникнуть исключение или как с ним справиться. При тестировании мне удалось наблюдать исключение, когда в метод JCoContext.end() передается пункт назначения NULL. Хотя это может произойти, это определенно не произойдет в нашем производственном коде. Итак, остается вопрос, есть ли какие-либо другие причины, по которым может быть возбуждено исключение?

Кроме того, я наблюдал странное поведение, если метод JCoContext.end() не вызывается. В этих случаях я видел, как последующие вызовы BAPI не завершались успешно. Это указывает мне на то, что если метод end() не завершится успешно, он может оставить JCo в плохом состоянии. Итак, как нам обрабатывать возникающее здесь исключение. Какие ресурсы есть у меня как у разработчика? Похоже, единственная гарантия, которая у меня есть, это закрыть программу.

Дайте мне знать, если у вас есть какие-либо идеи, спасибо,

Пол Мэннинг


person g8torPaul    schedule 19.01.2016    source источник


Ответы (2)


На вопрос ответил сотрудник SAP на форумах SCN. Я запостил туда проблему. Вот ссылка:

Вопрос форума SAP: SAP JCo: как обрабатывать исключение, вызванное JCoContext.end()

Подводя итог, можно сказать, что метод JCoContext.end() должен вызывать исключение только в том случае, если переданный параметр "destination" имеет значение NULL или в JCO SAP имеется ошибка. Итак, вы должны убедиться, что «назначение» не равно нулю. Если вы столкнулись с другой проблемой, отправьте запрос в службу поддержки SAP.

Конец связи.

-Павел

person g8torPaul    schedule 21.01.2016

Базовое понимание исключений JCo можно получить с помощью это описание. В документации SAP указан этот стиль обработки исключений. :

JCoDestination destination = JCoDestinationManager.getDestination("<destination>");

try
{
    JCoContext.begin(destination);
    function1.execute(destination);
    function2.execute(destination);
    functionBapiTransactionCommit.execute(destination);
}
catch (AbapException ex)
{
    ...
}
catch (JCoException ex)
{
    ...
}
catch (Exception ex)
{
    ...
}
finally
{
    JCoContext.end(destination);
}
person Suncatcher    schedule 20.01.2016
comment
Шаблонный код, который вы только что опубликовали, идет с JCO в качестве примера, и совершенно ясно, что он не отвечает на мой вопрос. Ваш блок finally вызывает метод end() JCoContext, но не перехватывает там никаких исключений. Ваше утверждение о том, что метод end() не генерирует исключений, неверно. В документе API для метода end() указано: ....JCoException - в случае, если при освобождении/закрытии соединения возникает проблема. Если это происходит в опубликованном вами коде, это исключение будет иметь приоритет над любым предыдущим исключением во время методов execute() над ним. - person g8torPaul; 20.01.2016
comment
Да, я признаю, что ошибался. Вы используете оператор eng() внутри блока finally? Может быть, это исключение вызвано предыдущим исключением, выброшенным в блоке catch, который был скрыт? - person Suncatcher; 21.01.2016
comment
Метод end() вызывается во время блока finally (что было указано в моем исходном сообщении и снова в коде, который вы разместили). Я конкретно говорю о потенциальном исключении, вызванном методом end(). При каких условиях этот метод вызывает исключение? Если возникло исключение, LUW в SAP не будет завершен. Это было бы плохо. Похоже, что в JCO нет API для решения этой проблемы. Отсюда мой первоначальный вопрос. Я надеялся, что кто-то с глубоким пониманием кода JCO/SAP поможет здесь. Если у вас нет таких знаний, не отвечайте на этот пост. - person g8torPaul; 21.01.2016