使用CL_ABAP_GZIP_TEXT_STREAM的并发压缩流

2020-09-09 17:00发布

点击此处---> 群内免费提供SAP练习系统(在群公告中)加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)嗨, 使用CL_ABAP_GZ...

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

使用CL_ABAP_GZIP_TEXT_STREAM时,它需要一个缓冲接口if_abap_gzip_text_handler〜use_out_buf,该接口被定义为静态接口。

当我需要单个压缩流时,这很好用。 例如。 遍历单个表,使用单个gzip流将数据写出。

但是,当我需要多个独立的并发压缩流(将记录并发写入多个文件)时,这将不起作用,因为user_outbuf类具有静态变量/方法,这意味着缓冲区值将混合在一起。 例如。 遍历一个表将其记录写出,并查询另一张表以获取相关记录并写出相同类型user_outbuf的不同压缩流。

是否有更干净的方法来解决此问题,而不是一遍又一遍地重新定义具有不同名称的相同类以获得并发支持? 例如 (复制类定义/实现),然后引用:
uref1 TYPE REF to user_outbuf1,
uref2 TYPE REF TO user_outbuf2,
etc

谢谢,
周杰伦:)

示例代码:

报告测试。

 "定义一个缓冲区处理程序类
 CLASS user_outbuf定义。
   公共部分。
     接口if_abap_gzip_text_handler。
     类别数据:
          缓冲区类型x长度1000,"缓冲区的预定义大小
          buffer_len TYPE I VALUE -1。  " -1表示缓冲区的总长度
 ENDCLASS。

 类别user_outbuf IMPLEMENTATION。
   方法if_abap_gzip_text_handler〜use_out_buf。
    写:/缓冲区。
   终结法。
 ENDCLASS。

 选择开始。

 数据:
       uref TYPE REF to user_outbuf,
       uref2 TYPE USER_OUTBUF,
       csref TYPE REF TO CL_ABAP_GZIP_TEXT_STREAM。

 "创建缓冲区的副本
 创建对象uref。
 "创建gzip压缩类的副本
 创建对象csref
    导出转换='默认'
               OUTPUT_HANDLER =尿素。
 "设置缓冲区
 csref-> set_out_buf(
   输入
       out_buf = uref->缓冲
       out_buf_len = uref-> buffer_len
 )。
 压缩一些数据
 调用方法csref-> compress_text_stream
     出口
       TEXT_IN ='一些文字'
       TEXT_IN_LEN = -1。
 调用方法csref-> compress_text_stream_end
     EXPORTING TEXT_IN ='最后一个文本'
                TEXT_IN_LEN = -1。
 "创建一个新的缓冲区,
 ",因为if_abap_gzip_text_handler〜use_out_buf是静态的
 "缓冲区变量也必须是静态的,因此,
 "不能在另一个压缩实例中同时重用
 创建对象uref2。
 写:/uref2->缓冲区。
 
5条回答
浮生未央
2020-09-09 17:38

我不确定我是否理解您的问题,但是我认为这段代码可以帮助您解决。

报告zzzjc_test01。

 "定义一个缓冲区处理程序类
 类user_outbuf定义。
   公共部分。
     接口if_abap_gzip_text_handler。
     类数据:
       缓冲区类型x长度1000,"缓冲区的预定义大小
       buffer_len类型i值为-1。  " -1表示缓冲区的总长度
 结束类。

 类user_outbuf实现。
   方法if_abap_gzip_text_handler〜use_out_buf。
     写:/缓冲区。
   方法。
 结束类。

 选择开始。

   类型以lty_list_buffers开头。
   类型uref类型ref到user_outbuf。
   类型csref类型ref到cl_abap_gzip_text_stream。
   输入lty_list_buffers的结尾。

   类型lty_list_buffers_tt类型为lty_list_buffers的标准表,带有空键。

   数据lt_list_buffers类型为lty_list_buffers_tt。

   您输入的文本作为一个行程表
   数据lt_input_text类型带空键的字符串标准表。

   循环在lt_input_text分配字段符号()。

     将初始行附加到分配field-symbol()的lt_list_buffers。

      -uref =新的user_outbuf()。

      -csref
         =新的cl_abap_gzip_text_stream(
             conversion ='DEFAULT'
             output_handler =  -uref)。

      -csref-> set_out_buf(
         输入
         out_buf =  -uref->缓冲区
         out_buf_len =  -uref-> buffer_len
     )。

      -csref-> compress_text_stream(
       出口
         text_in = 
         text_in_len = -1
     )。

      -csref-> compress_text_stream_end(
       出口
         text_in = 
         text_in_len = -1
     )。

   结束循环。

   在lt_list_buffers分配处循环。
     写入/ -uref->缓冲区。
   结束循环。
 

一周热门 更多>