ActiveMQ 消息选择器

问题描述 投票:0回答:2

我的消息队列中包含多条消息。我想按特定属性进行分组。这些都有一个自定义属性“item-id”

我现在对此有一定的价值观:体育、电影......

我这样做:

new MessageCreator() {
 ObjectMessage message = session.createObjectMessage();
 message.setObject(data);
 message.setStringProperty("item-id", "sports");
}

该值也显示在属性的队列中。

当我尝试检索包含此属性的消息时,我没有得到任何结果。

初审:

 Connection con = pc.createConnection();
 Session sess =con.createSession(false,Session.AUTO_ACKNOWLEDGE);       
 AmqMessagesQueryFilter queryFilter = new AmqMessagesQueryFilter(pc, queue); 
 con.start();
 String selector = "item-id = 'sports'";
 List messages = queryFilter.query(selector); 

但是列表是空的

二审:

 Connection con = pc.createConnection();
 Session sess = con.createSession(false, Session.AUTO_ACKNOWLEDGE);

 AmqMessagesQueryFilter queryFilter = new AmqMessagesQueryFilter(pc, queue);

 QueueBrowser queueBrowser = sess.createBrowser(queue,"item-id = 'sports'");
 con.start();
 List messages=Collections.list(queueBrowser.getEnumeration());

列表也是空的。

我的错误是什么?

jms activemq
2个回答
5
投票

我知道这已经太晚了,但这可能会避免某人浪费大量时间(和挫败感)。

请勿在消息选择器中使用破折号。如果需要,请使用下划线。 在这里查找“标识符”:https://docs.oracle.com/javaee/1.4/api/javax/jms/Message.html


0
投票

TL;DR 过滤器表达式属性中的连字符会阻止所有消息传递到订阅客户端; “hyphenated_props:”前缀克服了这个问题。

扩展上述内容,选择器属性需要遵守 JMS 规则,该规则禁止使用连字符/破折号。

来自 ActiveMQ Artemis 文档

JMS 规范还规定属性标识符(因此可在过滤器表达式中使用的标识符)是“无限长度的字母和数字序列,其中第一个必须是字母。字母可以是任何方法 Character.isJavaLetter 返回 true 的字符。这包括 _ 和 $ 。字母或数字是方法 Character.isJavaLetterOrDigit 返回 true 的任何字符。 此约束意味着不能使用连字符(即 - )。然而,这个限制可以通过使用 hyphenated_props: 前缀来克服。例如,如果消息的 foo-bar 属性设置为 0,则过滤器表达式 hyphenated_props:foo-bar = 0 将与其匹配。"

有关该主题的更多讨论:JMS 中的消息选择器

虽然讨论是在 Artemis 环境中进行的,但实际上同样的限制也适用于 ActiveMQ Classic 的最新版本(在 v5.18.2 和 6.0.1 上测试 - 仅 Stomp)。添加包含连字符属性的选择器的客户端不会收到任何消息,即使内容本身会导致匹配。

© www.soinside.com 2019 - 2024. All rights reserved.