You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by an...@apache.org on 2016/07/14 10:30:30 UTC
[1/2] activemq-artemis git commit: This closes #633 ARTEMIS-573
clarify filter documentation
Repository: activemq-artemis
Updated Branches:
refs/heads/master d7edf0668 -> dfe528972
This closes #633 ARTEMIS-573 clarify filter documentation
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/dfe52897
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/dfe52897
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/dfe52897
Branch: refs/heads/master
Commit: dfe52897261b6a13674f83bbc4f4c0178b593240
Parents: d7edf06 8a66d5f
Author: Andy Taylor <an...@gmail.com>
Authored: Thu Jul 14 11:29:05 2016 +0100
Committer: Andy Taylor <an...@gmail.com>
Committed: Thu Jul 14 11:29:05 2016 +0100
----------------------------------------------------------------------
docs/user-manual/en/filter-expressions.md | 22 ++++++
.../en/protocols-interoperability.md | 7 ++
.../tests/integration/stomp/StompTest.java | 78 ++++++++++++++++++++
3 files changed, 107 insertions(+)
----------------------------------------------------------------------
[2/2] activemq-artemis git commit: ARTEMIS-573 clarify filter
documentation
Posted by an...@apache.org.
ARTEMIS-573 clarify filter documentation
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/8a66d5f4
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/8a66d5f4
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/8a66d5f4
Branch: refs/heads/master
Commit: 8a66d5f4857a3168b416d67d0bce49208694437d
Parents: d7edf06
Author: jbertram <jb...@apache.org>
Authored: Wed Jul 13 15:47:24 2016 -0500
Committer: Andy Taylor <an...@gmail.com>
Committed: Thu Jul 14 11:29:05 2016 +0100
----------------------------------------------------------------------
docs/user-manual/en/filter-expressions.md | 22 ++++++
.../en/protocols-interoperability.md | 7 ++
.../tests/integration/stomp/StompTest.java | 78 ++++++++++++++++++++
3 files changed, 107 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8a66d5f4/docs/user-manual/en/filter-expressions.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/filter-expressions.md b/docs/user-manual/en/filter-expressions.md
index ea7224e..88b8b1b 100644
--- a/docs/user-manual/en/filter-expressions.md
+++ b/docs/user-manual/en/filter-expressions.md
@@ -49,3 +49,25 @@ refer to attributes of the core message in an expression:
Any other identifiers used in core filter expressions will be assumed to
be properties of the message.
+
+The JMS spec states that a String property should not get converted to a
+numeric when used in a selector. So for example, if a message has the `age`
+property set to String `21` then the following selector should not match
+it: `age > 18`. Since Apache ActiveMQ Artemis supports STOMP clients which
+can only send messages with string properties, that restriction is a bit
+limiting. Therefore, if you want your filter expressions to auto-convert String
+properties the the appropriate number type, just prefix it with
+`convert_string_expressions:`. If you changed the filter expression in the
+previous example to be `convert_string_expressions:age > 18`, then it would
+match the aforementioned message.
+
+The JMS spec also states that property identifiers (and therefore the
+identifiers which are valid for use in a filter expression) are an,
+"unlimited-length sequence of letters and digits, the first of which must be
+a letter. A letter is any character for which the method
+`Character.isJavaLetter` returns `true`. This includes `_` and `$`. A letter
+or digit is any character for which the method `Character.isJavaLetterOrDigit`
+returns `true`." This constraint means that hyphens (i.e. `-`) cannot be used.
+However, this constraint can be overcome by using the `hyphenated_props:`
+prefix. For example, if a message had the `foo-bar` property set to `0` then
+the filter expression `hyphenated_props:foo-bar = 0` would match it.
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8a66d5f4/docs/user-manual/en/protocols-interoperability.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/protocols-interoperability.md b/docs/user-manual/en/protocols-interoperability.md
index abfdcf8..5c19311 100644
--- a/docs/user-manual/en/protocols-interoperability.md
+++ b/docs/user-manual/en/protocols-interoperability.md
@@ -311,6 +311,13 @@ seconds.
> users can use heart-beats to maintain the life cycle of stomp
> connections.
+### Selector/Filter expressions
+
+Stomp subscribers can specify an expression used to select or filter
+what the subscriber receives using the `selector` header. The filter
+expression syntax follows the *core filter syntax* described in the
+[Filter Expressions](filter-expressions.md) documentation.
+
### Stomp and JMS interoperability
#### Using JMS destinations
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/8a66d5f4/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/stomp/StompTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/stomp/StompTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/stomp/StompTest.java
index 41b5c35..8155898 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/stomp/StompTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/stomp/StompTest.java
@@ -31,6 +31,12 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
+import org.apache.activemq.artemis.api.core.client.ClientMessage;
+import org.apache.activemq.artemis.api.core.client.ClientProducer;
+import org.apache.activemq.artemis.api.core.client.ClientSession;
+import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
+import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSClient;
import org.apache.activemq.artemis.core.protocol.stomp.Stomp;
@@ -436,6 +442,35 @@ public class StompTest extends StompTestBase {
}
@Test
+ public void testSendMessageWithCustomHeadersAndHyphenatedSelector() throws Exception {
+
+ MessageConsumer consumer = session.createConsumer(queue, "hyphenated_props:b-ar = '123'");
+
+ String frame = "CONNECT\n" + "login: brianm\n" + "passcode: wombats\n\n" + Stomp.NULL;
+ sendFrame(frame);
+
+ frame = receiveFrame(10000);
+ Assert.assertTrue(frame.startsWith("CONNECTED"));
+
+ frame = "SEND\n" + "foo:abc\n" +
+ "b-ar:123\n" +
+ "destination:" +
+ getQueuePrefix() +
+ getQueueName() +
+ "\n\n" +
+ "Hello World" +
+ Stomp.NULL;
+
+ sendFrame(frame);
+
+ TextMessage message = (TextMessage) consumer.receive(1000);
+ Assert.assertNotNull(message);
+ Assert.assertEquals("Hello World", message.getText());
+ Assert.assertEquals("foo", "abc", message.getStringProperty("foo"));
+ Assert.assertEquals("b-ar", "123", message.getStringProperty("b-ar"));
+ }
+
+ @Test
public void testSendMessageWithStandardHeaders() throws Exception {
MessageConsumer consumer = session.createConsumer(queue);
@@ -755,6 +790,49 @@ public class StompTest extends StompTestBase {
sendFrame(frame);
}
+
+ @Test
+ public void testSubscribeWithAutoAckAndHyphenatedSelector() throws Exception {
+
+ String frame = "CONNECT\n" + "login: brianm\n" + "passcode: wombats\n\n" + Stomp.NULL;
+ sendFrame(frame);
+
+ frame = receiveFrame(100000);
+ Assert.assertTrue(frame.startsWith("CONNECTED"));
+
+ frame = "SUBSCRIBE\n" + "destination:" +
+ getQueuePrefix() +
+ getQueueName() +
+ "\n" +
+ "selector: hyphenated_props:foo-bar = 'zzz'\n" +
+ "ack:auto\n\n" +
+ Stomp.NULL;
+ sendFrame(frame);
+
+ ServerLocator serverLocator = addServerLocator(ActiveMQClient.createServerLocator("vm://0"));
+ ClientSessionFactory clientSessionFactory = serverLocator.createSessionFactory();
+ ClientSession clientSession = clientSessionFactory.createSession(true, true);
+ ClientProducer producer = clientSession.createProducer(getQueuePrefix() + getQueueName());
+
+ ClientMessage ignoredMessage = clientSession.createMessage(false);
+ ignoredMessage.putStringProperty("foo-bar", "1234");
+ ignoredMessage.getBodyBuffer().writeNullableSimpleString(SimpleString.toSimpleString("Ignored message"));
+
+ ClientMessage realMessage = clientSession.createMessage(false);
+ realMessage.putStringProperty("foo-bar", "zzz");
+ realMessage.getBodyBuffer().writeNullableSimpleString(SimpleString.toSimpleString("Real message"));
+
+ producer.send(ignoredMessage);
+ producer.send(realMessage);
+
+ frame = receiveFrame(10000);
+ Assert.assertTrue(frame.startsWith("MESSAGE"));
+ Assert.assertTrue("Should have received the real message but got: " + frame, frame.indexOf("Real message") > 0);
+
+ frame = "DISCONNECT\n" + "\n\n" + Stomp.NULL;
+ sendFrame(frame);
+ }
+
@Test
public void testSubscribeWithClientAck() throws Exception {