Events 在不同ABAP会话中的程序之间触发/处理事件

Events 在不同ABAP会话中的程序之间触发/处理事件,events,triggers,abap,Events,Triggers,Abap,我有两个程序在不同的会话中运行。我想从程序a发送一个事件,并在程序B中捕获此事件 我该怎么做呢?如果SAP内存中的某个参数发生了更改,您可以通过签入程序B来模拟它。程序A将设置此参数以发送事件。(即设置/获取参数…)。实际上,您正在B中轮询事件 你的描述中有很多未知的东西。例如,事件是一次性操作还是可以发送多个事件?如果是这样,B必须在处理完事件后清除参数,以便A知道可以发送一个新的参数(A必须在设置参数后等待参数清除) 编辑:删除了关于ABAP中没有消息的部分,因为Seban显示我错了使用基于

我有两个程序在不同的会话中运行。我想从程序a发送一个事件,并在程序B中捕获此事件


我该怎么做呢?

如果SAP内存中的某个参数发生了更改,您可以通过签入程序B来模拟它。程序A将设置此参数以发送事件。(即设置/获取参数…)。实际上,您正在B中轮询事件

你的描述中有很多未知的东西。例如,事件是一次性操作还是可以发送多个事件?如果是这样,B必须在处理完事件后清除参数,以便A知道可以发送一个新的参数(A必须在设置参数后等待参数清除)


编辑:删除了关于ABAP中没有消息的部分,因为Seban显示我错了

使用基于类的事件实际上不是一个选项,因为它们不能用于用户会话之间的通信

有一种机制可用于在会话之间发送消息:。您可以发送任何文本字符串、字节字符串或可以在上述任意格式中序列化的内容

您需要使用存储库浏览器SE80(创建>连接>ABAP消息传递通道)或Eclipse ADT(新建>ABAP消息传递通道应用程序)创建这样的消息通道

在这里,您必须定义:

  • 消息类型(文本与二进制)
  • 授权访问消息通道的ABAP程序
  • 消息的范围(即,您希望在用户之间发送消息?还是只为同一用户发送消息?在应用程序服务器之间如何?)
消息通道通过发布-订阅机制工作。您必须使用专门的类发布到频道(报告A内部)并从频道(报告B内部)读取。为了在订阅后等待消息到达,可以使用语句

示例代码:

 " publishing a message
 CAST if_amc_message_producer_text(
     cl_amc_channel_manager=>create_message_producer(
     i_application_id = 'DEMO_AMC'
     i_channel_id     = '/demo_text'
     i_suppress_echo  = abap_true )
 )->send( i_message = text_message ).

 " subscribing to a channel
 DATA(lo_receiver) = NEW message_receiver( ).
 cl_amc_channel_manager=>create_message_consumer(
     i_application_id = 'DEMO_AMC'
     i_channel_id     = '/demo_text'
 )->start_message_delivery( i_receiver = lo_receiver )

 " waiting for a message
 WAIT FOR MESSAGING CHANNELS 
     UNTIL lo_receiver->text_message IS NOT INITIAL
     UP TO time SECONDS.
如果您希望避免在订阅服务器报告B中等待,同时还要做其他事情,那么您可以将等待包装为。。。语句,并使用调用此RFC。这将允许您在等待事件发生时继续在报表B中执行操作。发生此事件时,将执行在报告中调用RFC时定义的aRFC回调方法

在RFC内部,您只需要订阅部分和WAIT语句,再加上将消息本身分配给导出参数。在您的报告中,您可以有如下内容:

CALL FUNCTION 'ZMY_AMC_WRAPPER' STARTING NEW TASK 'MY_TASK'
    CALLING lo_listener->my_method ON END OF TASK.

" inside your 'listener' class implementation
METHOD my_method.
    DATA lv_message TYPE my_message_type.
    RECEIVE RESULTS FROM FUNCTION 'ZMY_AMC_WRAPPER'
        IMPORTING ev_message = lv_message.
    " do something with the lv_message
ENDMETHOD.

我不知道ABAP信息频道。谢谢!作为参考,此功能已添加到ABAP 7.40 SP5中