JAVA jms队列与JNDI配置,15分钟空闲后无法读取消息

时间:2017-08-07 12:06:26

标签: java queue jms spring-jms jboss-4.2.x

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版本。

参考网址: https://access.redhat.com/documentation/en-US/JBoss_Enterprise_Application_Platform/4.3/html/Messaging_User_Guide/conf.connectionfactory.html

<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>

0 个答案:

没有答案
相关问题