2015-03-31 83 views
0

我创造了这样的在相反的优先级顺序提供的Oracle AQ优先级的JMS消息

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'); 

神谕队列然后我送使用弹簧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); 

如果我select一切从priorityqueue我可以看到这些消息被放在那里有不同的优先级:

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

documentation for java.jms.Message国家明确表示[t]he JMS API defines ten levels of priority value, with 0 as the lowest priority and 9 as the highest.

我在做什么错?我考虑在优先级上以降序创建队列,但the CREATE_QUEUE_TABLE documentationsort_list[t]he columns to be used as the sort key in ascending order,即它看起来不像降序是一个选项。

此外 - 发送时,我设置优先两次 - 一次在消息上,一次在jmsTemplate。我真的必须这样做吗?

+0

我不认为这是可能通过下降到优先级排序,但也许你可以捏造事实,通过数量乘以你在传递给优先级由-1? – Boneist 2015-03-31 16:45:04

+1

这可能是有趣的http://dba.stackexchange.com/questions/1415/oracle-advanced-queuing-lifo – kevinsky 2015-03-31 17:21:16

+0

作为一个Java人,我只是假设JMS规范和AQ之间会存在一致性。 ..如果没有那么好,只要我确信每个Oracle数据库环境的行为都是一样的。 – 2015-03-31 19:14:43

回答