2012-11-06 69 views
1

我正在使用jboss-5.1来部署消息驱动bean,该消息驱动bean用于订阅来自第三方队列的消息。用户队列中的待处理消息

大约16条消息被发送到该队列,但它们仍然在我们的用户队列中等待处理。我重新启动了服务器,并且随时可以选择消息。

尽管我已经分析过,但我认为maxsizemaxsession可能会影响它,因为它们都是15.但我不明白是否存在某个实际问题,它是如何通过重新启动得到解决的。

日志处于错误模式。我没有得到完整的堆栈跟踪。

这是错误日志的片段。

[2012-10-30 17:01:00,228] [MQQueueAgent (GQH1_PLANNING_MDM_001)] 
[ERROR] STDERR: 2012.10.30 17:01:00 MQJMS1023E rollback failed 

[2012-10-30 17:01:00,228] [exceptionDelivery0] [WARN ] 
org.jboss.resource.adapter.jms.inflow.JmsActivation: Failure in jms activation 
[email protected]([email protected] 
destination=remotewsmq/NOTIFICATION_PLANNING_MDM_001.SUBQ 
destinationType=javax.jms.Queue tx=true durable=false reconnect=10 provider=RemoteWSMQJMSProvider 
user=null maxMessages=1 minSession=1 maxSession=5 keepAlive=60000 useDLQ=false) 

GQH1_PLANNING_MDM_001:用于订阅的队列的名称。

我用来配置MDB属性的文件如下。

1.ejb3拦截器-aop.xml文件

<domain name="Message Driven Bean" extends="Intercepted Bean" inheritBindings="true"> 
     <bind pointcut="execution(public * *->*(..))"> 
     <interceptor-ref name="org.jboss.ejb3.security.AuthenticationInterceptorFactory"/> 
     <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/> 
     </bind> 

     <!-- TODO: Authorization? --> 

     <bind pointcut="execution(public * *->*(..))"> 
     <interceptor-ref name="org.jboss.ejb3.tx.CMTTxInterceptorFactory"/> 
     <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/> 
     <interceptor-ref name="org.jboss.ejb3.tx.BMTTxInterceptorFactory"/> 
     <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/> 
     <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/> 
     <!-- interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/ --> 
     <stack-ref name="EJBInterceptors"/> 
     </bind> 

     <annotation expr="class(*) AND !class(@org.jboss.ejb3.annotation.Pool)"> 
     @org.jboss.ejb3.annotation.Pool (value="StrictMaxPool", maxSize=15, timeout=10000) 
     </annotation> 
    </domain> 

2.standardjboss.xml

<invoker-proxy-binding> 
     <name>message-driven-bean</name> 
     <invoker-mbean>default</invoker-mbean> 
     <proxy-factory>org.jboss.ejb.plugins.jms.JMSContainerInvoker</proxy-factory> 
     <proxy-factory-config> 
     <JMSProviderAdapterJNDI>DefaultJMSProvider</JMSProviderAdapterJNDI> 
     <ServerSessionPoolFactoryJNDI>StdJMSPool</ServerSessionPoolFactoryJNDI> 
     <CreateJBossMQDestination>false</CreateJBossMQDestination> 

     <!-- WARN: Don't set this to zero until a bug in the pooled executor is fixed --> 

     <MinimumSize>1</MinimumSize> 
     <MaximumSize>15</MaximumSize> 
     <KeepAliveMillis>30000</KeepAliveMillis> 
     <MaxMessages>1</MaxMessages> 

     <MDBConfig> 
      <ReconnectIntervalSec>10</ReconnectIntervalSec> 
      <DLQConfig> 
      <DestinationQueue>queue/DLQ</DestinationQueue> 
      <MaxTimesRedelivered>10</MaxTimesRedelivered> 
      <TimeToLive>0</TimeToLive> 
      </DLQConfig> 
     </MDBConfig> 

     </proxy-factory-config> 
    </invoker-proxy-binding> 

    <activation-config-property> 
     <activation-config-property-name>maxSession</activation-config-property-name> 
     <activation-config-property-value>15</activation-config-property-value> 
    </activation-config-property> 

3.jms-ds.xml中

<?xml version="1.0" encoding="UTF-8"?> 

<connection-factories> 

    <!-- ==================================================================== --> 
    <!-- JMS Stuff               --> 
    <!-- ==================================================================== --> 

    <!-- 
     The JMS provider loader. Currently pointing to a non-clustered ConnectionFactory. Need to 
     be replaced with a clustered non-load-balanced ConnectionFactory when it becomes available. 
     See http://jira.jboss.org/jira/browse/JBMESSAGING-843. 
    --> 
    <mbean code="org.jboss.jms.jndi.JMSProviderLoader" 
      name="jboss.messaging:service=JMSProviderLoader,name=JMSProvider"> 
     <attribute name="ProviderName">DefaultJMSProvider</attribute> 
     <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute> 
     <attribute name="FactoryRef">java:/XAConnectionFactory</attribute> 
     <attribute name="QueueFactoryRef">java:/XAConnectionFactory</attribute> 
     <attribute name="TopicFactoryRef">java:/XAConnectionFactory</attribute> 
    </mbean> 

    <!-- JMS XA Resource adapter, use this to get transacted JMS in beans --> 
    <tx-connection-factory> 
     <jndi-name>JmsXA</jndi-name> 
     <xa-transaction/> 
     <rar-name>jms-ra.rar</rar-name> 
     <connection-definition>org.jboss.resource.adapter.jms.JmsConnectionFactory</connection-definition> 
     <config-property name="SessionDefaultType" type="java.lang.String">javax.jms.Topic</config-property> 
     <config-property name="JmsProviderAdapterJNDI" type="java.lang.String">java:/DefaultJMSProvider</config-property> 
     <max-pool-size>20</max-pool-size> 
     <security-domain-and-application>JmsXARealm</security-domain-and-application> 
     <depends>jboss.messaging:service=ServerPeer</depends> 
    </tx-connection-factory> 

</connection-factories> 

请帮忙。

回答

1

根据错误,交易ROLLBACK调用失败。失败后,队列管理员可能会将这些消息保存在一个非常出色的工作单元中。重新启动服务器将关闭连接,队列管理器将在此时代表应用程序回滚事务。重新启动时,应用程序将创建一个新的UOW并检索消息。

查看WebSphere MQ的队列管理器错误日志和全局错误日志以确定错误是否由资源短缺引起。可能需要增加队列管理器事务日志的大小或调整事务参数(如MAXUOW)。

您可能还需要更新MQ客户端版本或队列管理器版本。根据this Technote,WebSphere MQ JMS类自6.0.2.3更新以修复导致MQJMS1023E错误的错误。如果您需要更新客户端版本,则可以免费下载,格式为SupportPac MQC75。一个新的客户端能够与任何后台队列管理器一起运行。升级完成后,该应用将受益于新客户端代码的错误修复和性能增强功能,并提供适用于与其连接的队列管理器版本的API功能。当前安装了哪个版本的WebSphere MQ JMS客户端?当前安装了什么版本的WebSphere MQ队列管理器?

+0

这个MAXUOW适用于jboss吗?如果是的话,你知道一种方法来设置它。在我们的例子中,一旦我们收到一条消息,我们只是提交它。所以如果发生了一些问题,我们根本就不处理它。所以不存在交易失败的问题。 – dev

+0

以我的理解,这可能是原因。 – dev

+0

当一批JMS消息以预取的数量传递给MDB时,每个JMS消息都将从该池中分配一个实例,并通过onMessage函数将其传递给该实例。如果消息预取超过此池的最大大小,则消息将等待MDB实例。如果从消息传递到调用onMessage的时间超过任何消息的池超时,将引发EJBException。对于大预取和长平均onMessage时间,队列末尾的消息将开始失败。 但我不明白,重新启动服务器可能更改? – dev

2

如果侦听器没有尝试重新连接,则可能是挂起的消息导致其失败。

相关问题