回调函数在Java中的应用

2022-12-01 21:35:56 浏览数 (1)

回调函数在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);
            }
        });

0 人点赞