我有两个程序在分开的会话中运行。我想从程序A发送一个事件,并在程序B中捕获此事件。
我该怎么做?
答案 0 :(得分:4)
使用基于类的事件实际上并不是一种选择,因为它们不能用于在用户会话之间进行通信。
您可以使用一种机制在会话之间发送消息:ABAP Messaging Channels。您可以发送任何文本字符串,字节字符串或可以在上述任何一个序列化的内容。
您需要使用存储库浏览器SE80(创建>连接> ABAP消息传递通道)或Eclipse ADT(新> 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显示我错了