前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >回调函数在Java中的应用

回调函数在Java中的应用

作者头像
程序猿杜小头
发布2022-12-01 21:35:56
2.9K0
发布2022-12-01 21:35:56
举报
文章被收录于专栏:程序猿杜小头程序猿杜小头

回调函数在Java中的应用

In computer programming, a callback function, is any executable code that is passed as an argument to other code; that other code is expected to call back (execute) the argument at a given time. This execution may be immediate as in a synchronous callback, or it might happen at a later point in time as in an asynchronous callback.

关于回调函数(Callback Function),维基百科已经给出了相当简洁精炼的释义。Java的面向对象模型不支持函数,其无法像C语言那样,直接将函数指针作为参数;尽管如此,我们依然可以基于接口来获得等效的回调体验。

最近在负责mop平台对接工作,但mop平台下单接口耗时近十秒,是的,你没看错,十秒!!!我们产品侧在调用mop下单接口后还会有后续逻辑,主要是解析mop下单接口的响应,将订单ID与订单项ID持久化到数据库中;由于mop下单接口耗时较多,就会导致我们产品侧接口响应时间延长,原本响应时间不到一秒,但现在增加大了十秒。于是,我们采用异步回调机制来解决这个问题。

mop client sdk 同步下单接口

由于与mop平台的对接涉及接口众多,我们就封装了一套mop client sdk,方便团队其他项目使用。

代码语言:javascript
复制
public CreateOrderRespDto createOrderSync(CreateOrderSyncReq req) {
    return super.execute(
            MopAbilityConstants.CREATE_ORDER_SYNC_ABILITY,
            req,
            CreateOrderRespDto.class,
            1);
}

毫无疑问,调用createOrderSync同步下单接口会阻塞产品侧主干线程,大大增加了产品侧接口响应时间,十秒钟的响应时间,测试这一关都过不去啊。

代码语言:javascript
复制
CreateOrderRespDto createOrderRespDto = mopServiceClient.createOrderSync(createOrderSyncReq);
OrderExt orderExt = new OrderExt();
orderExt.setOrderId(createOrderRespDto.getOrderId());
orderExt.setState(FALSE);
orderExt.setVersion(0L);
orderExt.setOrderExtId(createOrderRespDto.getOrderExtId());
orderExtService.addOrderExt(orderExt);

回调改造

1 定义回调接口

代码语言:javascript
复制
public interface ActionListener<Object> {
    void onResponse(Object response);
    void onFailure(Exception e);
}

2 mop client sdk 异步下单接口

我们在mop client sdk层新增一个异步下单接口,所谓异步,无非就是将mop下单逻辑交由单独的线程去处理,从而避免阻塞产品侧主干业务线程。

代码语言:javascript
复制
public void createOrderAsync(CreateOrderSyncReq req, ActionListener<Object> actionListener) {
    MOP_THREAD_POOL.submit(() -> {
        try {
            CreateOrderRespDto createOrderRespDto = createOrderSync(req);
            actionListener.onResponse(createOrderRespDto);
        } catch (Exception e) {
            actionListener.onFailure(e);
        }
    });
}

3 产品侧业务层调用异步下单接口

代码语言:javascript
复制
mopServiceClient.createOrderAsync(
        createOrderSyncReq,
        new ActionListener<Object>() {
            @Override
            public void onResponse(Object response) {
                CreateOrderRespDto createOrderRespDto = (CreateOrderRespDto) response;
                OrderExt orderExt = new OrderExt();
                orderExt.setOrderId(createOrderRespDto.getOrderId());
                orderExt.setState(FALSE);
                orderExt.setVersion(0L);
                orderExt.setOrderExtId(createOrderRespDto.getOrderExtId());
                orderExtService.addOrderExt(orderExt);
            }
            
            @Override
            public void onFailure(Exception e) {
                log.error("后付费非审批订购失败", e);
            }
        });
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序猿杜小头 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回调函数在Java中的应用
    • mop client sdk 同步下单接口
      • 回调改造
        • 1 定义回调接口
        • 2 mop client sdk 异步下单接口
        • 3 产品侧业务层调用异步下单接口
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档