Repository: activemq-artemis
Updated Branches:
  refs/heads/master c4763bc08 -> b3d781daa


 ARTEMIS-1809 adding example of mapping ActiveMQ 5.x Virtual Topic consumers


Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/2f0149c7
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/2f0149c7
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/2f0149c7

Branch: refs/heads/master
Commit: 2f0149c7598ed8c3adc2c0e5b0315fa07756dd4b
Parents: c4763bc
Author: Pat Fox <pat.g....@gmail.com>
Authored: Sun Apr 15 21:22:26 2018 +0200
Committer: Howard Gao <howard....@gmail.com>
Committed: Tue Apr 17 10:30:26 2018 +0800

----------------------------------------------------------------------
 docs/user-manual/en/examples.md                 |   3 +-
 .../en/protocols-interoperability.md            |   4 +-
 examples/protocols/openwire/pom.xml             |   2 +
 .../openwire/virtual-topic-mapping/pom.xml      | 133 +++++++++++++++++++
 .../openwire/virtual-topic-mapping/readme.md    |  27 ++++
 .../jms/example/VirtualTopicMappingExample.java |  76 +++++++++++
 .../main/resources/activemq/server0/broker.xml  |  70 ++++++++++
 7 files changed, 313 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/docs/user-manual/en/examples.md
----------------------------------------------------------------------
diff --git a/docs/user-manual/en/examples.md b/docs/user-manual/en/examples.md
index 1780eaa..251eeaa 100644
--- a/docs/user-manual/en/examples.md
+++ b/docs/user-manual/en/examples.md
@@ -641,7 +641,8 @@ OpenWire
 The `Openwire` example shows how to configure an Apache ActiveMQ Artemis 
server to
 communicate with an Apache ActiveMQ Artemis JMS client that uses open-wire 
protocol.
 
-You will find the queue example for open wire, and the chat example.
+You will find the queue example for open wire, and the chat example. The 
virtual-topic-mapping examples shows how to
+map the ActiveMQ 5.x Virtual Topic naming convention to work with the Artemis 
Address model.
 
 Paging
 ------

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/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 8ce73c4..7904e45 100644
--- a/docs/user-manual/en/protocols-interoperability.md
+++ b/docs/user-manual/en/protocols-interoperability.md
@@ -230,7 +230,9 @@ In an acceptor url it would be:
 
 This will translate ```Consumer.A.VirtualTopic.Orders``` into a FQQN of 
```VirtualTopic.Orders::Consumer.A``` using the
 int component ```2``` of the configuration to identify the consumer queue as 
the first two paths of the destination.
-```virtualTopicConsumerWildcards``` is multi valued using a ```,``` separator. 
+```virtualTopicConsumerWildcards``` is multi valued using a ```,``` separator.
+
+Please see Virtual Topic Mapping example contained in the OpenWire 
[examples](examples.md).
   
 ## MQTT
 

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/examples/protocols/openwire/pom.xml
----------------------------------------------------------------------
diff --git a/examples/protocols/openwire/pom.xml 
b/examples/protocols/openwire/pom.xml
index e4d2486..b96a1f6 100644
--- a/examples/protocols/openwire/pom.xml
+++ b/examples/protocols/openwire/pom.xml
@@ -44,6 +44,7 @@ under the License.
             <module>queue</module>
             <module>message-listener</module>
             <module>message-recovery</module>
+            <module>virtual-topic-mapping</module>
          </modules>
       </profile>
       <profile>
@@ -55,6 +56,7 @@ under the License.
             <module>queue</module>
             <module>message-listener</module>
             <module>message-recovery</module>
+            <module>virtual-topic-mapping</module>
          </modules>
       </profile>
    </profiles>

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/examples/protocols/openwire/virtual-topic-mapping/pom.xml
----------------------------------------------------------------------
diff --git a/examples/protocols/openwire/virtual-topic-mapping/pom.xml 
b/examples/protocols/openwire/virtual-topic-mapping/pom.xml
new file mode 100644
index 0000000..22ea7fa
--- /dev/null
+++ b/examples/protocols/openwire/virtual-topic-mapping/pom.xml
@@ -0,0 +1,133 @@
+<?xml version='1.0'?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+   <modelVersion>4.0.0</modelVersion>
+
+   <parent>
+      <groupId>org.apache.activemq.examples.openwire</groupId>
+      <artifactId>openwire-examples</artifactId>
+      <version>2.6.0-SNAPSHOT</version>
+   </parent>
+
+   <artifactId>virtual-topic-mapping</artifactId>
+   <packaging>jar</packaging>
+   <name>ActiveMQ Artemis OpenWire Virtual Topic Mapping Example</name>
+
+   <properties>
+      <activemq.basedir>${project.basedir}/../../../..</activemq.basedir>
+   </properties>
+
+   <dependencies>
+      <dependency>
+         <groupId>org.apache.geronimo.specs</groupId>
+         <artifactId>geronimo-jms_1.1_spec</artifactId>
+         <version>1.1</version>
+      </dependency>
+      <dependency>
+         <groupId>org.apache.activemq</groupId>
+         <artifactId>activemq-client</artifactId>
+         <version>${activemq5-version}</version>
+      </dependency>
+      <dependency>
+         <groupId>org.slf4j</groupId>
+         <artifactId>slf4j-nop</artifactId>
+      </dependency>
+   </dependencies>
+
+   <build>
+      <plugins>
+         <plugin>
+            <groupId>org.apache.activemq</groupId>
+            <artifactId>artemis-maven-plugin</artifactId>
+            <executions>
+               <execution>
+                  <id>create</id>
+                  <goals>
+                     <goal>create</goal>
+                  </goals>
+                  <configuration>
+                     <ignore>${noServer}</ignore>
+                  </configuration>
+               </execution>
+               <execution>
+                  <id>start</id>
+                  <goals>
+                     <goal>cli</goal>
+                  </goals>
+                  <configuration>
+                     <spawn>true</spawn>
+                     <ignore>${noServer}</ignore>
+                     <testURI>tcp://localhost:61616</testURI>
+                     <args>
+                        <param>run</param>
+                     </args>
+                  </configuration>
+               </execution>
+               <execution>
+                  <id>runClient</id>
+                  <goals>
+                     <goal>runClient</goal>
+                  </goals>
+                  <configuration>
+                     
<clientClass>org.apache.activemq.artemis.jms.example.VirtualTopicMappingExample</clientClass>
+                  </configuration>
+               </execution>
+               <execution>
+                  <id>stop</id>
+                  <goals>
+                     <goal>cli</goal>
+                  </goals>
+                  <configuration>
+                     <ignore>${noServer}</ignore>
+                     <args>
+                        <param>stop</param>
+                     </args>
+                  </configuration>
+               </execution>
+            </executions>
+            <dependencies>
+               <dependency>
+                  <groupId>org.apache.activemq.examples.openwire</groupId>
+                  <artifactId>virtual-topic-mapping</artifactId>
+                  <version>${project.version}</version>
+               </dependency>
+            </dependencies>
+         </plugin>
+         <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-clean-plugin</artifactId>
+         </plugin>
+      </plugins>
+   </build>
+   <profiles>
+      <profile>
+         <id>release</id>
+         <build>
+            <plugins>
+               <plugin>
+                  <groupId>com.vladsch.flexmark</groupId>
+                  <artifactId>markdown-page-generator-plugin</artifactId>
+               </plugin>
+            </plugins>
+         </build>
+      </profile>
+   </profiles>
+</project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/examples/protocols/openwire/virtual-topic-mapping/readme.md
----------------------------------------------------------------------
diff --git a/examples/protocols/openwire/virtual-topic-mapping/readme.md 
b/examples/protocols/openwire/virtual-topic-mapping/readme.md
new file mode 100644
index 0000000..e96724d
--- /dev/null
+++ b/examples/protocols/openwire/virtual-topic-mapping/readme.md
@@ -0,0 +1,27 @@
+# OpenWire Virtual Topic Mapping Example
+
+To run the example, simply type **mvn verify** from this directory, or **mvn 
-PnoServer verify** if you want to start
+and create the broker manually.
+
+Using ActiveMQ 5.x virtual topics, messages that are sent to a virtual topic 
can be consumed from a set of backing queues.
+This is similar to using an Artemis Address with a multicast binding and 
consuming from directly from the underlying
+queue using a FQQN (Fully Qualified Queue Name).
+
+In ActiveMQ 5.x the relation between the virtual topic and its backing queues 
is established by following a naming convention.
+For more details on Virtual Topics please see 
http://activemq.apache.org/virtual-destinations.html
+
+This example shows you how to map a virtual topic naming convention (from 
ActiveMQ 5.x) to use the Artemis Address model .
+The Artemis broker is configured to recognise the Virtual Topic Naming 
convention, using `virtualTopicConsumerWildcards`
+acceptor parameter and the consumer will be mapped internally to consume from 
the appropriate FQQN rather than the specified
+Address.
+
+The example sends a message to a topic (using openwire protocol) and an 
openwire consumer listens on the backing queue
+using the ActiveMQ 5.x virtual topic naming convention. Due to the acceptor 
url parameter `virtualTopicConsumerWildcards`,
+(see below), Artemis maps the consumer consuming from 
`Consumer.A.VirtualTopic.Orders` to actually consume from
+FQQN of `VirtualTopic.Orders::Consumer.A`
+
+
+```xml
+<acceptor 
name="artemis">tcp://0.0.0.0:61616?virtualTopicConsumerWildcards=Consumer.*.%3E%3B2</acceptor>
+```
+

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/examples/protocols/openwire/virtual-topic-mapping/src/main/java/org/apache/activemq/artemis/jms/example/VirtualTopicMappingExample.java
----------------------------------------------------------------------
diff --git 
a/examples/protocols/openwire/virtual-topic-mapping/src/main/java/org/apache/activemq/artemis/jms/example/VirtualTopicMappingExample.java
 
b/examples/protocols/openwire/virtual-topic-mapping/src/main/java/org/apache/activemq/artemis/jms/example/VirtualTopicMappingExample.java
new file mode 100644
index 0000000..0d0e271
--- /dev/null
+++ 
b/examples/protocols/openwire/virtual-topic-mapping/src/main/java/org/apache/activemq/artemis/jms/example/VirtualTopicMappingExample.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.jms.example;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+
+import org.apache.activemq.ActiveMQConnectionFactory;
+
+/**
+ * The example sends a message to a topic (using openwire protocol) and an 
openwire consumer listens on the backing queue
+ * using the ActiveMQ 5.x virtual topic naming convention. Due to the acceptor 
parameter virtualTopicConsumerWildcards
+ * Artemis maps the consumer consuming from "Consumer.A.VirtualTopic.Orders" 
to actually consume from
+ * FQQN  "VirtualTopic.Orders::Consumer.A"
+ */
+public class VirtualTopicMappingExample {
+
+    public static void main(final String[] args) throws Exception {
+        Connection connection = null;
+        try {
+
+            ConnectionFactory cf = new ActiveMQConnectionFactory();
+
+            connection = cf.createConnection();
+            Session session = connection.createSession(false, 
Session.AUTO_ACKNOWLEDGE);
+
+            //create consumer on queue that is used by the Virtual Topic
+            Queue queue = 
session.createQueue("Consumer.A.VirtualTopic.Orders");
+            MessageConsumer messageConsumer = session.createConsumer(queue);
+            connection.start();
+
+
+            //send message to virtual topic
+            Topic topic = session.createTopic("VirtualTopic.Orders");
+            MessageProducer producer = session.createProducer(topic);
+            TextMessage message = session.createTextMessage("This is a text 
message");
+            producer.send(message);
+
+            System.out.println("Sent message with ID: " + 
message.getJMSMessageID() + " to Topic: " + topic.getTopicName());
+
+            //consume the message from the backing queue
+            TextMessage messageReceived = (TextMessage) 
messageConsumer.receive(5000);
+
+            if (messageReceived != null) {
+                System.out.println("Received message with ID: " + 
messageReceived.getJMSMessageID() + " from Queue: " + queue.getQueueName());
+            } else {
+                //unexpected outcome
+                throw new RuntimeException("EXAMPLE FAILED - No message 
received from Queue: " + queue.getQueueName());
+            }
+        } finally {
+            if (connection != null) {
+                connection.close();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/2f0149c7/examples/protocols/openwire/virtual-topic-mapping/src/main/resources/activemq/server0/broker.xml
----------------------------------------------------------------------
diff --git 
a/examples/protocols/openwire/virtual-topic-mapping/src/main/resources/activemq/server0/broker.xml
 
b/examples/protocols/openwire/virtual-topic-mapping/src/main/resources/activemq/server0/broker.xml
new file mode 100644
index 0000000..b356710
--- /dev/null
+++ 
b/examples/protocols/openwire/virtual-topic-mapping/src/main/resources/activemq/server0/broker.xml
@@ -0,0 +1,70 @@
+<?xml version='1.0'?>
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<configuration xmlns="urn:activemq"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+               xmlns:xi="http://www.w3.org/2001/XInclude";
+               xsi:schemaLocation="urn:activemq 
/schema/artemis-configuration.xsd">
+
+   <core xmlns="urn:activemq:core" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="urn:activemq:core ">
+
+      <name>VirtualTopicMappingExample</name>
+      
+      <paging-directory>./data/paging</paging-directory>
+
+      <bindings-directory>./data/bindings</bindings-directory>
+
+      <journal-directory>./data/journal</journal-directory>
+
+      
<large-messages-directory>./data/large-messages</large-messages-directory>
+
+
+      <acceptors>
+         <acceptor 
name="artemis">tcp://0.0.0.0:61616?virtualTopicConsumerWildcards=Consumer.*.%3E%3B2</acceptor>
+      </acceptors>
+
+
+      <security-settings>
+         <security-setting match="#">
+            <permission type="createNonDurableQueue" roles="guest"/>
+            <permission type="deleteNonDurableQueue" roles="guest"/>
+            <permission type="createDurableQueue" roles="guest"/>
+            <permission type="deleteDurableQueue" roles="guest"/>
+            <permission type="createAddress" roles="guest"/>
+            <permission type="deleteAddress" roles="guest"/>
+            <permission type="consume" roles="guest"/>
+            <permission type="browse" roles="guest"/>
+            <permission type="send" roles="guest"/>
+         </security-setting>
+      </security-settings>
+
+
+      <addresses>
+         <address name="VirtualTopic.Orders">
+            <multicast/>
+         </address>
+      </addresses>
+
+
+
+
+   </core>
+</configuration>

Reply via email to