Тайм-аут OpenEdge AppServer

Я использую старый добрый OpenEdge AppServer (не PAS) 11.7, используя сгенерированную DLL-прокси (генератор прокси-серверов для открытых клиентов) для C#.

Это работает довольно хорошо, за исключением установки тайм-аута для соединений. Если я вызываю функцию, используя этот прокси, я хочу установить тайм-аут, чтобы вызов не удался (например, путем создания исключения)

Я пробовал следовать Progress.Open4GL.RunTimeProperties

RunTimeProperties.ConnectionTimeout
Недокументировано. Не делает то, что следует из названия

RunTimeProperties.SocketTimeout = 8000;
Не документировано. Значение по умолчанию – 0. Скорее всего, значение равно миллисекундам
Приближаемся к этому параметру. Если время выполнения вызываемой функции превышает это значение, выдается Progress.Open4GL.Exceptions.Open4GLException.

НО: он выдает только тогда, когда вызывающая функция возвращается, поэтому он совершенно бесполезен. Легко проверить, добавив «PAUSE 100» к вызываемой функции. Через 100 секунд возникает исключение (а не через 8 секунд)

Как реализовать таймаут для вызова функции?


person TomB    schedule 28.05.2020    source источник


Ответы (1)


Вроде, как бы, что-то вроде...

Вы можете установить глобальное время ожидания для вызовов сервера приложений. Но не функция по тайм-ауту функции.

Согласно https://knowledgebase.progress.com/articles/Article/P174143

Для достижения этой цели в OpenEdge 10.2B были введены две новые функции либо на уровне блока процедур, либо на уровне сервера приложений.

На уровне блока процедур:

Первый способ ограничения вызовов процедур по времени заключается в использовании фразы STOP-AFTER. Эта фраза определяет значение тайм-аута для блоков DO, FOR или REPEAT. Целочисленное выражение, указывающее количество секунд, которое есть у каждой итерации блока до истечения времени ожидания. Если происходит тайм-аут, AVM вызывает условие STOP.

На уровне сервера приложений:

Другой способ ограничить время выполнения вызовов процедур — установить свойство srvrExecutionTimeLimit в глобальном [UBroker] или конкретном разделе [UBroker.] файла ubroker.properties. Это неотрицательное целочисленное свойство, указывающее максимальное время в секундах, в течение которого удаленная процедура может выполняться на данном AppServer. Это значение тайм-аута применяется ко всем удаленным процедурам, которые выполняются на сервере приложений. Значение по умолчанию равно нулю, что указывает на отсутствие ограничения по времени. Свойство AppServer srvrExecutionTimeLimit управляет только временем выполнения процедуры на удаленном AppServer. Передача данных между клиентом и конечными точками AppServer не учитывает время выполнения процедуры.

STOP-AFTER, по-видимому, не прерывает большинство операторов. Кажется, что это проверяется между утверждениями. Рассмотрим следующее:

etime( yes ).

repeat stop-after 5 on stop undo, leave:

  pause 1.
  pause 1.
  pause 1.
  pause 1.
  pause 1.
  pause 1.
  pause 1.
  pause 1.
  pause 1.
  pause 1.

end.

display etime.
pause.

vs.

etime( yes ).

repeat stop-after 5 on stop undo, leave:

  pause 10.

end.

display etime.
pause.

vs.

etime( yes ).

repeat stop-after 5 on stop undo, leave:

  pause 1.

end.

display etime.
pause.

Таким образом, в зависимости от того, что на самом деле делает ваш код сервера приложений, это может помочь или не помочь.

person Tom Bascom    schedule 28.05.2020
comment
Спасибо за ваш ответ, но он не решает проблему. Ubroker srvrExecutionTimeLimit ограничивает вызов, но только после завершения функции. Такое же поведение, как описано для RunTimeProperties.SocketTimeout. - person TomB; 28.05.2020
comment
Возможно, вам следует добавить STOP-AFTER в код на стороне сервера приложений? Или проблема в том, что вам нужен сторонний компонент для тайм-аута? Если вам нужен тайм-аут в стороннем компоненте, список прогресса не поможет. В документации это особо отмечается. - person Tom Bascom; 28.05.2020
comment
Я использую C# и клиентский прокси, сгенерированный Proxy Generator for Open Clients. Код прогресса не вызывается напрямую. Даже окружение каждой функции, например. DO STOP-AFTER 10... применяется только после завершения выполнения - person TomB; 28.05.2020
comment
Разве нет старого доброго сервера приложений Progress с кодом Progress 4gl? У меня сложилось впечатление, что вы пытаетесь прервать код 4gl, работающий на обычном старом сервере приложений, который вы вызываете (через прокси) из клиента C#. Я неправильно понял? - person Tom Bascom; 28.05.2020
comment
Нет C# --> ProgressProxyFor.Net --> AppServer --> Код выполнения‹br/› ProgressProxyFor.Net нужно остановить через x секунд.‹br/› Попробуйте DO STOP-AFTER 5: PAUSE 10. DISP bla . КОНЕЦ. Он ждет 10 секунд, но не отображает bla, поэтому остановка после совершенно бесполезна. - person TomB; 29.05.2020
comment
PAUSE 10 не прерывается. См. выше. - person Tom Bascom; 29.05.2020