这是Jerry2020年的第34篇文章,也是汪子熙公众号总共第217篇原创文章。 Jerry本科学习《计算机操作系统》这门专业课时,了解到了守护进程的理念,当时我们是从Linux操作系统里的守护进程开始学习这个概念的:Linux守护进程是运行在后台的一种特殊进程,独立于控制终端并且周期性地执行某种任务,或等待处理某些将要发生的事件。Linux系统很多服务都通过守护进程实现,常见的守护进程有系统日志进程syslogd,web服务器httpd,邮件服务器sendmail和数据库服务器mysqld等。 当时Jerry上这门专业课时,《暗黑破坏神II》在国内各大高校的战网上正进行得如火如荼,Jerry也和其他暗黑爱好者一样,天天在战网上KB,KC,刷暴躁外皮。 暗黑破坏神II里有很多对恶魔(Demon)造成额外伤害的武器,比如下面这把用符文之语悔恨(Grief)制成的幻化之刃,对恶魔生物造成额外185伤害: 当时Jerry在战网上刷怪的时候,心想,Linux守护进程的名称咋这么酷?DemonProcess恶魔进程。第二天翻开教材仔细一看,顿时尴尬了,原来守护进程的英文应该是DaemonProcess。。。 那么在ABAP里能否实现具有守护进程特性的报表?这个需求翻译成ABAP的术语,即是否能够开发一个满足下列特征的ABAP程序? 终端(SAPGUI或ABAPDevelopmentTool)关闭后仍然能够继续运行,且能继续接收用户输入,处理并推送结果给用户。 很多朋友一定很快就会想到ABAP后台作业。没错,开发一个ABAP报表,以后台作业的方式启动,的确可以实现脱离终端运行的效果。然而这种后台作业无法再以普通方式接受用户输入,一种比较笨重的解决方式是采取生产者消费者的思路,定义一个数据库表,充当任务队列;用户将请求插入到该数据库表里,而后台作业程序周期性地去查询该数据库表,如果非空,则取出请求并处理。 另一种思路就是在事务码SICF里创建一个新的节点并在其handlerclass里书写处理逻辑,这样消费者可以发送HTTP请求到该ICF节点负责的url,并接收处理结果。 之前Jerry的文章一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害介绍过,ABAP服务器同外界通过HTTP交互,会经过InternetCommunicationManager(ICM)这个模块,通过这种方式实现的ABAP程序,表面上看也勉强模仿了守护进程的效果,但请求处理的性能和真正的守护进程相比相差甚远,并且本质上是借助Web服务器实现的。 一个好消息是,在2018年SAP发布的ABAPPlatform1809中,提到了一些激动人心的新特性,比如针对工业物联网(IndustrialIoT)和MachinetoMachine通信的增强,MQTT的引入,以及对ABAPDaemons的原生支持。 本文我们就用ABAP平台1809新引入的ABAPMQTT和ABAPDaemons来实现一个HelloWorld级别的ABAP守护进程。 MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议)是一种基于发布订阅模式的轻量级通讯协议,构建于TCPIP协议上,因其低开销和低带宽占用的优点,在物联网、小型设备、移动应用等方面应用特别广泛。 关于ABAP平台1809新特性的更多介绍,请参阅SAP社区博客: https:blogs。sap。com20181001abapplatformforsaps4hana1809 ABAP守护进程和MQTT密切相关,因此我们先来了解ABAP平台1809新引入的对MQTT的支持。 设想一个简单的一问一答的场景,在ABAP平台上开发一个MQTT客户端,往第三方的MQTTbroker(代理)发送消息,并接收其回复。 新建一个ABAP类,实现SAP标准接口IFMQTTEVENTHANDLER的对应方法。 至于MQTTbroker,我选择了一个基于HiveMQ的公开Broker:broker。mqttdashboard。com,可以使用下面这个用webSocket实现的MQTT客户端来操作该broker: http:www。hivemq。comdemoswebsocketclient 这个broker专门用于测试用途,收到MQTT消息后,会原封不动地将其回复给发送方。 在ABAP类的构造函数里连接MQTTbroker,把返回的MQTT客户端实例存储在类的成员变量momqttclient里,接下来就能使用该实例的publish方法去发送消息,subscribe方法订阅消息,onmessage方法接收消息。 打开MQTT客户端,订阅渠道:abaptopicjerrytest 接着我首先在第66行,往该渠道发送一条HelloWorld的消息,broker收到后会将其原封不动地返回,但因为我的ABAP类并没有订阅这个渠道,因此不会收到这条helloworld消息的回复。 第68行订阅该渠道后,第69行发送第二条消息给broker,这次就能收到其回复了。 回到broker客户端,看到从ABAP端发送过来的两条消息: 回到ABAP端,看到代码第69行发送的第二条消息的回复: 弄清楚ABAPMQTT的用法之后,我们就可以动手开发ABAP守护进程了。虽然ABAP守护进程并没有直接使用MQTT同使用者进行交互,但是掌握这种消息通知机制的用法,对我们了解ABAP守护进程的工作原理也有帮助。 新建一个ABAP类zcljerrysimpledaemon,将clabapdaemonextbase设置成其父类。 从基类继承的这些ON开头的方法,即ABAP守护进程生命周期事件发生时,开发人员能够实现自定义逻辑的位置,比如在系统SHUTDOWN时,开发人员实现的ONSYSTEMSHUTDOWN方法会触发,在此处完成守护进程的清理动作,实现优雅退出。 而最有用的方法,无疑就是ONMESSAGE,这也是守护进程接收用户输入并响应的地方。 为简单起见,我的守护进程收到用户输入后,仅仅弹出一个弹出对话框,显示在SAPGUI里: 守护进程的启动则通过框架类clabapdaemonclientmanager的start方法实现,第75行start方法传入的参数lopcp作为守护进程启动参数一并传入,pcp代表PushChannelProtocol,一种用于消息传递的数据结构。 使用下列语句启动该守护进程,将其命名为jerrydaemon: start(ivdaemonnamejerrydaemon)。 在事务码SMDAEMON里可以看到所有正在运行的守护进程: 打开SAPGUI,使用如下的方法向jerrydaemon这个ABAP守护进程发送一条消息,会立即在SAPGUI里看到守护进程的onmessage方法里弹出的对话框: 因此将来我们如果遇到需要开发长时间脱离终端运行且仍需响应用户输入的ABAP程序,除了ABAP后台作业和SICF服务外,又多了ABAP守护进程这种选择。 希望本文介绍的内容对你有用,感谢阅读。 更多阅读 Jerry的ABAP,Java和JavaScript乱炖 ABAP开发人员未来应该学些什么 Jerry2017年的五一小长假:8种经典排序算法的ABAP实现 Jerry的ABAP原创技术文章合集 300行ABAP代码实现一个最简单的区块链原型 使用JavaSAP云平台SAPCloudConnector调用ABAPOnPremise系统里的函数 在SAP云平台的CloudFoundry环境下消费ABAPOnPremiseOData服务 ABAPvsJava,蛙泳vs自由泳 聊聊C语言和ABAP 动手使用ABAPChannel开发一些小工具,提升日常工作效率 我用ABAP做过的那些无聊的事情 不喜欢SAPGUI?那试试用Eclipse进行ABAP开发吧 使用VisualStudioCode编写和激活ABAP代码 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧 在SAP云平台ABAP编程环境上编写第一段ABAP程序 SAP官方发布的ABAP编程规范 ABAPCodeInspector那些隐藏的功能,您都知道吗? 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧 ABAPNetweaver体内的那些寄生式编程语言 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀 云端的ABAPRestful服务开发 如何在SAP云平台ABAP编程环境里把CDSview暴露成OData服务 使用abapGit在ABAPOnPremises系统和SAP云平台ABAP环境之间进行代码传输 30分钟用RestfulABAPProgramming模型开发一个支持增删改查的Fiori应用 Jerry带您了解RestfulABAPProgramming模型系列之二:Action和Validation的实现 Jerry带您了解RestfulABAPProgramming模型系列之三:云端ABAP应用调试 SAP云平台上的ABAP编程环境里如何消费第三方服务 ABAP开发者上云的时候到了现在大家可以免费使用SAP云平台ABAP环境的试用版了 学而不思则罔SAP云平台ABAP编程环境的由来和适用场景 SAP云平台里的三叉戟应用 如何基于RestfulABAPProgramming模型开发并部署一个支持增删改查的Fiori应用 SAP2019TechEdKeyNote解读:云时代下SAP从业人员如何做二次开发? 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了? ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了 利用ABAP740的新关键字REDUCE完成一个实际工作任务 一段让人瑟瑟发抖的ABAP代码 昨日万圣节ABAP怪兽级代码谜团,公布答案啦 介绍一种在ABAP内核态进行内表高效拷贝的方法 使用SAPCloudApplicationProgramming模型开发OData的一个实际例子 当ABAP遇见普罗米修斯 使用ABAP绘制可伸缩矢量图 ABAP开发环境语法高亮的那些事儿 SAP错误消息调试之七种武器:让所有的错误消息都能被定位 使用ABAP操作Excel的几种方法 SAPGUI里的收藏夹事务码管理工具 SAPGUI和Windows注册表 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中 ABAPCCDEF,CCIMP,CCMAC,CCAU,CMXXX这些东东是什么鬼 实现ABAP条件断点的三种方式 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害 SAPABAPNetweaver容器化,不可能完成的任务吗?