java - 为什么 JBoss 只创建一个 ActiveMQ 消费者?

标签 java activemq message-driven-bean jboss-eap-7 resource-adapter

为什么 JBoss EAP 7 仅使用 Active MQ 创建一个使用者(而不是 Artemis)?如何增加消费者数量?

我已经尝试过:

  • 增加 maxSession ActivationConfigProperty
  • 增加 mdb 池大小(通过 bean-instance-pools 标记)
  • connection-definition标签内设置最小/最大池大小

我的配置:

mdb池配置

<subsystem xmlns="urn:jboss:domain:ejb3:5.0">
...
<mdb>
    <resource-adapter-ref resource-adapter-name="com.icl.amq.jmsra.rar"/>
    <bean-instance-pool-ref pool-name="mdb-strict-max-pool"/>
</mdb>
<pools>
    <bean-instance-pools>
        <strict-max-pool name="slsb-strict-max-pool" max-pool-size="5" instance-acquisition-timeout="10" instance-acquisition-timeout-unit="MINUTES"/>
        <strict-max-pool name="mdb-strict-max-pool" max-pool-size="40" instance-acquisition-timeout="10" instance-acquisition-timeout-unit="MINUTES"/>
    </bean-instance-pools>
</pools>
...

资源适配器配置

<subsystem xmlns="urn:jboss:domain:resource-adapters:5.0">
...
 <resource-adapter id="amq.jmsra.main">
    ...
     <connection-definitions>
         <connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="${amq.jndi.factory}" enabled="true" pool-name="ConnectionFactory">
             <xa-pool>
                 <min-pool-size>10</min-pool-size>
                 <initial-pool-size>10</initial-pool-size>
                 <max-pool-size>35</max-pool-size>
             </xa-pool>
         </connection-definition>
     </connection-definitions>
 </resource-adapter>
...

MDB代码:

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "connectionFactoryLookup", propertyValue = "${amq.jndi.factory}"),
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "in_queue"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName="minSessions", propertyValue="5"),
        @ActivationConfigProperty(propertyName="maxSessions", propertyValue="40")
})
@ResourceAdapter("amq.jmsra.main")
public class ServerMessageListener implements MessageListener {
...

我预计此配置会增加消费者数量,但是当从 ActiveMQ Web 控制台查看队列状态时,我只看到 1 个消费者。

最佳答案

在我看来,根据 ActiveMQ JCA RA 的源代码, session 将根据消息吞吐量按需创建,最多可达 maxSessions。因此,如果您只是启动 MDB 并且没有要使用的消息,那么我预计只有 1 个 session 处于 Activity 状态。

尝试将 Thread.sleep(5000); 放入 MDB 的 onMessage() 中,然后将几千条消息推送到其监听的队列中。我打赌您会看到消费者数量增加,因为 JCA RA 被迫创建新 session 以满足需求。

关于java - 为什么 JBoss 只创建一个 ActiveMQ 消费者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56790454/

相关文章:

java - 如何从应用程序服务器(EJB)通知(或发送消息) Swing 客户端?

java - jboss 5.1中seam和mdb的问题

Java:父类(super class)的接口(interface)泛型

java - 为什么我的 RadioGroup 返回 'false'

xml - 无法为 ActiveMQ 设置 broker-bean

java - Apache MQ 扫描消息

jms - 非法尝试将单相资源与现有的两相资源一起提交

java - 为什么我应该使用 JPanel?

java - 使用 toCharArray() 的字符串文字在 Java 中产生垃圾

java - ActiveMQ-如何检测非 Activity 主题