JMS-сообщения с приоритетом Oracle AQ доставляются в обратном порядке приоритета
Я создал очередь оракула, как это
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]
- Приоритет [4]
- Приоритет [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
, Должен ли я действительно сделать это?
1 ответ
Спринга JmsTemplate
не поддерживает приоритеты для сообщений. Вы должны подкласс JmsTemplate
как описано в этой статье: https://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());
}
}