Reactor已经将业务进行了模块化,并且每个交互和每个模块都是独立的。那么如果某个业务依赖其他业务,在Reactor里面可以通过内部调用的方式重用其他的业务逻辑,从而提高代码整体的利用率。

在介绍clientType的时候有一个类型是内部调用的客户端类型——internal,这个类型便是用来实现内部调用的目的。

下面给出几个实例:

一、基于Interaction实现嵌套调用

public class HelloWorldInteraction extends InteractionEntity {
    @Override
    public void interactive(final Context ctx, Event evt) {
        final FirstRequest request = (FirstRequest) evt.getMessage();
        HelloRequest helloRequest = new HelloRequest();
        helloRequest.setOperation("cashier/first");
        helloRequest.setClientType(ClientType.INTERNAL);
        helloRequest.setClientVer("4.4.4");
        Future<HelloResposne> future = ctx.getAcceptor().fireMessageReceivedEvt(helloRequest, HelloResposne.class, ctx);
        future.addListener(new FutureListener<HelloResposne>() {

            @Override
            public void operationComplete(Future<HelloResposne> future, Object attachment) {
                try {
                    final FirstResponse response = new FirstResponse();
                    response.setHello("hello " + request.getName() + " internal " + future.get().getHello());
                    ctx.curPromise().setResult(response);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

二、基于Action实现嵌套调用

public class FirstInteraction extends AsyAction<FirstRequest, FirstResponse> {

    @Override
    public void asyAction(final FirstRequest request, Context context, Event event, final AsyActionCallBack<FirstResponse> callBack) {
        HelloRequest helloRequest = new HelloRequest();
        helloRequest.setOperation("cashier/first");
        helloRequest.setClientType(ClientType.INTERNAL);
        helloRequest.setClientVer("4.4.4");
        Future<HelloResposne> future = context.getAcceptor().fireMessageReceivedEvt(helloRequest, HelloResposne.class, context);
        future.addListener(new FutureListener<HelloResposne>() {

            @Override
            public void operationComplete(Future<HelloResposne> future, Object attachment) {
                try {
                    final FirstResponse response = new FirstResponse();
                    response.setHello("hello " + request.getName() + " internal " + future.get().getHello());
                    callBack.callBack(response);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

    }
}

上面两个均内调用了cashier/first交互,唯一不同的是InteractionFutureListener里面ctx.curPromise().setResult(response);将最终的结果进行返回,而Action是通过callBack.callBack(response);方式返回结果。

还需要注意的是内部调用的clientTypeClientType.INTERNAL 并且只能是这个