好的,我终于明白了!这是一个冗长的解释,希望对某人也有帮助。
在修改了这些示例之后,我发现 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>
所以我决定走开源之路!附加相关组件的所有需要的源代码后:
并在堆栈跟踪中发现,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 并可以通过maxSessions
ActiveMQ 的属性配置并行工作的 MDB!