配置Geronimos MDB InstanceLimit

时间:2012-10-18 08:31:26

标签: java-ee jms activemq geronimo

我无法配置Geronimo / ActiveMQ,以便一次处理10个以上的消息。

我尝试了mailing list的建议, 但将maxSessions设置为高于10的值不会产生任何影响。将它设置为低于该值的东西虽然有效...

我还想通过设置{/ p>来设置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>

1 个答案:

答案 0 :(得分:1)

好的,最后我明白了!这是一个冗长的解释,希望也可以帮助别人。

在修改these examples之后,我发现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>

所以我决定走开OpenSource的道路!附上所涉及组件的所有必需源代码后:

  • Geronimo的
  • 的ActiveMQ
  • OpenEJB的

并且我想出了堆栈跟踪,InstanceLimit是一个明确查询的GBean属性。它的默认值是10,它在Geronimo中是硬编码的。通过在调试器中调用此值,我得到了希望的结果!

mailing list中也建议设置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>

(当然有正确的版本号) 但这没有任何效果。仔细阅读此hint

  

尝试将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并且可以通过ActiveMQ的maxSessions属性配置并行工作MDB!