是否可以在ActiveMQ JMS中进行多优先级使用?

时间:2019-04-04 01:17:22

标签: java jms activemq spring-jms

背景

我正在运行一个使用ActiveMQ来保存作业队列的处理服务器。在运行时,我想让一个工人继续执行相同类型的工作(留住一个类型很便宜,但切换起来很昂贵),但是如果忽略其他类型的工作,则切换类型。

两种简单情况:

  1. 工作正在排队。当有工作人员可用时,应选择刚刚处理过的类型的工作,如果没有匹配的工作,则回退到任何工作。
  2. 工人正在等待。添加新作业后,应将其分配给刚刚处理过该作业类型的工人,如果没有可用的工人,则将其回退给任何工人。

示例

我现在的尝试简化了prefetch = 0的操作,每个工作人员都有两个使用不同优先级的使用者。我先对高优先级的一个轮询一次,然后为低优先级的一个阻塞。

消息只是具有工作类型属性的jobId(详细信息在DB中):

public void put(String jobId, String type) {
    jmsTemplate.send(session -> {
        TextMessage textMessage = session.createTextMessage(jobId);
        textMessage.setStringProperty("type", type);
        return textMessage;
    });
}

每当工人开始一项新的工作时,它就会设置两个具有不同consumer.priority的消费者

MessageConsumer consumer = null;
MessageConsumer defaultConsumer = null;

void onResourcesChange(String type) throws JMSException {
    stopConsumers();
    if (type != null) {
        consumer = session.createConsumer(createConsumer(2), "type = '" + type + "'");
    }
    defaultConsumer = session.createConsumer(createConsumer(1));
}

private Destination createConsumer(int consumerPriority) throws JMSException {
    return jmsTemplate.getDestinationResolver().resolveDestinationName(session,
            queueName + "?consumer.prefetchSize=0&consumer.priority=" + consumerPriority.priority, false);
}

然后,当它空闲时,它循环接收消息:

while (!shutdown) {
    Message nextMessage = null;
    if (consumer != null) {
        nextMessage = consumer.receiveNoWait(100);
    }

    if (nextMessage == null) {
        if (defaultConsumer != null) {
            nextMessage = defaultConsumer.receive();
        }
    }
    // do something with the message
}

问题

有没有办法监听匹配类型的工作消息,并且回退到任何消息?

例如,您能否在两个使用者之间共享预取限制-并获得匹配度更高的消息,直到没有消息为止?

还是有一种方法可以在同一个选择器中表示两者?也许是年龄而不是优先?

priority1(type = 'type') || priority2(type != 'type')
type = 'type' || age > 5min

0 个答案:

没有答案