SOFARPC 支持自定义业务线程池。可以为指定服务设置一个独立的业务线程池,和 SOFARPC 自身的业务线程池是隔离的。多个服务可以共用一个独立的线程池。

SOFARPC 要求自定义线程池的类型必须是 com.alipay.sofa.rpc.server.UserThreadPool

XML 方式

如果采用 XML 的方式发布服务,可以先设定一个 class 为 com.alipay.sofa.rpc.server.UserThreadPool 的线程池的 Bean,然后设置到 <sofa:global-attrs> 标签的 thread-pool-ref 属性中:

  1. <bean id="helloService" class="com.alipay.sofa.rpc.quickstart.HelloService"/>
  2. <!-- 自定义一个线程池 -->
  3. <bean id="customExecutor" class="com.alipay.sofa.rpc.server.UserThreadPool" init-method="init">
  4. <property name="corePoolSize" value="10" />
  5. <property name="maximumPoolSize" value="10" />
  6. <property name="queueSize" value="0" />
  7. </bean>
  8. <sofa:service ref="helloService" interface="XXXService">
  9. <sofa:binding.bolt>
  10. <!-- 将线程池设置给一个 Service -->
  11. <sofa:global-attrs thread-pool-ref="customExecutor"/>
  12. </sofa:binding.bolt>
  13. </sofa:service>

Annotation 方式

如果是采用 Annotation 的方式发布服务,可以通过设置 @SofaServiceBindinguserThreadPool 属性来设置自定义线程池的 Bean:

  1. @SofaService(bindings = {@SofaServiceBinding(bindingType = "bolt", userThreadPool = "customThreadPool")})
  2. public class SampleServiceImpl implements SampleService {
  3. }

在 Spring 环境使用 API 方式

如果是在 Spring 环境下使用 API 的方式发布服务,可以通过调用 BoltBindingParamsetUserThreadPool 方法来设置自定义线程池:

  1. BoltBindingParam boltBindingParam = new BoltBindingParam();
  2. boltBindingParam.setUserThreadPool(new UserThreadPool());

在非 Spring 环境下使用 API 方式

如果是在非 Spring 环境下使用 API 的方式,可以通过如下的方式来设置自定义线程池:

  1. UserThreadPool threadPool = new UserThreadPool();
  2. threadPool.setCorePoolSize(10);
  3. threadPool.setMaximumPoolSize(100);
  4. threadPool.setKeepAliveTime(200);
  5. threadPool.setPrestartAllCoreThreads(false);
  6. threadPool.setAllowCoreThreadTimeOut(false);
  7. threadPool.setQueueSize(200);
  8. UserThreadPoolManager.registerUserThread(ConfigUniqueNameGenerator.getUniqueName(providerConfig), threadPool);

如上为 HelloService 服务设置了一个自定义线程池。