PO 系列指定接口的处理队列

作者:ABAP技巧与实战 约 8 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, 开发

原创 无峰 [ ABAP 技巧与实战 ](javascript:void\(0\);)

前言

PO(/PI)是SAP公司的一个中间件产品,用来辅助连接SAP系统与外围系统. (当然外围系统之间也可以使用PO).

企业通过PO提供统一的中间件服务平台,所有系统都调用PO的服务或者发布服务让PO调用.

PO的异步消息在S4/ECC系统中使用了队列处理机制.

该机制的好处是可以控制系统的整体资源不会被接口处理大量占据,

坏处是同一个队列中的排在前面的任务的处理性能或处理报错会影响队列中的后续任务

**本文主要讲解S4/ECC中怎么启用三级队列机制来优化消息的处理**

PO的队列处理

通过S4/ECC中执行事务代码SXI_MONITOR查询PO的相关消息,

• 可以看出PO的消息使用了队列处理. 图一

• 执行事务代码 SXMB_ADM 可以找到队列注册的位置,图二

• 双击关联队列,可以注册相关队列 图三 . 这里可以看到异步消息出站,入站的三级队列信息

• SMQ1 出站队列监控-报错的队列重置队首任务状态,可以触发系统继续处理队列

• SMQ 2 入站队列监控 \- 报错的队列 重置队首任务状态,可以触发系统继续处理队列

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

图一

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

图二

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

图三

队列处理的优点

通过队列配置,可以控制接口对系统资源的占用.

该占用包含

• 系统允许的队列处理对话数(RZ12) 图四

• 队列的管理控制参数(SMQR) 图五

没有找到每个队列组允许的队列个数, 估计该数字依赖于RZ12中针对队列分配的进程数,

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

图四

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

图五

队列处理的缺陷

队列处理的最大缺点就是排在队伍前面的任务会影响后面的任务.

笔者曾经分析处理过用户提报的一个接口问题:一个简单的入库接口(只有一单一行), 该接口在SXI_MONITOR中可以查询到执行耗时4个小时.

而该接口的其它消息日志却很快就执行完毕. 此时分析应该是队列等待导致的执行时间过长.

找出当天该接口的同名队列中最早的一个持续时间很久的消息, 判断出该消息就是问题的源头.

还有就是队首任务的报错会中止整个队列, 此时只能通过使用SMQ1/SMQ2 重置队首任务状态,来激活队列的重新处理.

非生产系统也可以通过删除队首任务来解决队列报错问题

程序RSXMB_RESTART_MESSAGES 也可以重新执行报错的PO/PI队列

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

问题解决方式一

怎么解决队首消息长时间处理影响队列中的其它消息的处理,

常规思维方式就是优化所有接口的处理逻辑, 确保单一消息的执行时间不会太久.

具体的优化方式可以考虑先记录接口数据, 然后调度后台去处理接口逻辑, 这样就可以避免该接口消息的长时间处理影响队列中的其它消息

问题解决方式二

解决方式二就是本文讨论的主题, 启用接口的三层优先级队列组机制(注册时固定)

• 正常队列组

• 高优先级队列组

• 低优先级队列组

通过配置把不同的接口指向特定的优先级队列组. 这样通过队列组名称的前4位,就可以确保不同优先级的消息一定不会进入相同的队列中.

估计系统会优先满足高优先级队列对进程的占用(尚未验证)

没有特殊配置的消息都会使用正常队列组

配置步骤

**下传接口:**

TCODE: SXMSIF里配置新的 发送/接收者标识

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

选中接口调用的服务类

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

直接保存

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

SXMB_ADM里

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

因为是S4发出的接口,所以选择发送者

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

先点保存,再点激活

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

然后测试:

在激活情况下: 可以在sxi_monitor里看到接口占得队列是我们前边配置的XBT1*

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

然后把SXMB_ADM里取消激活,再ZP299997推数,然后看SIX_MONITOR,队列就是XBTS*了

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

**上传接口:**

TCODE: SXMSIF里配置新的 发送/接收者标识

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

然后SXMB_ADM里

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

外围系统-PO-S4的接口,S4作为接收方,所以选择接收者

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

这里有个发送者标识需要填,S4作为接收方的时候,接收者标识一定要指定正确服务类,然后这个发送者标识开始填了*,但是在激活的时候报错

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

所以去配置一个发送者标识,然后里面所有的信息都填*

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

然后如下图

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

然后保存激活即可

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

用postman测试接口,

测试地址:

报文:

{

"body": {"FIELD1": "X","FIELD2": "B","FIELD3": "C"}

}

首先激活状态下:

队列是XBTA*

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

然后取消激活

队列是XBTR*

PO 系列指定接口的处理队列 - 封面图
PO 系列指定接口的处理队列 - 封面图

总结

一般情况下接口开发不会用到队列分配机制, 但是需要尽量优化接口的处理逻辑, 确保接口处理不会占用太多时间.

项目中如果发现特定接口耗时较长,对其它接口产生了影响, 则可以通过队列分配机制,把特定的一个或多个接口分配到其它优先级的队列中,

队列优先级通过队列的前4位字符可以识别

**特别感谢孙顾问,本文中的详细处理步骤由他提供.**

** THE **

** END **

**约定**

如果你对这篇文章感兴趣,请帮忙点赞,在看,分享.

( **如果你真的喜欢这篇文章,请记得回来打个赏,作为支持我继续下去的动力,这是一个正反馈过程.

越多的人打赏,作者越有动力分享,读者就能享受更多的福利.毕竟打赏的金额富不了我,穷不了你,却能支持这个公众号长久发文.** )

请微信联系管理员

syjf1976

sharry_xlp

Yannick_Duan

申请进入公众号讨论群提问或者参与话题讨论

ABAP技巧与实战

关于作者:ABAP技巧与实战

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「PO系列指定接口的处理队列.md」整理生成,仅用于内部技术分享与学习交流。