簡體   English   中英

JMS無法使用來自Oracle隊列的消息

[英]JMS unable to consume message from oracle queue

我必須異步地將一些文件從系統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 Database Queue System與常見的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM