actives参数隶属于标签dubbo:reference,是客户端独有的参数。它的官方定义是“每服务消费者每服务每方法最大并发调用数”。
示例代码在 https://github.com/ralgond/dubbo-example/releases/tag/v0.0.7
v0.0.7增加了一个类来测试ApiSleepConsumerTwoThreads来测试参数actives。代码如下:
public class ApiSleepConsumerTwoThreads {
public static class ConsumerThread extends Thread {
GreetingService service;
public ConsumerThread(GreetingService service, int id) {
super(""+id);
this.service = service;
}
public void run() {
long begin = System.currentTimeMillis();
System.out.println("["+this.getName()+"] begin:"+begin+" ");
service.sleepMs(3000);
long end = System.currentTimeMillis();
System.out.println("["+this.getName()+"] end :"+end+ " eclapsed: "+(end - begin)+"ms");
}
}
public static void main(String args[]) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
context.start();
GreetingService service = (GreetingService)context.getBean("greetingService");
ConsumerThread t1 = new ConsumerThread(service, 1);
ConsumerThread t2 = new ConsumerThread(service, 2);
t1.start();
t2.start();
try {
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
ApiSleepConsumerTwoThreads启动后,会创建两条线程,线程启动后会调用接口GreetingService.sleepMs。
我们先不设置actives,并设置connections为1,也即是只和服务端保持一条连接,配置如下:
<dubbo:reference id="greetingService" interface="com.github.ralgond.de.sdk.GreetingService" group="dubbo" version="0.0.1"
timeout="30000" connections="1" check="false"/>
启动ApiSleepConsumerTwoThreads,Console会打印:
[1] begin:1605411200246
[2] begin:1605411200246
[1] end :1605411203313 eclapsed: 3067ms
[2] end :1605411203313 eclapsed: 3067ms
可见[1605411200246,1605411203313]和[1605411200246,1605411203313]是重叠的,也就是说即便是只有一条连接,客户端的请求也会并行地执行。
接下来我们设置actives为1(最大并行数为1),并设置connections为2,也即是和服务端保持两条连接,配置如下:
<dubbo:reference id="greetingService" interface="com.github.ralgond.de.sdk.GreetingService" group="dubbo" version="0.0.1"
timeout="30000" connections="2" check="false" actives="1"/>
启动ApiSleepConsumerTwoThreads,Console会打印:
[1] begin:1605411404151
[2] begin:1605411404151
[2] end :1605411407213 eclapsed: 3062ms
[1] end :1605411410220 eclapsed: 6069ms
可见两个线程并不是并行地请求服务端,而是串行地访问,即使是和服务端有多条连接的情况下。