回调函数在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
同步下单接口会阻塞产品侧主干线程,大大增加了产品侧接口响应时间,十秒钟的响应时间,测试这一关都过不去啊。
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);
}
});