ABAP 随机时间戳解码问题 SOTR_MESS 032

场景:我们这边有个推企业API的接口,因为接口逻辑是必须按主体去推送。当按主体推送的时候就会涉及到批量的问题,为了方便记录传输记录,每次我都会生成一个新的token。

生成token的参数中涉及到一个timestamp,也就是时间戳。这个时间戳是JAVA的时间戳,在使用ABAP生成的时候我做了个转码:代码如下


    data time type tzntstmpl.
    data str1 type string.
    data str2 type string.
    data tstmp1 type p.
    data tstmp2 type p.
    data secs type tzntstmpl.

    TYPES:BEGIN OF TY_DATA,
            TSTMP1 LIKE TSTMP1,
            TSTMP2 LIKE TSTMP1,
            STR1 TYPE STRING,
            STR2 TYPE STRING,
            TIME_13 TYPE STRING,
            MESSAGE TYPE STRING,
          END OF TY_DATA.

    DATA:LS_DATA TYPE TY_DATA.
    DATA:LT_ZAFL_LOG TYPE TABLE OF ZAFL_LOG,
         LS_ZAFL_LOG LIKE LINE OF LT_ZAFL_LOG.

    TRY.
      GET TIME STAMP FIELD TIME.
    CATCH CX_ROOT INTO DATA(LS_ROOT) .
      LS_DATA-MESSAGE = LS_ROOT->GET_LONGTEXT( ).
    ENDTRY.



    tstmp1 = time.
    tstmp2 = '19700101000000'.

    try.
        secs = cl_abap_tstmp=>subtract(
          tstmp1 = tstmp1
          tstmp2 = tstmp2
        ).
      catch cx_parameter_invalid_range .

      catch cx_parameter_invalid_type .

    endtry.

    str1 = secs.
    str2 = time.
    TIME_13 = str1(10) && str2+15(3).

接着,诡异的事情出现了,如果调一次的时候基本没什么问题,但是当批量调的时候就会出现token生成失败的问题。后面做了日志发现

当 GET TIME STAMP FIELD TIME. 生成的TIME 以60结尾的时候,比如"20220812111160",通过cl_abap_tstmp=>subtract去获取时间戳就会有问题,报错是SOTR_MESS 032。

具体原因是在:TSTMP2SECS 的42行做时间戳解析的时候报异常了

在这里插入图片描述

在这里插入图片描述

解决办法:
在异常报错处wait一个非整秒,然后重新执行

    data time type tzntstmpl.
    data str1 type string.
    data str2 type string.
    data tstmp1 type p.
    data tstmp2 type p.
    data secs type tzntstmpl.

    TYPES:BEGIN OF TY_DATA,
            TSTMP1 LIKE TSTMP1,
            TSTMP2 LIKE TSTMP1,
            STR1 TYPE STRING,
            STR2 TYPE STRING,
            TIME_13 TYPE STRING,
            MESSAGE TYPE STRING,
          END OF TY_DATA.

    DATA:LS_DATA TYPE TY_DATA.
    DATA:LT_ZAFL_LOG TYPE TABLE OF ZAFL_LOG,
         LS_ZAFL_LOG LIKE LINE OF LT_ZAFL_LOG.

    TRY.
      GET TIME STAMP FIELD TIME.
    CATCH CX_ROOT INTO DATA(LS_ROOT) .
      LS_DATA-MESSAGE = LS_ROOT->GET_LONGTEXT( ).
    ENDTRY.



    tstmp1 = time.
    tstmp2 = '19700101000000'.

    try.
        secs = cl_abap_tstmp=>subtract(
          tstmp1 = tstmp1
          tstmp2 = tstmp2
        ).
      catch cx_parameter_invalid_range .
          WAIT UP TO '0.18' SECONDS.
          GET TIME STAMP FIELD TIME.
          tstmp1 = time.

          secs = cl_abap_tstmp=>subtract(
            tstmp1 = tstmp1
            tstmp2 = tstmp2
          ).

      catch cx_parameter_invalid_type .
          WAIT UP TO '0.18' SECONDS.
          GET TIME STAMP FIELD TIME.
          tstmp1 = time.

          secs = cl_abap_tstmp=>subtract(
            tstmp1 = tstmp1
            tstmp2 = tstmp2
          ).
    endtry.

    str1 = secs.
    str2 = time.
    TIME_13 = str1(10) && str2+15(3).
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huang.lin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值