云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

免备案CDN_腾讯云学生_

小七 141 0

几天前,我在SAP社区的SAP答案部分看到了以下问题:"CPI消息处理卡住了"。Alice van Ommen问,如果sapcpi消息陷入"处理"状态,是否可以停止它。这个问题的答案指向sapnote23999949,它说这是不可能的,并且必须等待最多30天,直到清理作业运行。我认为SAP注释可能有点误导,因为它不适合100%的消息处于"处理"状态的情况。但是让我来告诉你为什么……

注意:如果你对"如何"不感兴趣,而只想快速解决问题,请向下滚动到本文末尾的"即用解决方案"一段。

目录

CPI上的消息(交换)可以停止吗?如何停止消息-一步一步如何停止消息–一个现成的解决方案反馈与讨论

关于CPI的信息(交流)能否停止?

答案是肯定的。消息(=CPI slang;exchanges=Apache Camel slang)至少可以在运行时停止。这听起来可能很琐碎,但让我来解释一下为什么我要指出"当他们在运行时"。在SAP CPI的监控中,云计算与大数据,消息显示为"正在处理"状态的原因可能有两个:

如果您设法在其中一个脚本中写入无限循环,或者网络速度减慢,或者处理巨大的有效负载,则可能出现情况1,或者……可能出现情况2,当消息处理被运行时节点崩溃"硬中断"或在消息处理过程中取消部署IFlow时。

如果您的消息因"案例2"而显示为"正在处理",则除了等待(最多)30天的监视清理作业外,您没有其他机会获得正确的监视条目。(但是,嘿,毕竟这只是一个显示错误,消息不会消耗租户的任何资源。)但是如果您遇到"案例1"的情况,很有可能您可以取消消息。下一节我们来看看必要的代码

如何停止消息-一步一步

短版本:获取应该停止的交换对象的句柄并停止它

长版本:首先您应该定义IFlow id的id和要停止的消息的消息id。然后我们使用OSGi中的FrameworkUtil类来获取包"com.sap.gateway网关.ip.core.customdev.实用消息"(因为它存在于每个运行时节点中)通过bundle的getBundleContext函数获取整个BundleContext。

BundleContext本身允许我们访问服务引用。(服务引用表示(不是独占的,但也表示)已部署/正在运行的iFlow的实例。通过getServiceReferences函数并通过传递IFlow的id,大数据分析学习,我们可以检索ServiceReference对象,大数据实战,该对象链接到运行要停止的消息的IFlow。在下一步中,我们将ServiceReference转换为CamelContext,并将其保存在一个名为"CamelContext"的变量中。

将CamelContext想象为我们的目标Iflow的一个实例。通过CamelContext的getInflightRepository函数和browse函数,我们可以获得IFlow当前处理的所有交换(=消息)的列表。(InflightRepository在处理步骤中跟踪交换。)

首先我们检查InflightRepository是否至少有on个消息(size()>1)。如果是这样,一切都很好。如果没有,我们将在此时停止,因为要停止的消息已经完成。如果InflightRepository中有消息,我们将结合find函数调用browse函数,传递消息id,以获取反映我们搜索的消息的存储库条目。我们将存储库条目保存在一个名为"repointry"的变量中。

如果"repointry"不为null,这意味着我们得到了一个有效的引用,我们调用它的getExchange函数,以获取Exchange类型的实例。这就是我们要找的圣杯。再加上两行代码,我们现在就可以停止消息了。通过使用参数调用setProperty函数"Exchange.U站"和"布尔值。真"我们将消息设置为尽快停止。

注意(1):setException调用是可选的。如果调用此函数,则消息将在SAP CPI的监视中显示为"失败"。传递给setException函数的异常文本也将显示在CPI的监控中。如果不调用setException函数,而只设置Exchange.U站属性,贵阳大数据,则消息将被停止,但在CPI的监视中显示为"已完成"。

注(2):通过设置Exchange.U站"属性,您不会立即终止交换,但要让Camel框架知道,它应该立即停止交换下一个可能的时间(=通常是IFlow中的下一个处理步骤)。

如何停止消息–一个现成的解决方案

现在我们已经研究了技术细节,我们来看看实际实现。您可以使用上述方法,通过构建一个简单的IFlow,如下所示。

创建一个只有一个发送方而没有接收方的新IFlow。通过HTTPS发送方通道连接发送方元素。在发送方中,根据您的喜好设置端点地址。之后,添加Groovy script类型的script元素并经过下面的脚本。(脚本基于上述理论部分,但通过一些错误和输入处理行进行了扩展。)

就是这样。保存并部署IFlow。部署后,您可以在任何网络浏览器中调用IFlow。通过添加url参数"messageId"和"iFlowId",您现在可以轻松地停止消息。

示例调用:

由于IFlow使用易于解析的JSON文档(包括状态和错误信息)进行响应,云计算与大数据,因此它也非常适合与您选择的第三方应用程序或监视工具进行接口。

反馈和讨论