JMS队列已使用jndi与jms服务器配置,并且是凭据/连接池驱动的。我们在使用队列时观察到一个问题。当我们在队列中接收连续消息时,侦听器应用程序能够立即读取消息但是在两个15分钟消息之间的延迟(空闲时间)之后,消息不会从队列中读取(即使将更多数量的新消息添加到队列中,这可以在jms管理控制台中看到)。
如果重新启动侦听器应用程序或重新启动jms服务器,则会读取队列消息。 Jboss版本是JBoss 4.3.0.GA_CP10(build:SVNTag = JBPAPP_4_3_0_GA_CP10 date = 201107201825)
请告诉我,JMS服务器jndi配置更改可能有助于解决问题。最初的想法是将以下属性添加到将重试的JMS服务器配置中。
jboss消息传递(JBM)或jboss远程处理(JBRM)的升级是否会有所帮助,如果能够分享如何查看它们的当前版本以及我在哪里可以找到Service Pack / upgrade / patch并且它是否兼容用我的jboss版本。
<attribute name="MaxRetryChangeRate">-1</attribute>
<attribute name="RetryChangeRateInterval">3000</attribute>
请查看以下配置 JMS服务器JNDI配置:
<mbean code="org.jboss.jms.server.connectionfactory.ConnectionFactory"
name="jboss.messaging.connectionfactory:service=ClusteredConnectionFactory"
xmbean-dd="xmdesc/ConnectionFactory-xmbean.xml">
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
<depends optional-attribute-name="Connector">jboss.messaging:service=Connector,transport=sslbisocket</depends>
<depends>jboss.messaging:service=PostOffice</depends>
<attribute name="JNDIBindings">
<bindings>
<binding>/ClusteredConnectionFactory</binding>
<binding>/ClusteredXAConnectionFactory</binding>
<binding>java:/ClusteredConnectionFactory</binding>
<binding>java:/ClusteredXAConnectionFactory</binding>
</bindings>
</attribute>
<attribute name="SupportsFailover">true</attribute>
<attribute name="SupportsLoadBalancing">true</attribute>
<attribute name="LoadBalancingFactory">org.jboss.jms.client.plugin.RoundRobinLoadBalancingFactory</attribute>
<attribute name="DisableRemotingChecks">true</attribute>
<attribute name="MinTimeoutProcessTime">5000</attribute>
</mbean>
应用弹簧配置:
<jms:listener-container connection-factory="jmsConnectionFactory" destination-resolver="jmsDestinationResolver" acknowledge="auto" client-id="xyz" >
<jms:listener destination="destination" ref="listener" method="onMessage" id="listener" />
</jms:listener-container>
<bean id="listener" class="package.Listener" ></bean>
<bean id="jmsDestinationResolver" class="org.springframework.jms.support.destination.BeanFactoryDestinationResolver" />
<bean id="destination" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName" value="${jms.destination}" />
</bean>
<bean id="jmsConnectionFactory" class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
<property name="targetConnectionFactory" ref="cachedConnectionFactory" />
<property name="username" value="${jms.userName}" />
<property name="password" value="${jms.password}" />
</bean>
<bean id="cachedConnectionFactory" class="package.CachedConnectionFactory">
<constructor-arg index="0" ref="nativeConnectionFactory" />
<constructor-arg index="1" value="2" />
<constructor-arg index="2" value="60000" />
</bean>
<bean id="nativeConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiTemplate">
<ref bean="jndiTemplate" />
</property>
<property name="jndiName" value="${clusteredConnectionFactory}" />
</bean>
<bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.provider.url">${url}</prop>
<prop key="java.naming.factory.url.pkgs">org.jnp.interfaces:org.jboss.naming</prop>
<prop key="java.naming.factory.initial">org.jnp.interfaces.NamingContextFactory</prop>
</props>
</property>
</bean>