gpt4 book ai didi

java - Oracle AQ 按优先级相反的顺序传送 JMS 消息

转载 作者:行者123 更新时间:2023-12-01 11:42:56 24 4
gpt4 key购买 nike

我创建了一个像这样的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 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. Priority [1]
  2. Priority [4]
  3. Priority [9]

当它确实应该是 9, 4, 1 时。

documentation for java.jms.Message明确指出[t]JMS API 定义了十个级别的优先级值,其中 0 为最低优先级,9 为最高优先级。

我做错了什么?我考虑过创建优先级按降序排列的队列,但是 the CREATE_QUEUE_TABLE documentation表示 sort_list[t]要用作升序排序键的列,即它看起来不像降序是一个选项。

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

最佳答案

Spring 的 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());
}
}

关于java - Oracle AQ 按优先级相反的顺序传送 JMS 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com