Your code suggests you didnt do either of the suggestions, which were:

- Use the JMS 2 API for creating your shared subscriptions (which is
effectively what you are already doing).
- Use an FQQN address with a Topic consumer.

Your consumer is using a Queue destination, which is different.You
need a Topic consumer so it is considered 'multicast' like a topic
subscription backing queue, and aligns with the topic/multicast
publisher.

I should note that there were changes in this 'FQQN topic consumer'
area recently [1] to address issues with also using selectors at the
same time, so you will definitely hit issues if you do that with the
old 2.19.1 client.

[1] https://issues.apache.org/jira/browse/ARTEMIS-4259

On Wed, 2 Aug 2023 at 19:40, PAS Filip <filip....@sodexo.com.invalid> wrote:
>
> Small correction to the phrase:
>
>
> I don’t see that the queue is created under the topic when looking in the 
> console.
>
>
> Should be:
>
>
> I see that the queue is created under the topic when looking in the console.
>
>
> From: PAS Filip <filip....@sodexo.com.INVALID>
> Sent: Wednesday, August 2, 2023 8:34 PM
> To: users@activemq.apache.org
> Subject: RE: Unexpected behaviour with virtual topics
>
> Hi Robbie, Thanks for the feedback! On copying the code into the ide, it 
> completed the imports automatically and I hadn’t noticed the package of the 
> activemq factory changed to the artemis one. From your explanation I 
> understand that this works
> ZjQcmQRYFpfptBannerStart
> External sender
> Check the sender and the content are safe before clicking links or open 
> attachments.
> ZjQcmQRYFpfptBannerEnd
>
> Hi Robbie,
>
>
>
> Thanks for the feedback!
>
> On copying the code into the ide, it completed the imports automatically and 
> I hadn’t noticed the package of the activemq factory changed to the artemis 
> one.
>
> From your explanation I understand that this works only with the openwire 
> protocol used by the old 5.x activemq clients.
>
>
>
> Based on your feedback that FQDN can be used instead I updated the virtual 
> topic example to use FQDN. (still using the artemis jms client).
>
> The topic publishes on VirtualTopic.Orders and the queue to consume from 
> becomes VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders.
>
> Running the example this way I still am not getting the desired result.
>
> I don’t see that the queue is created under the topic when looking in the 
> console.
>
> The message doesn’t seem to get delivered as the test fails with no message 
> received.  (see error below)
>
> I also tried changing the order of creating the destination in the example to 
> first create the topic and then the queue with the consumer, which yields the 
> same result.
>
>
>
> The log shows the following:
>
>
>
> 20:06:53.956 [main] DEBUG o.a.activemq.artemis.core.client - The queue 
> VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders was created automatically
>
> Sent message with ID: ID:5c95a887-315f-11ee-8b06-00090faa0001 to Topic: 
> VirtualTopic.Orders
>
>
>
> And the test fails with the message:
>
> EXAMPLE FAILED - No message received from Queue: 
> VirtualTopic.Orders::Consumer.A.VirtualTopic.Orders
>
>
>
> The topic is configured in the broker as follows:
>
>
>
>       <addresses>
>
>          <address name="VirtualTopic.Orders">
>
>             <multicast/>
>
>          </address>
>
>       </addresses>
>
>
>
> This is basically the same behaviour I get when using the activemq naming 
> conventions.
>
>
>
> When I change the configuration to:
>
>
>
>   <address name="VirtualTopic.Orders">
>
>                 <multicast>
>
>                                 <queue name="Consumer.A.VirtualTopic.Orders" 
> />
>
>                 </multicast>
>
> </address>
>
> The test succeeds however we need the possibility to add consumers for queues 
> of the multicast address that aren’t predefined.
>
> (Note that this test also succeeded using the activemq 5.x naming conventions 
> when configured this way)
>
> From reading the docs I was under the impression that this should be possible 
> however my tests seem to indicate it only works if the queue is predefined as 
> a multicast under the address.
>
> Can you confirm that this approach is correct and should work or what it is 
> that I’m missing?
>
> Do queues have to be predefined? Can we not dynamically add extra consumers?
>
> Are there any alternatives? Would it be possible to use openwire protocol by 
> the artemis jms client and have it work?
>
>
>
> To be complete I provided the whole snippet of code of the updated example 
> below:
>
>
>
> import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
>
> import org.apache.activemq.artemis.jms.client.ActiveMQTopic;
>
> import javax.jms.*;
>
>
>
> 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("VirtualTopic.Orders::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();
>
>             }
>
>         }
>
>     }
>
>
>
> Thanks in advance for any help you can provide.
>
>
>
> Regards,
>
>
>
> Filip
>
>
>
> From: Robbie Gemmell 
> <robbie.gemm...@gmail.com<mailto:robbie.gemm...@gmail.com>>
>
> Sent: Wednesday, August 2, 2023 1:36 PM
>
> To: users@activemq.apache.org<mailto:users@activemq.apache.org>
>
> Subject: Re: Unexpected behaviour with virtual topics
>
>
>
> I believe the virtualTopicConsumerWildcards stuff only applies for Openwire 
> protocol clients (i. e ActiveMQ 5. x), as used in the example you referenced. 
> Your description and log snippets note you are trying to use that with the 
> Artemis Core
>
> ZjQcmQRYFpfptBannerStart
>
> External sender
>
> Check the sender and the content are safe before clicking links or open 
> attachments.
>
> ZjQcmQRYFpfptBannerEnd
>
>
>
> I believe the virtualTopicConsumerWildcards stuff only applies for
>
>
>
> Openwire protocol clients (i.e ActiveMQ 5.x), as used in the example
>
>
>
> you referenced.
>
>
>
>
>
>
>
> Your description and log snippets note you are trying to use that with
>
>
>
> the Artemis Core JMS client instead, meaning those bits just dont
>
>
>
> apply. You should use the JMS 2 APIs for creating shared subscriptions
>
>
>
> to create+consume from new shared subscription backing queues, or
>
>
>
> alternatively you could use an FQQN address with a Topic subscriber.
>
>
>
>
>
>
>
> (Obligatory note that 2.19.1 is already an older release at this
>
>
>
> point, and there won't be any more 2.19.x releases. Aside, the next
>
>
>
> JDK LTS, 21, is due for RC1 next week...previously with JDK17, RC1
>
>
>
> became the GA).
>
>
>
>
>
>
>
> On Tue, 1 Aug 2023 at 21:12, PAS Filip 
> <filip....@sodexo.com.invalid<mailto:filip....@sodexo.com.invalid<mailto:filip....@sodexo.com.invalid%3cmailto:filip....@sodexo.com.invalid>>>
>  wrote:
>
>
>
> >
>
>
>
> > Hello,
>
>
>
> >
>
>
>
> > I'm running into a strange issue I cannot explain and was hoping someone 
> > could shed some light on the issue.
>
>
>
> >
>
>
>
> > I'm running an artemis broker 2.28.0 using the artemis jms client 2.19.1 
> > (the latest java 8 compatible client, my client must be java 8 
> > unfortunately).
>
>
>
> >
>
>
>
> > I've created a broker using all standard settings and copied the broker 
> > configuration from the openwire virtual topic example, specifically the 
> > acceptor and the topic configuration:
>
>
>
> >
>
>
>
> > <acceptor 
> > name="artemis">tcp://0.0.0.0:61616?virtualTopicConsumerWildcards=Consumer.*.%3E%3B2</acceptor>
>
>
>
> >
>
>
>
> > <addresses>
>
>
>
> >      <address name="VirtualTopic.Orders">
>
>
>
> >            <multicast/>
>
>
>
> >     </address>
>
>
>
> > </addresses>
>
>
>
> >
>
>
>
> > If I copy the code from the virtual topic example into my project and run 
> > it the test fails.
>
>
>
> > The message sent to VirtualTopic.Orders  is not delivered to the consumer 
> > of the Consumer.A.VirtualTopic.Orders destination.
>
>
>
> > The destination Consumer.A.VirtualTopic.Orders is created as a queue and is 
> > visible as a separate address and not visible under the topic in the 
> > console.
>
>
>
> > In the log I found this message:
>
>
>
> >
>
>
>
> > DEBUG o.a.activemq.artemis.core.client - The queue 
> > Consumer.A.VirtualTopic.Orders was created automatically.
>
>
>
> >
>
>
>
> > To make the example work I changed the configuration in the broker.xml to:
>
>
>
> >
>
>
>
> > <address name="VirtualTopic.Orders">
>
>
>
> >                 <multicast>
>
>
>
> >                                 <queue 
> > name="Consumer.A.VirtualTopic.Orders" />
>
>
>
> >                 </multicast>
>
>
>
> > </address>
>
>
>
> >
>
>
>
> > The log statement then disappears, and the behaviour is as expected.
>
>
>
> >
>
>
>
> > I'm trying to figure out where this difference in behaviour comes from.
>
>
>
> > Is there something in the maven plugin used to bootstrap the broker for the 
> > test that does some additional configuration that would change this 
> > behaviour?
>
>
>
> >
>
>
>
> > In my use case we need to get this configuration working with the  
> > <multicast/> tag so we can add additional queues that will receive the 
> > messages from the topic
>
>
>
> > Without having to predefine them all in the configuration.
>
>
>
> >
>
>
>
> >
>
>
>
> > Anyone have any ideas or suggestions that would greatly be appreciated.
>
>
>
> >
>
>
>
> > Regards,
>
>
>
> >
>
>
>
> > Filip
>
>
>
> >
>
>
>
> >

Reply via email to