今天的故事要从ABAP小游戏说起。

中国的ABAP从业者们手头或多或少都搜集了一些ABAP小游戏,比如下面这些。

消灭星星:

扫雷:

来自我的朋友刘梦,公众号"SAP干货铺"里的俄罗斯方块:

用ABAP画图:

以及用今天要谈到的ABAP Channel技术开发的乒乓球游戏,还能支持双打,囧。

我心里一直有个念头,以严谨刻板著称的德国开发人员,看到这些流行于中国ABAP生态圈的小游戏,会有什么反应?

去年我在SAP德国总部做标准开发,经常参加一些会议。一次会议上,我和其他几位CRM德国同事在会议室里一直等待一位S/4HANA同事的到来。大家也许会问,德国人素来以守时著称,为什么工作会议还会迟到?

那是因为SAP德国总部面积非常大,一共有20多栋楼。下图是SAP德国总部在Walldorf修建的第一栋大楼,拍摄于深秋季节。我们习惯称为Building 1,当时我就在里面工作。

大楼侧面看起来是这样的,拍摄于初夏:

这20多栋大楼分散在园区各个角落:

当时参加会议的S/4HANA同事在Building 3工作,刚开完上一个会,以Jerry的步行速度,走到Building 1的会议室需要5分钟时间。

在等待同事的时候,Jerry就把自己的电脑连接上了投影仪,然后给其他在场的几位德国同事一个一个秀这些小游戏。当我的同事Carsten,SAP CRM的首席架构师,看到ABAP编写的扫雷游戏时,不禁哈哈大笑,说道这是他在windows 98系统下玩的最多的一个游戏。

终于S/4HANA的同事到达了会议室,此时投影仪上正进行着用ABAP Channel编写的乒乓球游戏。这位德国同事盯着看了一会儿,幽默地说了一句:"Am I in the wrong room?"

下面是正文。

  • *

ABAP Channel是Netweaver 740发布的一项新的基于事件驱动的前后台通信技术,底层的实现基于WebSocket和TCPSocket。

做过SAP CRM呼叫中心(Interaction Center)的CRM顾问们,一定对这个产品的轮询机制有深刻的印象。因为当时技术的局限,每当ABAP后台有事件发生时,没有办法通知到前台WebClient UI界面。前台为了能够显示最新的数据,只得以一个固定的时间间隔,周期性地主动向ABAP后台发起轮询(poll)。

用Chrome开发者工具观测,能容易地观察到这个轮询行为:下图显示CRM呼叫中心每隔1秒钟向后台发起一个HTTP请求进行轮询。

2014年,Netweaver 740发布了底层基于Web Socket协议的ABAP Channel技术,因此CRM 呼叫中心也顺势采用了该技术替换了之前笨拙而低效的轮询解决方案。

详细信息参考CRM呼叫中心产品经理Henning的博客:

Replace polling in CRM Interaction Center by ABAP Push Channel

很多SAP成都研究院做过CRM开发的同事都和Henning打过交道,这是一位在CRM领域业务知识极其精深,同时非常和蔼的德国人。

在SAP社区网站上已经有很多SAP从业者发表了各种关于ABAP Channel的博客,包括SAP自身也开发了很多例子,这些例子程序跟随Netweaver一起发布。

Jerry不再重复这些例子,感兴趣的朋友请参考这篇文章:

ABAP Channels Examples

今天我要分享的是Jerry如何使用ABAP Channel提升日常工作分析问题效率的一个具体例子。

ABAP从业者做项目时经常需要使用各种跟踪和性能监控工具,最典型的有ST05和SAT。Jerry确实认为这些工具对ABAP开发者非常有用,Jerry在SAP社区上唯一的一篇阅读量超过十万的博客就是这篇讲ST05和SAT另类用途的文章:

Six kinds of debugging tips to find the source code where the message is raised

(2016年9月SAP社区改版了,迁移到了SAP云平台。迁移后所有博客的阅读量都清零了,因此现在这篇博客看到的阅读量只有四万多,而不是十万)

然而Jerry认为目前在Netweaver里所有的这些工具都有一个局限:开发人员必须要手工打开工具的跟踪模式,在该模式下运行应用。运行结束之后,或手动关掉跟踪模式,或者由工具自动关闭。也就是说,这些工具都无法在应用处于运行状态时,实时地提供开发者需要的信息。

我去年在德国参加了原CRM One Order框架迁移到S/4HANA的重构和原型开发工作。具体细节可以看我这篇公众号文章:Hello World, S/4HANA for Customer Management 1.0。

原型开发完成后就得做测试了。我得在新的S4CRM UI上进行一系列和以前老CRM一样的操作,然后观察传入API的输入参数和API返回的输出参数是否正确。

起初我采用的方式是在API里设置断点,然后在ABAP调试器里检查。很快我发现这样效率很低:CRM开发顾问都知道,像CRM_ORDER_MAINTAIN/READ这种API, 输入输出参数个数特别多,在ABAP 调试器里得选中一个双击进去看,看完了得点回退再双击看另一个。如果要把API所有的参数全部检查完,总共要点一百多次鼠标。

Jerry最受不了的就是这种重复的体力活。有没有办法可以让Netweaver也能像SAP云平台的CloudFoundry编程环境那样,一个

cf logs <app name>命令之后,正在运行的应用,其运行时产生的日志就哗哗哗地打印在浏览器上呢?有!使用ABAP Channel。

于是我动手开发了一个工具。看下这个工具怎么用:一个BSP应用,在浏览器里访问:

然后直接切换到One Order应用,像往常一样进行操作。比如新建一个服务订单,维护下面几个字段:

再切换回我做的工具,One Order API的输入和输出参数内容已经实时地显示在浏览器里了,再不用去调试器里进行繁琐的点击操作了。

因为是通过浏览器显示,所以我还可以直接用CTRL+F根据关键字搜索,而这在SAPGUI里是没法做到的。后来我也把这个工具推荐给了Carsten。

下面是这个工具的详细开发步骤。

1. 事务码SAPC, 创建一个新的APC(ABAP Push Channel)应用ZORDER_LOG_APC,连接类型要选择成WebSocket。

点击按钮“Generate Class and Service” 自动生成处理类和ICF节点。

2. 事务码SAMC, 创建一个新的AMC(ABAP Message Channel)应用,取名为ZORDERLOG。

将第一步APC应用自动生成的ABAP类的名称维护到Authorization Program下面。这一步的目的是指定在ABAP Channel场景中,通过WebSocket进行数据收发的ABAP处理类名称。将Channel ID/order_log抄下来。

3. 从上图中得知我指定了ABAP类CL_CRM_ORDER_LOGGER用来将应用程序调用One Order API产生的日志发送到Web Socket上去,因此这一步需要对这个类进行编程了。完整代码在我的github上,这里仅阐述要点。

在静态构造函数里,将第二步创建的AMC ID和channel ID传入生产者的构造器里。确实,ABAP Channel的场景就是一个典型的生产者/消费者模式,ABAP后台生产的消息,通过Web Socket发送给浏览器由后者消费。

消息的发送通过下面这个SEND方法完成。

4. 重定义第一步APC应用自动生成的处理类的ON_START方法:

在这个方法里将第一步创建的APC应用和第二步创建的AMC应用做绑定。

5. 给API CRM_ORDER_MAINTAIN创建一个增强,把我的CL_CRM_ORDER_LOGGER注入进去。这样每次该API被调用时,都会自动进行日志记录并通过Web Socket发送给浏览器。

以上五步就是ABAP Channel生产者的实现。下面是消费者,即运行于浏览器里的Web应用的开发。

创建一个BSP应用,在index.htm里维护下面的代码:

第17行声明了进行前后台通信的Web Socket url:

这样消费者的开发也做完了。

大家在实际工作中,遇到繁琐耗时的体力活的时候,也可以多想想,能不能用工具来减少工作量,提高工作效率。感谢阅读。

更多阅读

  • 聊聊C语言和ABAP
  • Jerry的ABAP, Java和JavaScript乱炖
  • Jerry的ABAP原创技术文章合集
  • ABAP开发人员未来应该学些什么
  • Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
  • SAP成都研究院35岁以上的开发人员都去哪儿了?
  • 一个SAP开发人员的双截棍之路

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

动手使用ABAP Channel开发一些小工具,提升日常工作效率相关推荐

  1. 动手使用ABAP Channel开发一些小工具,提升日常工作效率 1

    今天的故事要从ABAP小游戏说起. 中国的ABAP从业者们手头或多或少都搜集了一些ABAP小游戏,比如下面这些. 消灭星星: 扫雷: 来自我的朋友刘梦,公众号"SAP干货铺"里的俄 ...

  2. HCL打开显示当前系统用户怎么解决_软网推荐:小工具解决日常工作大问题

    我们在日常使用电脑的时候难免会遇到各种各样的问题,有的时候虽然是一些小问题但是想解决反而不容易.其实我们遇到的这些问题,很多其他的用户也遇到了.于是就有一些用户开发出一些小工具,专门针对这些问题而进行 ...

  3. 使用 ABAP 开发的一个基于 Web Socket 的小工具,能提高程序员日常工作效率

    程序员区别于其他岗位的一个优势是,我们可以充分利用自己掌握的编程语言,将平日一些琐碎的,重复的日常工作,通过代码来实现自动化,从而省下更多的时间来投入到技术含量更高的工作中,提高工作效率. 本文介绍一 ...

  4. 太强了,Python 开发桌面小工具,让代码替我们干重复的工作~

    作者 | Cherish 来源 | 杰哥的IT之旅 决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python 自动生成透视表",这个问题背后有个非常好的解 ...

  5. C# JSON使用过程中开发的小工具

    我在用JSON的过程中,经常要去看一下JSON的结构,而JSON串大不部分时候都是未格式化的数据,一次我不得不用一些网页上的在线解析和格式化工具来进行格式化查看,但是这些网页有时候并不好用:因此就结合 ...

  6. 太强了!Python 开发桌面小工具,让代码替我们干重复的工作!

    作者:Cherish 来源:https://www.jianshu.com/p/91128d442198 决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 Python ...

  7. Python 开发桌面小工具,让代码替我们干重复的工作!

    作者:Cherish 来源:https://www.jianshu.com/p/91128d442198 本文为读者投稿 决定写这篇文章的初衷是来源于一位小伙伴的问题,关于"如何根据数据源用 ...

  8. 视频硬字幕提取方法(可完全离线),开发个小工具辅助一下

    最近博主闲下来了,思考人生接下来的方向,无聊时帮别人做了点小东西,贡献出来: jre-17.0.7_win-x64的生成方式: 以管理员方式运行PowerShell执行命令: cd $env:JAVA ...

  9. 使用GGE开发Google小工具(Google Gadget)

    原文链接:http://hi.baidu.com/shirdrn/blog/item/9c144dfc1607e984b901a02d.html 刚开始研究Google的OpenSocial,发现还要 ...

最新文章

  1. AI求解薛定谔方程,兼具准确度和计算效率,登上《自然-化学》
  2. PullToRefreshScrollView下拉刷新开源组件分析
  3. 测试嵌套JavaScript对象键的存在
  4. YUI Grid CSS的优雅设计(转)
  5. ecshop支持mysql5.5吗,centos5.5 安装配置 ecshop【nginx + php + mysql】
  6. 《高性能JavaScript》第七章 Ajax
  7. 音视频技术开发周刊 | 171
  8. 22468!Windows 11新预览版发布:旧版系统支持十月终止请速升
  9. 三菱q系列plc连接电脑步骤_三菱Q系列PLC与三菱变频器的CC-link通讯技术(我的学习笔记)...
  10. 通过小程序给公众号传递消息_多输入现场消息传递应用程序概念
  11. Android:应用商城
  12. LeetCode(693)——交替位二进制数(JavaScript)
  13. rk3399 io工具的使用示例
  14. 在巨人的肩上:开源GIS工程大全索引
  15. word文档的尺寸和字号对照表
  16. netbackup 备份oracle,Netbackup 6 备份 oracle 9.2
  17. matlab中nargin函数
  18. NEC红外线解码协议
  19. 微信公众平台如何与Web App结合?
  20. 使用CGLIB enhancer实现类的增强

热门文章

  1. leetcode算法题--不同的二叉搜索树 II
  2. SQL Server 字符串操作
  3. ConstraintLayout 不能作为activity的根节点,否则fragment显示不出来
  4. angular2 学习二 最简单的模板
  5. 深入 理解 Statement 和 PreparedStatement
  6. 第三次作业——(涂江凤、邓洪虹)
  7. Tomcat发布Maven项目遇到异常:java.lang.OutOfMemoryError: PermGen space
  8. div溢出显示时用省略号结尾 .
  9. H3C交换机引发的奇葩故障
  10. 3、顺序表、内存、类型、python中的list