ABAP Daemon – 具有无限生命周期的 ABAP 会话

原文地址:ABAP Daemon – ABAP Session with unlimited lifetime

一、概述

ABAP 守护进程 – 持久的 ABAP 会话!

您是否曾经感觉需要使用具有无限生命周期的会话来处理事件?

最近,我发现 SAP HANA 中提供了名为ABAP Daemon 的新功能。它可从系统 SAP HANA 1709(AS ABAP 7.52) 获取。1809 年添加了进一步的修改,即启动配置。

在SAP 中,大多数应用程序使用批处理作业或基于会话的轮询技术来检测系统中的事件(例如创建/更新/删除),然后应用接下来所需的步骤。这些技术并不完全可靠,有时可能由于错误/短转储/中断而失败。守护进程提供了更可靠的事件处理方式。

假设您想要在系统中创建一些事件或文档后执行一些活动。在这种情况下,可以通过向守护进程实例发送消息来将需要执行的下一个活动传递给守护进程。

我的下一篇博客中解释了一个业务案例示例实施 ADF:ABAP 守护进程框架
现在,让我们详细介绍 ABAP 守护进程。

二、什么是ABAP Daemon?

  1. ABAP Daemon是一个 ABAP 会话,可用于以非常可靠的方式进行事件处理并在其间保持状态。它是一个基于Linux守护进程或窗口服务的概念。

  2. 它也可以称为持久的 ABAP 会话,因为一旦启动,这种 ABAP 会话的生命周期就没有限制,这与 RFC、HTTP、GUI 等其他会话类型相反。

  3. ABAP Daemon会话对于错误具有鲁棒性,即每次运行时错误或类型 E、 A或 X的消息导致守护进程会话终止程序时,守护进程会话都会立即自动重新启动。

  4. 当某个守护进程的应用服务器关闭时,可以通过创建一个包含与前一个守护进程相同的上下文信息的新守护进程,将该守护进程移动到另一个应用服务器。这使得新的守护进程能够完成相同的工作。

  5. ABAP Daemon是 ABAP Daemon类的实例,它保存在特殊的 ABAP Daemon session。

SAP 将其作为ABAP Daemon程序框架 (ADF-ABAP Daemon framework)提供,其中包含下面描述的事件处理程序 API 方法。为了实现 ADF,必须继承类 CL_ABAP_DAEMON_EXT_BASE

这些 ADF 方法由 Daemon Manager 类CL_ABAP_DAEMON_CLIENT_MANAGER 的方法调用。

这两个类的详细信息如下:
在这里插入图片描述
让我们看看 API 中有哪些可用的方法:
在这里插入图片描述

  1. 方法ON_ACCEPT:这是第一个执行的方法,允许应用程序接受或拒绝 ABAP 守护程序应用程序的实例化。通过设置导出参数e_setup_mode(1=接受,2=拒绝,3=服务器关闭,4=系统关闭5=达到最大守护进程,1000=拒绝偏移量),可以接受或拒绝创建。该方法由Daemon调用管理器类 CL_ABAP_DAEMON_CLIENT_MANAGER 的方法START

  2. 方法ON_START:仅在接受守护程序启动后(ON_ACCEPT)只执行一次

  3. 方法ON_MESSAGE:每次守护进程收到客户端应用程序通过关联的守护进程实例 ID 发送的消息时执行。该方法由 Daemon Manager 类中的方法ATTACH & SEND (接口 IF_ABAP_DAEMON_HANDLE )调用。

  4. 方法ON_STOP :当使用ABAP Daemon Manager 类中的STOP方法停止守护程序时执行。

  5. 方法ON_ERROR:如果守护进程因错误(例如 E/A/X 类型的消息)而重新启动,则执行。如果在执行 ON_ERROR 方法期间发生错误,则后续 ON_ERROR 执行将延迟大约 10 分钟。30秒以避免ON_ERROR处理的繁忙循环。延迟值不可配置

  6. 方法ON_RESTART:守护程序应用程序可以重新创建其守护程序上下文(类似于方法 ON_START 和 ON_ERROR)。

  7. 方法ON_BEFORE_RESTART_BY_SYSTEM:在守护程序中检测到不一致状态时执行。当守护程序使用的程序被修改并需要重新加载时,可能会发生这种情况。

  8. 方法ON_SERVER_SHUTDOWN:当前应用服务器关闭时执行。可以实现此方法,以便通过在此处使用相同的上下文信息启动新的守护程序,将守护程序移动到另一个可用的应用程序服务器(如果可用)。执行该方法后,守护进程会自动停止。

  9. 方法ON_SYSTEM_SHUTDOWN:当前 AS ABAP 关闭时执行。处理此方法后,守护进程立即停止。

三、限制

由于某些ABAP语句会导致守护进程阻塞到达事件的执行,因此ABAP守护进程使用适应的非阻塞编程模式。在此编程模型中,大多数阻塞ABAP语句(例如SUBMIT、CALL TRANSACTION、WAIT、CALL SCREEN等)都是不允许的,使用将导致运行时错误ABAP_DAEMON_ILLEGAL_STATEMENT。同步远程函数调用 (sRFC) 是一个例外:允许 ABAP 守护进程使用同步 RFC(CALL FUNCTION func DESTINATION dest)和异步(CALL FUNCTION func STARTING NEW TASK task)。

四、守护进程上下文信息

除了方法 ON_ACCEPT 之外,所有方法都包含引用接口 IF_ABAP_DAEMON_CONTEXT 的参数,该接口可用于获取上下文信息并将上下文数据保存/恢复到最大 1 MB 的 ABAP 守护进程内存区域。

注意:ABAP Daemon 内存是用户内存的一个子区域,ABAP Daemon 可以在其中以 PCP(推送通道协议Push Channel Protocol)格式保存上下文信息。
在这里插入图片描述
参考文献:会话和内存区域Sessions and Memory Areas(AS ABAP 752)
在这里插入图片描述

  1. 方法:GET_START_PARAMETER:提供推送通道协议 (PCP) 消息,该消息由客户端在 ABAP 守护进程启动期间指定。 您也可以在使用 I_CONTEXT_BASE参数的ON_ACCEPT方法中使用此方法 。

  2. 方法GET_START_CALLER_INFO:提供有关调用者上下文的信息,例如客户端、用户名或程序。例如,您可以在 ON_ACCEPT 方法中使用 I_CONTEXT_BASE 参数来检查访问权限。

  3. 方法:SET_APPLICATION_PARAMETERGET_APPLICATION_PARAMETER:提供保存和检索大约 1 非常有限的大小的可能性。ABAP 守护程序会话内存中 1 MB 的信息。此信息在 ABAP 守护程序实例的整个生命周期内保留,即使在重新启动和出现错误情况后也是如此。

  4. 方法:GET_INSTANCE_ID:提供用于向此守护程序发送消息的实例 ID(使用类 CL_ABAP_DAEMON_CLIENT_MANAGER)。

  5. RESTART方法:导致 ABAP Daemon重新启动。这包括释放 ABAP 内存和处理 ON_RESTART方法

  6. 方法STOP:终止 ABAP Daemon实例。这将触发方法 ON_STOP。

五、使用 ABAP Daemon Manager 与守护进程交互

应用程序可以使用类 CL_ABAP_DAEMON_CLIENT_MANAGER 与Daemon进程交互。
在这里插入图片描述

  1. 方法START:ABAP Daemon 应用程序可以使用此方法启动。当守护进程启动时,将打开一个新的 ABAP 守护进程会话,其客户端 ID 由当前用户会话采用,其用户名和登录语言由可传递给输入参数 I_DESTINATION 的 RFC 目标确定(这是可选的) 。

  2. 方法STOP:可以使用此方法停止守护程序应用程序。

  3. 方法ATTACH:使用 Daemon 句柄的 Send 方法将消息发送到 Daemon 应用程序实例。ABAP Daemon句柄是一个实现接口IF_ABAP_DAEMON_HANDLE的对象。它是使用 ATTACH 方法从守护进程实例 ID 获取的。

注意:守护进程使用 PCP(推送通道协议)格式在会话之间传输消息并保持状态。

  1. 方法GET_DAEMON_INFO:返回传递给输入参数 I_CLASS_NAME 的 Daemon 类的当前 AS-ABAP 服务器中所有 Daemon 的信息。

事务代码:SMDAEMON - Daemon进程监控:
在这里插入图片描述
ABAP Daemon Class Name:它告诉ABAP Daemon的实现类(CL_ABAP_DAEMON_EXT_BASE)的名称。

ABAP Daemon进程会话 ID: ABAP 守护进程会话的唯一密钥。

ABAP Daemon进程名称:它有一个非唯一的技术名称,由启动守护进程的应用程序设置。该名称用于标识 ABAP 守护进程或一组多个 ABAP 守护进程。

ABAP Daemon状态:正在运行的 ABAP 守护程序当前所处的状态。

这些状态可以是以下几种:

正在初始化(Initializing):ABAP 守护进程已创建并将启动。

启动(Starting):ABAP 守护进程的首次启动。守护进程正在处理“ON_START”事件。

处理(Processing):ABAP 守护进程正在处理一个事件。添加“ restart imminent ”表示守护进程正在处理“ON_BEFORE_RESTART_BY_SYSTEM”事件,处理完该事件后将重新启动。

重新启动(Restarting):重新启动ABAP守护进程。重新启动后,守护进程将处理“ON_RESTART”事件。添加“ after error ”表示发生错误,需要重新启动守护进程。重新启动后,守护进程将处理“ON_ERROR”事件。

停止(Stopping):ABAP 守护进程在处理完当前事件后将停止。

在 期间等待(Waiting during):在处理 ABAP 守护程序事件时,守护程序正在等待。ABAP Daemon 会话当前未在任何工作进程中运行。 显示守护程序在更改为等待状态之前的状态。

空闲(Idle):ABAP 守护进程未处理任何事件,并且 ABAP 守护进程会话当前未在任何工作进程中运行。守护进程已准备好接收下一个 ABAP 守护进程事件或在非守护进程事件期间等待。

其他名词解释:
死亡:ABAP 守护进程会话意外结束。

客户端:运行守护程序的客户端。

用户:运行 ABAP 守护进程会话的用户名。

创建时间:创建 ABAP 守护程序的日期和时间。

Autostart:指示ABAP Daemon是否已被系统自动启动。

事件:ABAP 守护程序处理的特定于守护程序的事件数。

错误:ABAP 守护程序错误数。

Code of Last error:最后一次ABAP Daemon错误的错误代码。可以显示以下错误代码:

100:其他错误
101:E信息(发生程序错误)
102:一条消息(程序被终止)
103:X消息(发生ABAP运行时错误,程序被终止)
104:会话取消

上次错误原因:上次识别的 ABAP 守护程序错误发生的原因。

错误时间:最后一次 ABAP 守护程序错误发生的日期和时间。

单击ABAP Daemon 对应的session ID超链接,您将获得每个守护进程实例的更多详细信息:
在这里插入图片描述
在这里插入图片描述

注意:使用重新启动守护程序软件,可以使用事务 SMDAEMON 触发守护程序实例的和ON_RESTART方法。为了更好地理解,我实现了一个原型。完整的实现将在下一篇博客中通过示例进行描述。它展示了与接口技术的集成: AIF(应用程序接口框架)、IDOC、ABAP Daemon、电子邮件等。

请查看博客:实施 ADF:ABAP 守护进程框架Implement ADF: ABAP Daemon Framework

优点

守护进程对于事件处理非常有用且可靠,因为:ABAP Daemon 会话的生命周期没有限制。每次运行时或 E、 A或 X类型的消息 导致 ABAP 守护程序终止程序时,都会自动重新创建 ABAP 守护程序。

当某个守护进程的应用服务器关闭时,可以通过创建一个包含与前一个守护进程相同的上下文信息的新守护进程,将该守护进程移动到另一个应用服务器。这使得新的守护进程能够完成相同的工作。

随着ABAP Channels的开始,越来越多的轮询技术被近实时事件所取代。要订阅这些事件,需要一个长期存在的会话,该会话对于任何类型的错误都具有弹性。ABAP 守护进程提供了这个基础。

  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝袍先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值