当前位置: 首页 > Linux

SAPABAPDaemon(ABAPDaemon)的实现

时间:2023-04-06 20:00:17 Linux

Jerry本科学习《计算机操作系统》的时候了解了daemon的概念。那时,我们开始从Linux操作系统中的守护进程学习这个概念:Linux守护进程是一个特殊的进程,它运行在后台,独立于控制终端,周期性地执行某些任务,或者等待一些即将发生的事件待处理。Linux系统中的很多服务都是通过守护进程实现的。常见的守护进程有系统日志进程syslogd、web服务器httpd、邮件服务器sendmail、数据库服务器mysqld。当时Jerry正在上这门专业课的时候,《暗黑破坏神II》在国内各大高校的战网上如火如荼。Jerry和其他暗黑爱好者一样,天天在战网上用KB和KC来刷自己的暴皮。暗黑破坏神II中有很多武器可以对恶魔造成额外伤害。比如下面用符文语言Grief制作的魔刃,对恶魔生物造成185%的额外伤害:杰瑞当时在战网上刷怪的时候,我就想,Linuxdaemon的名字怎么这么酷?恶魔进程-恶魔进程。第二天,我打开课本仔细看了看。我顿时尴尬了。原来daemon进程的英文名称应该是DaemonProcess...那么具有daemon进程特性的报表可以在ABAP中实现吗?这个需求翻译成ABAP术语,就是说有没有可能开发出满足以下特点的ABAP程序?终端(SAPGUI或ABAPDevelopmentTool)关闭后,仍然可以继续运行,可以继续接收用户输入,处理并推送结果给用户。很多朋友肯定很快就会想到ABAP后台作业。没错,开发一个ABAP报表作为后台作业启动,确实可以达到逃离终端的效果。但是,这种后台作业无法再以正常方式接受用户输入。比较麻烦的方案是采用生产者-消费者的思想,定义一张数据库表,作为任务队列;用户向数据库表中插入请求,后台作业程序定期查询数据库表,如果不为空,则取出请求进行处理。另一种思路是在事务代码SICF中新建一个节点,在其handler类中编写处理逻辑,让消费者向ICF节点负责的url发送HTTP请求,并接收处理结果。在Jerry之前的文章中,一位13年ABAP老手的建议:了解这些基础知识,对ABAP开发有百利而无一害。据介绍,ABAP服务器通过HTTP与外界进行交互,会经过InternetCommunicationManager(ICM)模块。这样实现的ABAP程序表面上勉强模仿了守护进程的效果,但是请求处理的性能与真正的守护进程相去甚远,本质上是借助于Web服务器实现的。好消息是,在SAP2018年发布的ABAPPlatform1809中,提到了一些令人兴奋的新特性,例如对工业物联网和机器对机器通信的增强、MQTT的引入以及对ABAP的Native支持的引入守护进程。在本文中,我们使用ABAP平台1809新推出的ABAPMQTT和ABAPDaemons来实现一个HelloWorld级别的ABAPdaemon。MQTT(MessageQueuingTelemetryTransport)是一种基于发布/订阅模型的轻量级通信协议。它建立在TCP/IP协议之上。、小型设备、移动应用等应用广泛。更多ABAP平台1809的新特性可以参考SAP社区博客:https://blogs.sap.com/2018/10...ABAP守护进程与MQTT息息相关,所以我们先来了解一下新特性ABAP平台的特性1809引入了对MQTT的支持。设想一个简单的“一问一答”场景,在ABAP平台上开发一个MQTT客户端,向第三方MQTT代理(代理)发送消息,并接收其回复。新建一个ABAP类,实现SAP标准接口IF_MQTT_EVENT_HANDLER对应的方法。至于MQTTbroker,我选择了一个基于HiveMQ的公共Broker:broker.mqttdashboard.com,你可以使用下面这个用webSocket实现的MQTT客户端来操作broker:http://www.hivemq.com/demos/w。..该经纪人专门用于测试目的。收到MQTT消息后,会原封不动的回复发送者。在ABAP类的构造函数中连接MQTT代理,将返回的MQTT客户端实例保存在类的成员变量mo_mqtt_client中,然后使用实例的publish方法发送消息,subscribe方法订阅消息,on_message方法接收消息。打开MQTT客户端,订阅频道:abaptopic/jerry/test然后我先在第66行发送一个HelloWorld消息到这个频道,broker收到后会原封不动的返回,但是因为我的ABAP类没有订阅此频道,因此不会收到对此helloworld消息的回复。在第68行订阅频道后,第69行向代理发送第二条消息,这次将收到回复。回到broker客户端,看到ABAP端发来的两条消息:回到ABAP端,看到代码第69行发来的第二条消息的回复:弄清楚ABAPMQTT的用法后,我们就可以开始了开发了ABAP守护进程。虽然ABAP守护进程并没有直接使用MQTT与用户进行交互,但是掌握这种消息通知机制的用法也有助于我们理解ABAP守护进程的工作原理。新建ABAP类zcl_jerry_simple_daemon,父类cl_abap_daemon_ext_base。ON开头的方法继承自基类,即ABAP守护进程生命周期事件发生时,开发者可以实现自定义逻辑的位置。例如,当系统处于SHUTDOWN状态时,开发者实现的ON_SYSTEM_SHUTDOWN方法会在这里被触发并完成daemon进程的清理动作,从而实现优雅退出。最有用的方法无疑是ON_MESSAGE,它是守护进程接收用户输入并做出响应的地方。为了简单起见,我的daemon进程接收到用户输入后,只弹出一个弹出对话框,在SAPGUI中显示:daemon进程是通过框架类cl_abap_daemon_client_manager的start方法启动的,参数lo_pcp由第75行的start方法传入作为daemon启动参数传入,pcp代表PushChannelProtocol,一种用于消息传递的数据结构。使用以下语句启动守护进程并将其命名为jerry_daemon:zcl_jerry_simple_daemon=>start(iv_daemon_name='jerry_daemon')。在事务代码SMDAEMON中可以看到所有正在运行的daemon进程:打开SAPGUI,使用如下方法向jerry_daemon这个ABAPdaemon发送消息时,你会立即在SAPGUI中的daemon的on_message方法中看到弹出的对话框:所以以后如果我们需要开发需要长时间脱离终端运行的ABAP程序,还需要响应用户输入,除了ABAP后台作业和SICF服务之外,还有ABAP守护进程的选项.希望本文介绍的内容对您有所帮助,感谢阅读。获取更多Jerry原创文章,请关注公众号“汪子熙”: