【问题标题】:JMS unable to consume message from oracle queueJMS 无法使用 oracle 队列中的消息
【发布时间】:2014-06-05 17:31:13
【问题描述】:

我必须将一些文件从我的系统 A 异步推送到系统 B。为此,我创建了一个 JMS 使用者。一旦使用 oracle 中的入队存储过程成功进入队列。我的消费者应该阅读消息并将其发送到系统 B。

这是我的听众代码

public class DMSCustomMessageListener extends DefaultMessageListenerContainer{
      protected MessageConsumer createConsumer(Session session, Destination destination)
        throws JMSException
      {
        return ((AQjmsSession)session).createConsumer(destination, 
          getMessageSelector(), 
          DMS_Master_Type.getORADataFactory(), null, isPubSubNoLocal());
      }
}


public class DMSListener implements FactoryBean{
      private ConnectionFactory connectionFactory;
      private String queueName;
      private String queueUser;

      @Required
      public void setConnectionFactory(QueueConnectionFactory connectionFactory)
      {
        System.out.println("set connection");
        this.connectionFactory = connectionFactory;
      }
      @Required
      public void setQueueName(String queueName) {
        System.out.println("set DMS listener queuename");
        this.queueName = queueName;
      }
      @Required
      public void setQueueUser(String queueUser) {
        System.out.println("set DMS listener queueuser");
        this.queueUser = queueUser;
      }

      public Object getObject() throws Exception
      {
        QueueConnectionFactory qconn = (QueueConnectionFactory)this.connectionFactory;
        AQjmsSession session = (AQjmsSession)qconn.createQueueConnection("score", "score").createQueueSession(true, 0);
        return session.getQueue(this.queueUser, this.queueName);
      }

      public Class getObjectType()
      {
        return Queue.class;
      }

      public boolean isSingleton() {
        return false;
      }
}

这是我的配置方式。

<bean id="messageDMSListener" class="com.test.DMSTextListener">
</bean>
<bean id="testDMS" class="com.test.DMSListener">
    <property name="connectionFactory" ref="aqConnectionFactoryRspm"/>
    <property name="queueName" value="RSPM_PEND_REQ_Q_DMS"/>    
    <property name="queueUser" value="score"/>
</bean>
<bean id="jmsDMSContainer" class="com.test.DMSCustomMessageListener">
    <property name="connectionFactory" ref="aqConnectionFactoryRspm"/>
    <property name="destination" ref="testDMS"/>
    <property name="messageListener" ref="messageDMSListener" />
    <property name="sessionTransacted" value="true"/>
    <property name="errorHandler" ref="listenerErrorHandler"/>   
</bean>

在我的队列表/视图(AQ$RSPM_PEND_REQ_Q_DMS) 中,我将到期原因设为'MAX_RETRY_EXCEEDED'。我已将其配置为 10。

可能的原因是什么?请帮忙。

【问题讨论】:

  • 消费者是否拥有所需的权限?

标签: java oracle jms


【解决方案1】:

Oracle 数据库队列系统与常见的 JMS 系统不同,与之对话的方式也不同。 我假设您可以与您的队列交谈,但消息不会从队列中消失,而是会过期。如果是这种情况,那么我认为您的队列配置为“多用户”类型。在这种情况下,直到所有收件人都收到消息并且队列所有者也是收件人,它才会消失。由于您只想将消息传递给另一个系统,因此将您的队列重新配置为单个用户,消息在阅读后立即消失。

事实上,您也不需要您的 java bean。您可以通过直接在数据库中配置队列传播(和相应的作业)来完成这项工作,而不需要任何外部对象(下面的示例骨架不是完整的解决方案):

BEGIN
DBMS_AQADM.SCHEDULE_PROPAGATION (
   queue_name         => 'init_queue',
   destination        => NULL,
   start_time         => SYSDATE,
   duration           => NULL,
   next_time          => NULL,
   latency            => 60,
   destination_queue  => 'dest_queue');
END;

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 2013-08-01
    • 1970-01-01
    • 2015-08-25
    • 2013-09-23
    • 1970-01-01
    • 2012-01-03
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多