JMS无法使用oracle队列中的消息

我必须将某些文件从我的系统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。

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


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;
链接地址: http://www.djcxy.com/p/76423.html

上一篇: JMS unable to consume message from oracle queue

下一篇: Multiple JMS consumer cosuming same message from Oracle AQ