Хранение данных SAP RFC для последовательных вызовов RFC с использованием JCO

Мне было интересно, можно ли сохранить RFC, вызываемый через JCO, открытым в памяти SAP, чтобы я мог кэшировать материал, это сценарий, который я имею в виду:

Предположим, что простая функция увеличивает число. Функция начинается с 0, поэтому при первом вызове с параметром импорта 1 она должна вернуть 1.

Во второй раз, когда я его вызываю, он должен вернуть 2 и так далее.

Возможно ли это с JCO?

Если у меня есть объект функции и я делаю два последовательных вызова, он всегда возвращает 1.

Могу я делать то, что изображаю?


person Carlos DaSilva    schedule 10.07.2015    source источник


Ответы (2)


Создание приложения, ориентированного на стабильность определенного соединения, почти никогда не бывает хорошей идеей (если вы не создаете программное обеспечение для мониторинга стабильности). Создайте свое программное обеспечение так, чтобы оно просто работало, независимо от того, как часто соединение закрывается и повторно открывается, и независимо от того, как часто сеанс инициализируется и уничтожается на стороне сервера. Вы можете захотеть сохранить какое-то состояние, используя базу данных, или вам может потребоваться (или вы захотите) использовать механизмы разделяемой памяти, предоставляемые системой. Все это несущественно для самой обработки RFC.

Обратите внимание, однако, что вам может потребоваться обеспечить, чтобы последовательность вызовов происходила в одном контексте или «бизнес-транзакции». См. это вопрос и мой ответ для примера. Эти контексты недолговечны и позволяют реализовать то, что вы, вероятно, изначально намеревались получить - просто имейте в виду, что вы не должны разрабатывать свое приложение так, чтобы оно сохраняло эти контексты в течение минут или часов.

person vwegert    schedule 10.07.2015

Ответ положительный. Для того, чтобы он заработал, нужно реализовать две задачи:

  1. Код ABAP должен сохранять свою переменную в памяти сеанса ABAP. Это будет делать переменная в глобальном разделе функциональной группы. Или, в качестве альтернативы, вы можете использовать стандартную технику ABAP «ЭКСПОРТ В ПАМЯТЬ / ИМПОРТ ИЗ ПАМЯТИ».
  2. JCo необходимо поддерживать сеанс пользователя между вызовами. По умолчанию JCo сбрасывает сеанс пользователя на стороне сервера после каждого вызова, что, конечно же, уничтожает все данные, хранящиеся в памяти этого сеанса пользователя. Чтобы предотвратить это, вам необходимо использовать JCoContext.begin () и JCoContext.end (), чтобы получить RFC-соединение с отслеживанием состояния, которое поддерживает сеанс пользователя на внутренней стороне.

Образец кода:

JCoDestination dest = ...
JCoFunction func = ...
try{
   JCoContext.begin(dest);
   func.execute(dest); // Will return "1"
   func.execute(dest); // Will return "2"
}
catch (JCoException e){
   // Handle network problems, ABAP exceptions, SYSTEM_FAILUREs
}
finally{
   // Make sure to release the stateful connection, otherwise you have
   // a resource-leak in your program and on backend side!
   JCoContext.end(dest);
}
person Lanzelot    schedule 17.04.2020