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

时间:2018-01-25 12:19:11

标签: events triggers sap abap

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

我该怎么做?

2 个答案:

答案 0 :(得分:4)

使用基于类的事件实际上并不是一种选择,因为它们不能用于在用户会话之间进行通信。

您可以使用一种机制在会话之间发送消息:ABAP Messaging Channels。您可以发送任何文本字符串,字节字符串或可以在上述任何一个序列化的内容。

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

在那里,你必须定义:

  • 消息类型(文本与二进制)
  • 有权访问消息频道的ABAP程序。
  • 消息的范围(即您要在用户之间发送消息?还是仅针对同一用户?应用程序服务器之间有什么关系?)

消息通道通过发布 - 订阅机制工作。您必须使用专门的类来发布到通道(在报告A中)并从通道中读取(在报告B内)。为了在订阅后等待消息到达,您可以使用语句WAIT FOR MESSAGE CHANNELS

示例代码:

 " 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包含在RFC中并使用aRFC variant调用此RFC。这将允许您在等待事件发生时继续在报告B中执行操作。发生此事件时,将执行在调用RFC时在报表中定义的aRFC回调方法。

在RFC中,您只需拥有订阅部分和WAIT语句,并将消息本身分配给EXPORTING参数。在您的报告中,您可以使用以下内容:

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.

答案 1 :(得分:0)

如果SAP内存中的参数发生了变化,您可以通过检入程序B来模拟它。程序A将设置此参数以发送事件。 (即SET / GET PARAMETER ......)。实际上你是B中的轮询事件。

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

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