簡體   English   中英

以相反優先級順序傳遞的Oracle AQ優先JMS消息

[英]Oracle AQ Prioritised JMS messages delivered in reverse priority order

我這樣創建了一個oracle隊列

execute dbms_aqadm.create_queue_table (
                        queue_table => 'priorityqueue',
                        sort_list => 'PRIORITY,ENQ_TIME',
                        queue_payload_type => 'sys.aq$_jms_map_message',
                        compatible => '8.1.0');
execute dbms_aqadm.create_queue (
                        queue_name => 'priorityqueue',
                        queue_table => 'priorityqueue');
execute dbms_aqadm.start_queue (
                        queue_name => 'priorityqueue');

然后,我使用spring JMSTemplate發送消息,如下所示:

ConnectionFactory connectionFactory = AQjmsFactory.getQueueConnectionFactory(dataSource);
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setExplicitQosEnabled(true);
MessageCreator messageCreator = new MessageCreator() {
        @Override
        public Message createMessage(Session session) throws JMSException {
            MapMessage message = session.createMapMessage();
            // ... set some properties
            message.setJMSPriority(priority);
            return message;
        }
};
jmsTemplate.setPriority(priority);
jmsTemplate.send("priorityqueue", messageCreator);

如果我從priorityqueue select所有內容,則可以看到消息以不同的優先級放在那里:

select q_name, msgid, priority, state from priorityqueue;
Q_NAME                         MSGID                              PRIORITY      STATE
PRIORITYQUEUE                  1297D3F58D41208FE05400215A97112C          1          0 
PRIORITYQUEUE                  1297D3F58D43208FE05400215A97112C          9          0 
PRIORITYQUEUE                  1297D3F58D45208FE05400215A97112C          4          0 

接下來,我使用消息...沒什么特別的-像這樣:

ConnectionFactory connectionFactory = AQjmsFactory.getQueueConnectionFactory(oracleDataSource);

Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue loggerQueue = session.createQueue("priorityqueue");
MessageConsumer consumer = session.createConsumer(loggerQueue);

int count = 0;
while (true) {
    connection.start();
    Message message = consumer.receive(1000);
    if (message == null) {
        break;
    }
    count++;
    System.out.println(count + ".\tPriority [" + message.getJMSPriority() + "]");
}
connection.close();

但是輸出看起來像這樣:

  1. 優先級[1]
  2. 優先級[4]
  3. 優先級[9]

何時應為9、4、1。

java.jms.Message文檔明確指出, [t]he JMS API defines ten levels of priority value, with 0 as the lowest priority and 9 as the highest.

我究竟做錯了什么? 我研究過創建按優先級從高到低排序的隊列,但CREATE_QUEUE_TABLE文檔指出, sort_list[t]he columns to be used as the sort key in ascending order即看起來好像不是降序是一個選項。

另外-發送時,我設置了兩次優先級-一次在消息上,一次在jmsTemplate 我真的應該這樣做嗎?

Spring的JmsTemplate不支持按消息優先級。 您需要按照本文中的描述子類化JmsTemplatehttps : //aminsblog.wordpress.com/2010/04/27/publishing-qos-priority-enabled-messages-using-spring-jms-template-2/

public class QoSEnabledJmsTemplate extends JmsTemplate {
    protected void doSend(MessageProducer producer, Message message) throws JMSException {
       producer.send(message, getDeliveryMode(), message.getJMSPriority(), getTimeToLive());
    }
}

暫無
暫無

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

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