• ABAP bgRFC 实例


    目录

    目的地设置

    出站事务bgRFC代码示例

    出站队列bgRFC代码示例

    入站和出站队列bgRFC代码示例

    入站事务bgRFC代码示例

    出站队列bgRFC队列单元交叉场景示例

    开发API

    bgRFC监控管理

    注意事项


    目的地设置

            不能使用'NONE',可以使用目标地址为空代替本地

            必须为ABAP连接,TCP/IP连接,参考条目

            出站队列的目的地必须在事务 SM59中维护,并表示出站 bgRFC 类型 t 和类型 q 的执行目的地。入站队列的目的地必须在事务 SBGRFCMAINIDST 中维护。如果目的地无效,则抛出异常 CX_BGRFC_INVALID_DESTINATION。

    出站事务bgRFC代码示例

    1. DATA: my_destination TYPE REF TO if_bgrfc_destination_outbound,
    2. my_unit TYPE REF TO if_trfc_unit_outbound,
    3. dest_name TYPE bgrfc_dest_name_outbound.
    4. DATA: text TYPE text200.
    5. TRY.
    6. dest_name = 'LOCALTEST'.
    7. my_destination = cl_bgrfc_destination_outbound=>create( dest_name ).
    8. my_unit = my_destination->create_trfc_unit( ).
    9. text = 'Simple Outbound'.
    10. CALL FUNCTION 'YLC_FUNC001' IN BACKGROUND UNIT my_unit
    11. EXPORTING
    12. text = text.
    13. CALL FUNCTION 'YLC_FUNC002' IN BACKGROUND UNIT my_unit
    14. EXPORTING
    15. text = text.
    16. CALL FUNCTION 'YLC_FUNC003' IN BACKGROUND UNIT my_unit
    17. EXPORTING
    18. text = text.
    19. CALL FUNCTION 'YLC_FUNC004' IN BACKGROUND UNIT my_unit
    20. EXPORTING
    21. text = text.
    22. CALL FUNCTION 'YLC_FUNC005' IN BACKGROUND UNIT my_unit
    23. EXPORTING
    24. text = text.
    25. COMMIT WORK.
    26. WRITE:/ 'Success'.
    27. CATCH cx_bgrfc_invalid_destination .
    28. WRITE:/ 'Error'.
    29. ENDTRY.

    以一个LUW进行提交,RFC中不能使用COMMIT WORK,ROLLBACK WORK

    使用错误消息可以触发数据回滚

    RFC中更新自建,效果如下

    出站队列bgRFC代码示例

            队列bgRFC队列名称只能字母数字和_/ ( [A-Z/][A-Z0-9_/]* )

            单元是传输的单位。它要么完全传输,要么等待传输

    1. DATA: my_destination TYPE REF TO if_bgrfc_destination_outbound,
    2. my_unit TYPE REF TO if_qrfc_unit_outbound,
    3. dest_name TYPE bgrfc_dest_name_outbound,
    4. queue_name TYPE qrfc_queue_name,
    5. queue_names TYPE qrfc_queue_name_tab.
    6. DATA: text TYPE text200.
    7. TRY.
    8. dest_name = 'LOCALTEST'.
    9. my_destination = cl_bgrfc_destination_outbound=>create( dest_name ).
    10. my_unit = my_destination->create_qrfc_unit( ).
    11. text = 'Simple Outbound - bgRFC type Q'.
    12. CALL FUNCTION 'YLC_FUNC001' IN BACKGROUND UNIT my_unit
    13. EXPORTING
    14. text = text.
    15. CALL FUNCTION 'YLC_FUNC002' IN BACKGROUND UNIT my_unit
    16. EXPORTING
    17. text = text.
    18. CALL FUNCTION 'YLC_FUNC003' IN BACKGROUND UNIT my_unit
    19. EXPORTING
    20. text = text.
    21. CALL FUNCTION 'YLC_FUNC004' IN BACKGROUND UNIT my_unit
    22. EXPORTING
    23. text = text.
    24. CALL FUNCTION 'YLC_FUNC005' IN BACKGROUND UNIT my_unit
    25. EXPORTING
    26. text = text.
    27. my_unit->add_queue_name_outbound( 'TEST_FUN1' ).
    28. queue_name = 'TEST_FUN2'.
    29. INSERT queue_name INTO TABLE queue_names.
    30. my_unit->add_queue_names_outbound( queue_names ).
    31. COMMIT WORK.
    32. WRITE:/ 'Success'.
    33. CATCH cx_bgrfc_invalid_destination .
    34. WRITE:/ 'Error'.
    35. CATCH cx_qrfc_invalid_queue_name .
    36. WRITE:/ 'Error'.
    37. CATCH cx_qrfc_duplicate_queue_name.
    38. WRITE:/ 'Error'.
    39. ENDTRY.

    单元历史监控

    入站和出站队列bgRFC代码示例

    1. DATA: my_destination TYPE REF TO if_bgrfc_destination_outbound,
    2. my_unit TYPE REF TO if_qrfc_unit_outinbound,
    3. dest_name TYPE bgrfc_dest_name_outbound,
    4. queue_name TYPE qrfc_queue_name,
    5. queue_names TYPE qrfc_queue_name_tab.
    6. DATA: text TYPE text200.
    7. TRY.
    8. dest_name = 'LOCALTEST'.
    9. my_destination = cl_bgrfc_destination_outbound=>create( dest_name ).
    10. my_unit = my_destination->create_qrfc_unit_outinbound( ).
    11. text = 'Simple Outbound - bgRFC type Q'.
    12. CALL FUNCTION 'YLC_FUNC001' IN BACKGROUND UNIT my_unit
    13. EXPORTING
    14. text = text.
    15. CALL FUNCTION 'YLC_FUNC002' IN BACKGROUND UNIT my_unit
    16. EXPORTING
    17. text = text.
    18. CALL FUNCTION 'YLC_FUNC003' IN BACKGROUND UNIT my_unit
    19. EXPORTING
    20. text = text.
    21. CALL FUNCTION 'YLC_FUNC004' IN BACKGROUND UNIT my_unit
    22. EXPORTING
    23. text = text.
    24. CALL FUNCTION 'YLC_FUNC005' IN BACKGROUND UNIT my_unit
    25. EXPORTING
    26. text = text.
    27. queue_name = 'TEST_FUN1'.
    28. INSERT queue_name INTO TABLE queue_names.
    29. my_unit->add_queue_names_outbound( queue_names = queue_names ignore_duplicates = abap_true ).
    30. my_unit->add_queue_names_inbound( queue_names = queue_names ignore_duplicates = abap_true ).
    31. COMMIT WORK.
    32. WRITE:/ 'Success'.
    33. CATCH cx_bgrfc_invalid_destination .
    34. WRITE:/ 'Error'.
    35. CATCH cx_qrfc_invalid_queue_name .
    36. WRITE:/ 'Error'.
    37. ENDTRY.

    入站事务bgRFC代码示例

    1. DATA: my_destination TYPE REF TO if_bgrfc_destination_inbound,
    2. my_unit TYPE REF TO if_trfc_unit_inbound,
    3. dest_name TYPE bgrfc_dest_name_inbound.
    4. DATA: text TYPE text200.
    5. TRY.
    6. dest_name = 'BGINBOUND'.
    7. my_destination = cl_bgrfc_destination_inbound=>create( dest_name ).
    8. my_unit = my_destination->create_trfc_unit( ).
    9. text = 'Simple inbound bgRFC type T'.
    10. CALL FUNCTION 'YLC_FUNC001' IN BACKGROUND UNIT my_unit
    11. EXPORTING
    12. text = text.
    13. CALL FUNCTION 'YLC_FUNC002' IN BACKGROUND UNIT my_unit
    14. EXPORTING
    15. text = text.
    16. CALL FUNCTION 'YLC_FUNC003' IN BACKGROUND UNIT my_unit
    17. EXPORTING
    18. text = text.
    19. CALL FUNCTION 'YLC_FUNC004' IN BACKGROUND UNIT my_unit
    20. EXPORTING
    21. text = text.
    22. CALL FUNCTION 'YLC_FUNC005' IN BACKGROUND UNIT my_unit
    23. EXPORTING
    24. text = text.
    25. COMMIT WORK.
    26. WRITE:/ 'Success'.
    27. CATCH cx_bgrfc_invalid_destination .
    28. WRITE:/ 'Error'.
    29. ENDTRY.

    出站队列bgRFC队列单元交叉场景示例

    1. DATA: my_destination TYPE REF TO if_bgrfc_destination_outbound,
    2. my_unit1 TYPE REF TO if_qrfc_unit_outbound,
    3. my_unit2 TYPE REF TO if_qrfc_unit_outbound,
    4. dest_name TYPE bgrfc_dest_name_outbound,
    5. queue_name TYPE qrfc_queue_name,
    6. queue_names TYPE qrfc_queue_name_tab.
    7. DATA: text TYPE text200.
    8. TRY.
    9. dest_name = 'LOCALTEST'.
    10. my_destination = cl_bgrfc_destination_outbound=>create( dest_name ).
    11. my_unit1 = my_destination->create_qrfc_unit( ).
    12. my_unit2 = my_destination->create_qrfc_unit( ).
    13. text = 'Simple Outbound - bgRFC type Q multiple'.
    14. CALL FUNCTION 'YLC_FUNC001' IN BACKGROUND UNIT my_unit1
    15. EXPORTING
    16. text = text.
    17. CALL FUNCTION 'YLC_FUNC002' IN BACKGROUND UNIT my_unit1
    18. EXPORTING
    19. text = text.
    20. CALL FUNCTION 'YLC_FUNC003' IN BACKGROUND UNIT my_unit2
    21. EXPORTING
    22. text = text.
    23. CALL FUNCTION 'YLC_FUNC004' IN BACKGROUND UNIT my_unit2
    24. EXPORTING
    25. text = text.
    26. CALL FUNCTION 'YLC_FUNC005' IN BACKGROUND UNIT my_unit2
    27. EXPORTING
    28. text = text.
    29. queue_name = 'TEST_FUN2'.
    30. INSERT queue_name INTO TABLE queue_names.
    31. my_unit2->add_queue_names_outbound( queue_names ).
    32. my_unit1->add_queue_name_outbound( 'TEST_FUN1' ).
    33. my_unit2->add_queue_name_outbound( 'TEST_FUN1' ).
    34. COMMIT WORK.
    35. WRITE:/ 'Success'.
    36. CATCH cx_bgrfc_invalid_destination .
    37. WRITE:/ 'Error'.
    38. CATCH cx_qrfc_invalid_queue_name .
    39. WRITE:/ 'Error'.
    40. CATCH cx_qrfc_duplicate_queue_name.
    41. WRITE:/ 'Error'.
    42. ENDTRY.

    单元1先创建,单元2后创建

    由于单元1和单元2均在队列1中,因此队列2需要等待单元1执行结束

     反之,先单元2再单元1,队列2不会等待队列1

    结果数据

    开发API

            锁定和解锁

            类 CL_QRFC_LOCK_INBOUND、CL_QRFC_LOCK_OUTBOUND 和 CL_QRFC_LOCK_NOSEND,您可以使用队列锁来阻止处理单元,也可以取消队列锁。

            LOCK_QUEUE_FROM_TOP 方法将第一个单元锁定在目标指定队列的开头。这使得追溯锁定队列成为可能。如果不存在任何单元,则会自动创建一个空单元来映射锁。

            LOCK_QUEUE_FROM_CURRENT_POS 方法锁定下一个单元的执行(指提交的单元),该单元被写入目标的指定队列。这使得抢先锁定队列成为可能。创建一个空单元来映射锁。

            所有队列锁在下一次 COMMIT WORK 时变为活动状态。如果在应用程序 LUW 中同时创建了单元锁和队列锁,则始终首先设置队列锁,然后将单元锁分配给适当的队列。

    1. DATA lock_id TYPE bgrfc_lock_id.
    2. lock_id = my_unit->delay( 30 ).
    3. lock_id = my_unit->lock( ).

            lock 一直锁定,直到手动处理

            delay 锁定一定时间后自动启动(单位 s)

     GET_UNIT_STATE返回后台单元状态

    GET_QUEUE_STATE查询 qRFC 单元的队列状态

    RUN_FAILED_UNIT再次启动有错误的单元

    DELETE_FAILED_UNIT方法删除有错误的单元

    CL_BGRFC_SERVER bgRFC服务器端类

    可在RFC中使用,如下可在RFC中获取当前单元ID

    DATA(lv_unit_id) = cl_bgrfc_server=>get_unit_id( ).

     异常

    例外

    原因

    CX_QRFC_DUPLICATE_LOCK

    后台 RFC 中的重复锁定

    CX_QRFC_DUPLICATE_QUEUE_NAME

    qRFC 中一个单元的重复队列名称

    CX_QRFC_INVALID_QUEUE_NAME

    队列名称无效

    CX_BGRFC_INVALID_DESTINATION

    后台 RFC 中的目标错误

    CX_BGRFC_INVALID_UNIT

    后台 RFC 单位无效

    CX_QRFC_NO_FAILED_UNIT

    队列不包含任何不正确的单位

    CX_QRFC_NO_SINGLE_QUEUE_NAME

    只允许使用一个队列名称

    CX_BGRFC_WRONG_EXEC_CONTEXT

    该函数无法在当前上下文中运行

    CX_BGRFC_ILLEGAL_PERMUTATION

    无效排列

    CX_BGRFC_INVALID_RETRY_KEY

    重试原因无效

    CX_BGRFC_INVALID_TIME_SPEC

    无效的日期规范

    CX_QRFC_NO_QUEUE_NAME

    缺少队列名称

    检查队列状态示例

    1. my_unit->if_bgrfc_unit~unit_id.
    2. DATA(lv_state) = cl_trfc_client_inbound=>if_bgrfc_client~get_unit_state( lv_unit_id ).
    3. IF lv_state = if_bgrfc_client=>unit_state_runnable OR
    4. lv_state = if_bgrfc_client=>unit_state_retry OR
    5. lv_state = if_bgrfc_client=>unit_state_in_execution.
    6. ENDIF.

    COMMIT WORK语句之后,一个单元被耗尽 。可以实现方法 CREATE_UNIT_BY_PATTERN以再次使用该单元。

    SEPARATE_FROM_UPDATE_TASK方法 删除单元处理和更新记录之间的绑定。 

    bgRFC监控管理

    事务代码 SBGRFCPERFMON

     修复错误后重启错误单元

     bgRFC调试

     报错队列会锁定,解锁后再重启错误单元

    注意事项

             RFC中不允许 WAIT, COMMIT WORK, ROLLBACK WORK语句,以及HTTP communication (using the class CL_HTTP_CLIENT) 和函数DB_COMMIT 的调用,可以使用MESSAGE进行干涉

            一个单元中的数据库操作,会在执行完后在数据库中持久化,如果此时出现错误消息,整个单元不能再次一起回滚。

            每个单元可以有任意数量的锁。一个单元只有在所有锁都被删除后才能被处理。每个锁由一个唯一的 lock_id表示. 只能释放自己的锁,其他程序的运行时行为不会受到过早释放锁的影响。

    https://blog.csdn.net/xiefireworks/article/details/126294866

  • 相关阅读:
    【Java】常用API——String类、Math类
    ZZNUOJ_用C语言编写程序实现1191:添加记录(结构体专题)(附完整源码)
    CDN加速与DDoS攻击防护:保障网站稳定与用户体验
    修改ant-design-vue的switch样式,去除顿顿的样式
    梯度下降、损失函数、神经网络的训练过程
    Python-Jenkins 在 Jenkins 中的应用
    macOS 系统 Kafka 快速入门
    rsync 备份工具(附rsync+inotify 实时同步部署实例)
    黑客(网络安全)自学
    现在的Android 开发面试都会问到一些什么?
  • 原文地址:https://blog.csdn.net/xiefireworks/article/details/126294866