I am running ActiveMQ Classic as a Docker container. It is running on port 61616
. I haven’t changed any settings.
I have created this example queue in the webinterface:
Here is the queue definition:
<queues>
<queue name="ExampleQueue">
<stats size="0" consumerCount="0" enqueueCount="0" dequeueCount="0"/>
<feed>
<atom>queueBrowse/ExampleQueue?view=rss&feedType=atom_1.0</atom>
<rss>queueBrowse/ExampleQueue?view=rss&feedType=rss_2.0</rss>
</feed>
</queue>
</queues>
I am trying to access this queue in Java with the following code:
package messageListener;
import javax.naming.*;
import java.util.Properties;
import javax.jms.*;
public class MessageListenerSender {
// Member-Variables
InitialContext initialContext;
ConnectionFactory connectionFactory;
Connection connection;
Session session;
Queue queue;
MessageProducer queueMessageProducer;
Topic topic;
MessageProducer topicMessageProducer;
// Connect to Message-Broker
public void connectToMessageBroker() throws Exception {
Properties properties = new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,
"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
properties.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
initialContext = new InitialContext(properties);
connectionFactory = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}
// Access Point-To-Point Queue
public void accessPointToPointQueue() throws Exception {
queue = (Queue) initialContext.lookup("/queue/ExampleQueue");
queueMessageProducer = session.createProducer(queue);
}
// Access Topic-Orientated Queue
public void accessTopicQueue() throws Exception {
topic = (Topic) initialContext.lookup("/topic/ExampleTopic");
topicMessageProducer = session.createProducer(topic);
}
// Send Messages
public void sendMessages() throws Exception {
Message message0 = session.createTextMessage("Hello World!");
queueMessageProducer.send(message0);
Message message1 = session.createTextMessage("Goodbye World!");
topicMessageProducer.send(message1);
}
// Close all Connections
public void closeConnections() throws Exception {
if (initialContext != null) {
initialContext.close();
}
if (connection != null) {
connection.close();
}
}
public static void main(String[] args) throws Exception {
MessageListenerSender messageListenerSender = new MessageListenerSender();
messageListenerSender.connectToMessageBroker();
messageListenerSender.accessPointToPointQueue();
messageListenerSender.accessTopicQueue();
messageListenerSender.sendMessages();
messageListenerSender.closeConnections();
}
}
This code produces this error:
Exception in thread "main" javax.naming.NameNotFoundException: queue/ExampleQueue
at org.apache.activemq.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:235)
at java.naming/javax.naming.InitialContext.lookup(InitialContext.java:409)
at messageListener.MessageListenerSender.accessPointToPointQueue(MessageListenerSender.java:40)
at messageListener.MessageListenerSender.main(MessageListenerSender.java:74)
Sadly i can’t figure out what I need to change to resolve this issue. Do I use the wrong path or sth like that?
I want to set up a sender and a receiver that communicate via ActiveMQ Classic.
2
Answers
There are two ways to deal with this.
Manual Configuration
You can define
queue/ExampleQueue
via properties in your JNDI context, e.g.:The syntax is as follows according to the documentation:
Dynamic Creation
You can also use the
dynamicQueues/
prefix in your JNDI lookup, e.g.:This is also discussed in the documentation in the "Dynamically Creating Destinations" section.
Try using
This will connect to your queue or create it if it doesnt exists, you can check the documentation here
https://activemq.apache.org/components/classic/documentation/jndi-support