ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SAP BTP实战:ABAP事件推送Launchpad通知中心全流程

SAP BTP实战:ABAP事件推送Launchpad通知中心全流程 做 SAP BTP ABAP 环境项目这一年多业务方追问最多的不是报表有多快而是后端 ABAP 里状态变了能不能直接推到 Launchpad 的通知中心这里说的通知既不是邮件也不是应用里的 toast而是用户打开 SAP BTP Launchpad 后右上角铃铛位置那条带标题、带时间、可以点开跳转的消息。这篇实战指南就是把“ABAP 环境事件 → BTP Launchpad 通知中心”整条链路完整跑通的记录从站点开关、ABAP 通信配置、代码示例到排障顺序按我踩过的坑的顺序写。适合正在做 BTP 上云改造、RAP 应用交付的 ABAP 顾问以及负责 Fiori 集成和 Launchpad 平台管理的同事参考。1. 通知链路长什么样ABAP 事件到 Launchpad 铃铛1.1 三个角色各司其职一条能出现在 Launchpad 铃铛里的通知背后至少有三个角色在配合。第一个是 ABAP 环境也就是业务事件的产生方。采购申请提交、后台作业失败、周期任务完成这些状态都发生在 ABAP 侧通知必须在这里发起这是躲不开的事实。有人把 ABAP POProcess Orchestration那套接口中间件和这个场景混在一起其实完全是两回事PO 解决的是系统间接口流转这里解决的是“系统把消息发给用户”。第二个是传输通道。ABAP 环境在云端是封闭的运行时它不能直接操作浏览器的界面也不可能去猜用户当前打开了哪个页面。最稳妥的做法是服务端到服务端的 REST 调用ABAP 通过通信安排拿到一个出站 HTTP 目标带着 OAuth 2.0 客户端凭据把通知内容以 JSON 结构 POST 给 Launchpad 站点暴露的通知服务端点。这里要特别说一句这套链路不依赖 SSE 或者 WebSocket 长连接Launchpad 的通知中心是端侧定时拉取的ABAP 只需要保证把消息可靠送出去即可不需要在 ABAP 侧维护任何长连接状态运维成本低很多。第三个是 Launchpad 站点本身。站点收到通知后按 userId 把消息归集到对应用户的通知中心。用户登录站点右上角铃铛出现红点点击看到消息。站点侧的实现细节不用我们操心但我们得知道通知是挂在站点上的不是挂在子账户上的没有站点一切白搭。1.2 为什么不做成邮件或者页面里的悬浮弹层先说邮件。邮件的问题在于不可追踪、容易进垃圾箱而且用户往往有多个收件环境。更关键的是邮件无法把用户直接带回业务上下文用户看到邮件还要去地址栏敲一遍系统地址再输一遍搜索条件体验很差。有人说那我不要铃铛我要悬浮通知那种弹层行不行我理解这种诉求但这是另一个交互形态。Launchpad 的通知中心本质是一个持久化的消息聚合面板强调“稍后处理”适合审批、异常、维护这类不要求立刻打断的应用场景。紧急程度极高、必须在当前页面立即体现的内容应该留在应用内做模态弹窗而不是塞进铃铛。一句话铃铛管沉淀弹窗管打断两种场景分开设计。项目里最怕的就是把系统升级、业务审批、接口告警全塞进一个面板用户拉下来发现全是噪音最后干脆不看。1.3 典型业务场景参考审批类采购申请、请休假、报销单提交后推给审批人。这是最刚需的场景RAP 应用里状态一旦路由到审批环节立即发通知。运维类后台 Job 失败、接口调用连续报错推给 ABAP 技术负责人。这类通知在 Fault Handler 里统一捕获比翻监控省事得多。全员类页面紧急升级维护访问会短暂中断需要向站点所有用户发出大通知提前告知维护窗口。这个场景的文案和时效性要求最高要么不发发了就必须准确。2. 动手前先备齐账号、实例与 Launchpad 站点2.1 资源清单在动手配置之前我建议你先在项目文档里列一张资源清单免得配到一半发现少某个账号整个链路停在那里等审批。我常用下面的检查表资源用途备注BTP 子账户承载 Launchpad 订阅与 ABAP 环境通知链路全部在一个子账户内最省事Cloud Foundry 空间ABAP 环境实例所在空间至少需要一个可用空间账户预算要够ABAP 环境实例业务代码运行的地方版本越新越好老版本通信场景可能不全Launchpad 服务订阅提供站点与通知中心早期叫 Launchpad service现在对应 SAP Build Work Zone standard edition用户与角色集合控制谁能管理站点、谁能看到铃铛Launchpad_Admin / Launchpad_User或新版 SAP_Builder_* 系列这里有个容易被忽略的点ABAP 环境实例必须处于 running 状态而且要和 Launchpad 订阅在同一个子账户。跨子账户做通知集成不是不行但身份映射和网络配置都复杂一个量级不是必要不要这么干。2.2 订阅 Launchpad 服务并分配角色订阅操作路径子账户 → Service Marketplace → 搜索 Launchpad Service 或 SAP Build Work Zone → Create Subscription。订阅完成后进入 Instances and Subscriptions 页面找到对应订阅记录点击 Go to Application 打开管理入口。接下来是角色分配。旧版 launchpad 服务是 Launchpad_Admin、Launchpad_User 两个角色集合新版 SAP Build Work Zone standard edition 自带的是 SAP_Builder_Admin、SAP_Builder_EndUser、SAP_Builder_Participant 这套。把管理员账号加进 Admin 类角色集合把真实业务用户加进 EndUser 类角色集合。这一步漏了后面谁都看不到铃铛而且报错并不直观用户只会觉得“页面上怎么没有那个图标”。分配路径子账户 → Security → Users → 选择用户 → 在角色集合栏点 Assign Role Collection勾选对应集合保存。这个操作通常要生效在用户下次登录之后测试时记得重新登录。2.3 先建站点再谈通知通知是挂在站点上的不是挂在子账户上的。创建站点后在 Content Manager 里把 ABAP 环境发布的业务目录和角色加上组装成站点。这一套操作和普通 Launchpad 内容组装没有区别关键是站点域名。站点创建并发布后会得到一个 dispatcher 域名形如xxx.workspace.region.xxx.com这样的一长串地址。这个域名后面在 ABAP 通信配置里要用建议顺手写进项目配置表。我见过太多同事通到这一步才回来补记录结果又被域名搞昏头。如果你用的是自己搭的网关应用那目标主机就是网关的公共域名逻辑一样。3. 在站点设置中打开通知开关最容易漏的一步3.1 操作路径与开关位置站点建好只是第一步第二个大坑是通知开关默认是关的。这一步在 UI 上极其简单但因为藏得深被忽略的概率极高。进入 Site Directory 选择站点打开 Site Settings找到 Notifications 区块勾选 Enable Notifications保存。保存后站点会自动刷新右上角出现铃铛图标。如果没找到这个选项先检查你用的订阅版本是不是 SAP Build Work Zone standard edition某些旧版 launchpad service 的站点设置里根本没有通知中心那你得先用新版订阅重建站点。3.2 开关相关的配置项不同版本字段名略有差异但大体是下面这几项建议按项目实际开过眼再填配置项说明Enable Notifications总开关关闭状态下铃铛直接消失通知保留时长控制通知在面板里保留多少天别设太短审批人可能隔两天才看到轮询间隔通知中心拉取新消息的频率默认值已够用改得太短会无谓增加请求量面板最大展示条数控制铃铛点开后最多显示多少条超出部分怎么处理要看版本支持这些参数一般不需要动默认值真正要改的是第一个开关。我习惯把“站点通知已启用”写进项目交付清单因为后面排障的时候第一个问的就是它。3.3 怎么确认开关真的生效刷新站点页面看右上角有没有铃铛打开浏览器 F12Network 面板过滤 notification 关键字看是否有轮询请求发出。如果没有请求说明站点前端没有启用通知回 Site Settings 再看如果有请求但返回空说明通知 API 拉通了只是还没有消息问题在 ABAP 侧不用怀疑站点。如果你想让后端同事也确认端点可用可以用 curl 手发一条测试。注意这里要带 OAuth token我用过的大致是这样curl -X POST https://site-domain/services/notification/api/v1/notifications \ -H Authorization: Bearer token \ -H Content-Type: application/json; charsetutf-8 \ -d {title:连通性测试,body:test message,userId:mecorp.com}端点路径在不同租户里可能不一样以你站点对应的 API 参考文档为准路径不对大概率返回 404。这个 curl 测试的价值在于先把“ABAP 侧没问题”这件事证明掉后面排查就能少一大半。4. ABAP 环境侧打通通知通道通信配置与代码4.1 通信系统与通信安排ABAP 环境里出站 HTTP 调用不能直接写死 URL必须在 Communication Management 里先定义通信系统。这是平台的安全底线所有外部调用必须有凭据、有目的地、有审计记录。创建通信系统时需要填目标主机也就是 Launchpad 站点的 dispatcher 域名端口填 443认证方式选 OAuth 2.0 Client Credentials把调用通知 API 的客户端 ID 和客户端密钥填进去。表单里常用的字段如下字段填什么Communication System Name例如 LP_NOTIFY_SITE1命名清晰一点后面通信用Host Name站点 dispatcher 域名Port443AuthenticationOAuth 2.0 Client CredentialsClient ID / Client Secret由 Launchpad 管理面生成的服务凭据这些凭据从哪来如果你用的是站点自带的服务账号就在 Launchpad 管理面的服务凭据里生成如果你通到的是自己写的网关应用那就用那个应用的 client credentials。注意不要把凭据写到 ABAP 代码里它们只存在于通信系统配置中。接着创建通信安排。在 Fiori 应用 Communication Arrangements 里新建选择出站场景。不同租户可选的场景名可能不同一般带 Notification 或者 Outbound HTTP 字样的就是。创建完成后系统会生成一个出站服务实例记下服务实例对应的 Service ID代码里要引用它。通信安排的状态必须是 Active否则出站调用直接失败这一点经常被忽略。4.2 用标准 API 从 ABAP 发送通知ABAP 侧的发送代码我用的是 ABAP 环境标准的 HTTP 客户端通道整套逻辑非常固定可以直接抄METHOD send_to_launchpad. DATA(lv_json) build_json_payload( i_title 采购申请审批提醒 i_body |采购申请 { lv_pr_number } 等待审批| i_user_id lv_receiver_email i_target lv_app_url ). TRY. 1. 通过通信安排创建目的 DATA(lo_destination) cl_http_destination_providercreate_by_comm_arrangement( comm_scenario SAP_COM_0XYZ 以租户实际场景为准 service_id NOTIFICATION_SERVICE 通信安排里的出站服务 ID ). 2. 创建 HTTP 客户端 DATA(lo_http_client) cl_web_http_client_managercreate_by_http_destination( io_destination lo_destination ). 3. 组装请求 DATA(lo_request) lo_http_client-get_request( ). lo_request-set_header_field( i_name Content-Type i_value application/json; charsetutf-8 ). lo_request-set_method( if_web_http_clientpost ). lo_request-set_text( lv_json ). 4. 发送并拿到响应 DATA(lo_response) lo_http_client-execute( if_web_http_clientpost ). DATA(lv_status) lo_response-get_status( ). IF lv_status 300. 记错误日志最好连同响应体一起保存 ELSE. 记成功日志建议带业务单据号 ENDIF. CATCH cx_root INTO DATA(lx_error). 统一异常处理宁可记日志也不要吞掉异常 ENDTRY. ENDMETHOD.解释几个关键点。cl_http_destination_providercreate_by_comm_arrangement是 ABAP 环境里符合安全规范的出站 HTTP 标准入口它从通信安排里读取目的地和认证信息代码里不需要写任何 URL 和凭据。JSON 序列化我建议直接用你项目里现成的工具类ABAP 环境的 XCO 库也提供了 xco_cp_json 作为序列化入口没有顺手工具时也可以手工拼 JSON但一定要处理字符串转义中文建议整体保持 UTF-8。另外提一句因为是服务端到服务端的调用走的是 OAuth 2.0 client credentials 流程不需要你额外做异步通知那套验签逻辑TLS 和令牌处理由平台侧完成。只有当你把通知又转发到自建 Webhook 网关时才需要去校验回调签名。4.3 载荷设计发给谁、写什么、点了去哪通知载荷的字段设计直接决定用户体验。一个典型的 JSON 载荷长这样{ title: 采购申请审批提醒, body: 采购申请 PR-000123 已提交等待您的审批, userId: approvercorp.com, targetUrl: https://myapp.example.com/ui5?apppr_approvepr000123, category: APPROVAL, priority: HIGH, eventId: PR-000123-TASK-001 }字段说明如下字段必填说明title是通知标题尽量在 20 个字以内一眼看懂body是正文带业务编号方便用户追溯userId是接收者的主用户标识见第 5 节targetUrl建议点击通知后的落地页category选填分组展示用不同业务类型分开priority选填高优先级可以触发红点强调eventId选填幂等与追踪用重复发送时可去重特别提醒 targetUrl 必须是可以从浏览器直接访问的绝对地址不要写内部主机名或者 localhost带中文参数的 URL 要记得做编码否则用户点击个别浏览器会直接打不开。4.4 可选扩展需要同步通知到邮件或企业微信怎么办如果业务要求“同一件事既出现在 Launchpad 铃铛里也要发邮件、发企业微信”那就引入 SAP Alert Notification service 做事件路由。ABAP 把事件 POST 到 Alert Notification 的 REST API然后在 Alert Notification 里配 condition 和 action把事件分发给邮件、Webhook、甚至企业微信机器人。但要记住一个边界Alert Notification service 本身不直接往 Launchpad 铃铛写消息铃铛走的是站点通知 API。所以我的建议是两种通道分开配别指望用一个服务同时干两件事。链路越短越稳定能用站点通知 API 解决的就别多绕一跳。5. 身份映射与多站点场景谁能看到通知5.1 用户 ID 对不上是头号故障我排障统计下来通知发出去但用户看不到一大半情况是 userId 写错。ABAP 环境里的业务用户、BTP 侧 IdP比如 SAP IAS里的主用户、Launchpad 站点看到的用户三者的唯一标识可能互相不一致。ABAP 里存的可能是登录名而通知 API 那边认的是用户登录 Launchpad 的 IdP 地址通常是邮箱。稳妥做法ABAP 侧维护业务用户时把 IdP 主标识一般是邮箱地址作为一个属性保存下来通知载荷里直接用这个值。你可以在 BTP 子账户的 Security → Users 里看到用户 ID再去 ABAP 环境的 Maintain Business Users 应用里核对属性两边对齐后固定用一种。上线前先用一个测试用户发一条确认真实用户在铃铛里能看到再放开批量。这个测试看起来不起眼但能省掉后续几十个工单。5.2 按角色和属性过滤通知通知 API 本身通常只认用户不认业务角色。所以“发给所有审批经理”、“发给某部门全体”这类规则应该在 ABAP 侧判断好再逐条发送不要把过滤逻辑寄托在站点上。我常用的做法是 ABAP 侧拿角色列表循环对每个目标用户构造一条载荷LOOP AT lt_approvers INTO ls_approver. lv_payload build_json_payload( i_title 采购申请审批提醒 i_body |单据 { lv_pr_number } 等待 { ls_approver-name } 审批| i_user_id ls_approver-email ). send_to_launchpad( lv_payload ). ENDLOOP.循环发送注意频率通知中心有刷新上限一次几百条会拖慢站点体验分批发或者延迟队列处理更稳妥。5.3 多站点和跨子账户注意点一个站点一个通知源通知只会出现在它所属站点的铃铛里。如果你的用户同时访问多个站点而通知发到了 A 站点的 API用户打开 B 站点是看不到的。所以设计阶段就要定清楚业务通知统一走哪个站点不要今天发 A、明天发 B。跨子账户的情况更复杂涉及 IdP 映射和站点域名大多数项目根本没这个需要。遇到这种需求先回去确认是不是该把通知收敛到统一站点而不是去补一堆映射配置。6. 常见问题速查与终极排查清单6.1 现象-原因-处置速查表项目做久了问题基本就那么几类我整理成一张速查表贴在新人文档里非常省事现象可能原因快速处置右上角没有铃铛站点设置中未启用 NotificationsSite Settings → Notifications → Enable → 保存 → 清缓存刷新有铃铛但一直空userId 与 IdP 主用户标识不一致事件没有真正发出先发一条测试通知核对通信安排日志与响应状态401 UnauthorizedOAuth 2.0 凭据错误通信系统里密钥填错更新通信系统凭据重新激活通信安排403 Forbidden客户端没有调用通知 API 的权限检查服务密钥和角色给客户端追加权限404 Not Found通知端点 URL 路径变化站点域名重建按站点 API 文档重新核对 endpoint中文乱码缺少 charset 声明Content-Type 写明 application/json; charsetutf-8通知点击后打不开targetUrl 不是绝对地址或参数未编码传完整 https 地址参数做 URL 编码通知重复出现发送端重试没有幂等控制载荷带 eventId按响应码决定是否重发通知延迟几分钟才出现站点轮询间隔导致属正常现象别急着改参数只有部分用户能看到角色集合分配不一致userId 覆盖不全核对用户角色集合与载荷里 userId 逐个对照6.2 排查顺序先前端后后端我现在的排障顺序基本固定按这个顺序很少有漏网之鱼站点里看铃铛在不在。不在就先查开关和角色集合这是界面问题最快。浏览器 F12 里过滤 notification 请求看拉取是否正常。如果根本没有轮询请求站点前端没启用通知。回到 ABAP 侧看通信安排的日志确认 POST 是否真的发出去了响应体是什么。看响应状态码401/403 回通信系统查凭据404 查 URL5xx 大概率是站点侧问题。上面全正常还没有消息最后才怀疑 userId 映射用测试用户逐个试。这套顺序帮我避免了无数次“在 ABAP 代码里埋头找问题结果只是站点开关没开”的低级事故。6.3 几条独家避坑技巧第一把发送通知封装成一个独立方法所有 RAP 行为实现和后台 Job 都走同一个入口。这样你在入口处加一句日志全链路的发送情况都能看到排查问题时不用去翻五六处调用点。第二上线前加一个“测试模式”配置项只发到测试用户。我第一次上线的时候直接发了全量结果措辞里带着内网系统名业务部门一顿吐槽。有了测试模式就能先在真实环境下验证用户体验再放开正式用户。第三通知文本里带业务编号点击跳转的 URL 里也带同样的编号。用户看到通知后即使没点进去也知道说的是哪张单点进去以后也能在页面上对照上下文。这个细节对审批类场景尤其重要。第四维护窗口的全员通知要用 category 跟业务审批分开。否则用户打开面板看到系统升级提醒和待审批单据混在一起重要信息很容易被淹没。我一般把升级维护单独设一个 category文案里写清楚“无需操作”跟需要用户动作的通知严格区分。第五批量发送时控制频率。通知中心有刷新上限一次几百条会造成站点端短暂拥塞分批发更稳妥不要图省事一个循环全发出去。最后再说个我自己的体会通知中心这种东西上线前看着稀松平常上线后却是用户给系统打“靠谱分”的关键细节。一条能跳转、能追溯、不打扰的通知比十个仪表盘更能让业务部门信任 BTP 应用。我现在的习惯是任何 RAP 交付的审批流程都必须把“通知链路跑通”写进验收清单否则不签字。这个小习惯帮我在后面好几个项目里都少接了半夜的救火电话建议你也试试。
返回列表