背景
我正在运行一个使用ActiveMQ来保存作业队列的处理服务器。在运行时,我想让一个工人继续执行相同类型的工作(留住一个类型很便宜,但切换起来很昂贵),但是如果忽略其他类型的工作,则切换类型。
两种简单情况:
示例
我现在的尝试简化了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