1

我无法配置 Geronimo/ActiveMQ 以便一次处理超过 10 条消息。

我尝试了此邮件列表中的建议,但将 设置maxSessions为高于 10 的值没有任何效果。将其设置为低于该值会产生效果...

我也尝试InstanceLimit通过设置来设置:

<module name="org.apache.geronimo.configs/j2ee-server/2.1.4/car">
    <gbean name="org.apache.geronimo.configs/j2ee-server/2.1.4/car?ServiceModule=org.apache.geronimo.configs/j2ee-server/2.1.4/car,j2eeType=GBean,name=CustomPropertiesGBean" 
           gbeanInfo="org.apache.geronimo.system.properties.SystemProperties">
        <attribute name="systemProperties">Default\ MDB\ Container.InstanceLimit=50</attribute>
    </gbean>
</module>
4

1 回答 1

1

好的,我终于明白了!这是一个冗长的解释,希望对某人也有帮助。

在修改了这些示例之后,我发现 ActiveMQ 的激活参数并没有限制上限,但是我们可以减少并行实例:

<activation-config-property>
    <activation-config-property-name>destinationType</activation-config-property-name>
    <activation-config-property-value>javax.jms.Queue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
    <activation-config-property-name>maxSessions</activation-config-property-name>
    <activation-config-property-value>3</activation-config-property-value>
</activation-config-property>
<activation-config-property>
    <activation-config-property-name>maxMessagesPerSessions</activation-config-property-name>
    <activation-config-property-value>2</activation-config-property-value>
</activation-config-property>

所以我决定走开源之路!附加相关组件的所有需要​​的源代码后:

  • 杰罗尼莫
  • 活动MQ
  • 开放式EJB

并在堆栈跟踪中发现,InstanceLimit 是一个明确查询的 GBean 属性。它的默认值为 10,这是在 Geronimo 中硬编码的。通过在调试器中调整这个值,我得到了想要的结果!

但是在邮件列表中也建议设置 InstanceLimit ,建议将其添加到 Geronimos config.xml

<module name="org.apache.geronimo.configs/j2ee-server/2.1.4/car">
    <gbean name="org.apache.geronimo.configs/j2ee-server/2.1.4/car?ServiceModule=org.apache.geronimo.configs/j2ee-server/2.1.4/car,j2eeType=GBean,name=CustomPropertiesGBean" 
           gbeanInfo="org.apache.geronimo.system.properties.SystemProperties">
        <attribute name="systemProperties">Default\ MDB\ Container.InstanceLimit=50</attribute>
     </gbean>
</module>

(当然使用正确的版本号)但这没有任何效果。仔细阅读此提示后:

尝试将 MdbContainer 的 InstanceLimit 属性设置为 0,以便创建的实例数与可用的 AMQ 会话数相匹配。要设置它,您需要将其设置为系统属性。该属性应为 containerId.InstanceLimit 其中 containerId 的格式为

<artifactId>.<Resource Group Name>-<listener interface>

例如:org.apache.geronimo.configs/activemq-ra/2.2-SNAPSHOT/car.ActiveMQ RA-javax.jms.MessageListener

  • <artifactId>= jms RA 的 artifactId
  • <Resource Group Name>- 您在创建 RA 时提供的资源组名称
  • <listener interface>- javax.jms.MessageListener 在这种情况下

并检查 Geronimos 代码和运行时状态,我发现它正在寻找org.apache.geronimo.openejb.OpenEjbSystemGBean第 309 行中的 InstanceLimit,其目标 ID 位于示例项目中:

org.apache.geronimo.configs/activemq-ra/2.2.1/car.ActiveMQ RA-javax.jms.MessageListener

有了这些信息,我试了一下:

<module name="org.apache.geronimo.configs/j2ee-server/2.2.1/car">
    <gbean name="org.apache.geronimo.configs/j2ee-server/2.2.1/car?ServiceModule=org.apache.geronimo.configs/j2ee-server/2.2.1/car,j2eeType=GBean,name=CustomPropertiesGBean" 
               gbeanInfo="org.apache.geronimo.system.properties.SystemProperties">
        <attribute name="systemProperties">org.apache.geronimo.configs/activemq-ra/2.2.1/car.ActiveMQ\ RA-javax.jms.MessageListener.InstanceLimit=50</attribute>
    </gbean>
</module>

它奏效了!由此我从调试会话中获得了使用的 ID... 现在我们可以设置 InstanceLimit=0 并可以通过maxSessionsActiveMQ 的属性配置并行工作的 MDB!

于 2012-10-18T08:34:46.710 回答