24.6. 客户端线程管理

JBoss EAP 包括用于创建客户端连接的客户端线程池。这个池与本章前面提到的静态池分开,在 JBoss EAP 的行为类似于客户端时使用它。例如,客户端线程池客户端作为与同一集群中其他节点的群集连接创建,或者当 Artemis 资源适配器连接到集成于 JBoss EAP 远程实例的远程 Apache ActiveMQ Artemis 消息传递服务器时。还有一个用于调度的客户端线程的池。

注意

随着 JBoss EAP 7.1 的发布,客户端线程现在会在 60 秒后超时,没有活动。

使用管理 CLI 设置客户端线程池大小

使用管理 CLI 配置客户端线程池和客户端调度线程池的大小。使用管理 CLI 设置的池大小优先于使用系统属性设置的大小。

以下命令设置客户端线程池。

/subsystem=messaging-activemq:write-attribute(name=global-client-thread-pool-max-size,value=POOL_SIZE)

此属性没有定义默认值。如果未定义 属性,则池的最大大小确定为 CPU 内核处理器的八(8)倍。

若要查看当前的设置,可使用以下命令:

/subsystem=messaging-activemq:read-attribute(name=global-client-thread-pool-max-size)

使用以下命令设置客户端计划线程池大小:

/subsystem=messaging-activemq:write-attribute(name=global-client-scheduled-thread-pool-max-size,value=POOL_SIZE)

以下将显示客户端计划线程池的当前池大小:默认值为 5

/subsystem=messaging-activemq:read-attribute(name=global-client-scheduled-thread-pool-max-size)

使用系统属性设置客户端线程池大小

以下系统属性可用于分别设置客户端的全局和全局调度线程池的大小:

  • activemq.artemis.client.global.thread.pool.max.size
  • activemq.artemis.client.global.scheduled.thread.pool.core.size

然后,可以在 XML 配置中引用系统属性,如下例所示。

注意

使用管理 CLI 设置的池大小将优先于系统属性所设置的大小。

<subsystem xmlns="urn:jboss:domain:messaging-activemq:4.0">
  <global-client thread-pool-max-size="${activemq.artemis.client.global.thread.pool.max.size}"
    scheduled-thread-pool-max-size="${activemq.artemis.client.global.scheduled.thread.pool.core.size}" />
  <server ...>
  </server>
  ...
</subsystem>

配置客户端以使用其拥有的线程池

客户端可以配置其每个 ClientSessionFactory 实例,使其不使用 JBoss EAP 提供的池,而是使用自己的客户端线程池。从该 客户端SessionFactory 创建的任何会话都将使用新创建的池。

要将 ClientSessionFactory 实例配置为使用其自己的池,请在创建工厂后立即调用适当的 setter 方法。例如:

ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(transportConfiguration);
locator.setUseGlobalPools(true);
locator.setThreadPoolMaxSize(-1);
locator.setScheduledThreadPoolMaxSize(10);
ClientSessionFactory myFactory = locator.createSessionFactory();

如果使用 Jakarta Messaging API,您可以在 ClientSessionFactory 上设置相同的参数。例如:

ActiveMQConnectionFactory myConnectionFactory = ActiveMQJMSClient.createConnectionFactory(url, "ConnectionFactoryName");
myConnectionFactory.setUseGlobalPools(false);
myConnectionFactory.setScheduledThreadPoolMaxSize(10);
myConnectionFactory.setThreadPoolMaxSize(-1);

如果您使用 JNDI 来实例化 ActiveMQConnectionFactory 实例,您也可以使用管理 CLI 来设置这些参数,如下例所示,适用于 JBoss EAP 单机实例。

/subsystem=messaging-activemq/server=default/connection-factory=myConnectionFactory:write-attribute(name=use-global-pools,value=false)

/subsystem=messaging-activemq/server=default/connection-factory=myConnectionFactory:write-attribute(name=scheduled-thread-pool-max-size,value=10)

/subsystem=messaging-activemq/server=default/connection-factory=myConnectionFactory:write-attribute(name=thread-pool-max-size,value=1)

请注意,管理 CLI 将提醒您在执行上述每个命令后需要重新加载实例。