【问题标题】:Weblogic JMS client threads stuck while refreshing connectionWeblogic JMS 客户端线程在刷新连接时卡住
【发布时间】:2011-06-11 07:55:16
【问题描述】:

您好,

我们正在使用 Spring 与使用 wlfullclient.jar 的 Weblogic JMS 服务器集成。每隔一段时间,jmsListenerthreads 就会卡住。我们观察到刷新连接时会发生这种情况。

使用的版本: wlfullClient.jar:10.0.1 春天:3.0.3

几个卡住的线程的堆栈跟踪:

    Name: jmsListenerContainer-1770
State: WAITING on weblogic.jms.client.JMSSession@35c0fb37
Total blocked: 3,681  Total waited: 3,664

Stack trace: 
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:485)
weblogic.jms.client.JMSSession.waitForState(JMSSession.java:4239)
weblogic.jms.client.JMSSession.close(JMSSession.java:1259)
weblogic.jms.client.JMSConnection.closeSessions(JMSConnection.java:1076)
weblogic.jms.client.JMSConnection.mergedCloseAndOnException(JMSConnection.java:950)
   - locked weblogic.jms.client.JMSConnection@3263f76c
weblogic.jms.client.JMSConnection.close(JMSConnection.java:763)
weblogic.jms.client.ReconnectController.close(ReconnectController.java:426)
org.springframework.jms.connection.ConnectionFactoryUtils.releaseConnection(ConnectionFactoryUtils.java:80)
org.springframework.jms.listener.AbstractJmsListeningContainer.refreshSharedConnection(AbstractJmsListeningContainer.java:385)
   - locked java.lang.Object@51ce8880
org.springframework.jms.listener.DefaultMessageListenerContainer.refreshConnectionUntilSuccessful(DefaultMessageListenerContainer.java:856)
org.springframework.jms.listener.DefaultMessageListenerContainer.recoverAfterListenerSetupFailure(DefaultMessageListenerContainer.java:838)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:969)
   - locked java.lang.Object@c2330fa
java.lang.Thread.run(Thread.java:619)

Name: jmsListenerContainer-1755
State: TIMED_WAITING on java.lang.Object@b5c4560
Total blocked: 3,588  Total waited: 3,605

Stack trace: 
java.lang.Object.wait(Native Method)
weblogic.jms.client.ReconnectController.waitForStateInternal(ReconnectController.java:309)
weblogic.jms.client.ReconnectController.analyzeExceptionAndReconnect(ReconnectController.java:525)
weblogic.jms.client.ReconnectController.computeJMSConsumer(ReconnectController.java:652)
weblogic.jms.client.WLConsumerImpl.receive(WLConsumerImpl.java:166)
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:405)
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:308)
org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:261)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1056)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1048)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:947)
java.lang.Thread.run(Thread.java:619)

Name: jmsListenerContainer-1732
State: BLOCKED on java.lang.Object@51ce8880 owned by: jmsListenerContainer-1770
Total blocked: 3,586  Total waited: 3,584

Stack trace: 
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.clearResources(DefaultMessageListenerContainer.java:1096)
org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:958)
java.lang.Thread.run(Thread.java:619)

弹簧配置:

<bean id="messageListener"
  class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
  <constructor-arg>
   <bean class="com.eharmony.matching.mnssender.jms.DefaultDtoDelegate" />
  </constructor-arg>
  <property name="defaultListenerMethod" value="receive" />
  <property name="messageConverter">
   <bean class="com.eharmony.matching.mnssender.jms.Converter" />
  </property>
 </bean>

 <bean id="jmsListenerContainer"
  class="org.springframework.jms.listener.DefaultMessageListenerContainer">
  <property name="concurrentConsumers" value="${MNSClient.jms.concurrent.consumers}" />
  <property name="connectionFactory" ref="jmsQueueConnectionFactory" />
  <property name="destination" ref="queue" />
  <property name="sessionTransacted" value="true" />
  <property name="messageListener" ref="messageListener" />
 </bean>

 <bean id="jmsQueueConnectionFactory"
  class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
  <property name="targetConnectionFactory">
   <ref bean="internalJmsQueueConnectionFactory" />
  </property>
  <property name="username">
   <value>${MNSClient.receive.jms.user}</value>
  </property>
  <property name="password">
   <value>${MNSClient.receive.jms.password}</value>
  </property>
 </bean>

 <bean id="internalJmsQueueConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate">
   <ref bean="jndiTemplate" />
  </property>
  <property name="jndiName">
   <value>${MNSClient.receive.jms.connectionFactoryName}</value>
  </property>
 </bean>

 <!-- RECEIVING JMS MESSAGE -->
 <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
  <property name="environment">
   <props>
    <prop key="java.naming.factory.initial">${MNSClient.receive.jms.initialFactoryName}</prop>
    <prop key="java.naming.provider.url">${MNSClient.receive.jms.providerUrl}</prop>
   </props>
  </property>
 </bean>
 <bean id="queue" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiTemplate">
   <ref bean="jndiTemplate" />
  </property>
  <property name="jndiName">
   <value>${MNSClient.receive.jms.queueName}</value>
  </property>
 </bean>

任何指针将不胜感激!

问候。

【问题讨论】:

    标签: java spring jms weblogic


    【解决方案1】:

    这两个线程是否都在同一个会话(或从同一个会话派生的消费者/生产者)上调用方法? Session 及其派生的任何东西(生产者、消费者等)都不是线程安全的,因此您需要防止多个线程同时对其进行操作。通过您自己的锁定或通过为每个生产者/消费者创建不同的会话来序列化访问。

    在计算是否从多个线程访问会话时,不要忘记异步消息处理中涉及的隐式线程(onMessage() 使用)。

    如果您违反了该规则,请期待坏事(如死锁)。

    【讨论】:

    • 会话/连接等所有共享对象都由spring框架管理。我发誓我对他们一无所知!好吧,开个玩笑,我不在这里创建或使用会话。 Spring 使用上面提到的 spring conf 为我做到了这一点。
    • 对此无能为力。我习惯于编写原始 JMS,而不是通过 Spring。刚刚在一个经常出问题的地方进行了自动驾驶。
    【解决方案2】:

    好的,通过更多的谷歌搜索,我找到了答案。我们在 Spring JMS 集成中遇到了一个错误:https://jira.springframework.org/browse/SPR-7366?page=com.atlassian.jira.plugin.system.issuetabpanels%3Aall-tabpanel#issue-tabs

    此问题现已修复,我们将更新到最新版本的 Spring。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多