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
交互,唯一不同的是Interaction
在FutureListener
里面ctx.curPromise().setResult(response);
将最终的结果进行返回,而Action
是通过callBack.callBack(response);
方式返回结果。
还需要注意的是内部调用的clientType
是ClientType.INTERNAL
并且只能是这个。