parchambeau
parchambeau

Reputation: 1141

ActiveMQ, Camel, Spring, simple route not working

I am having some trouble with a simple camel route that should be grabbing a message from an ActiveMQ topic that I have and then printing out the contents of the messages to the console through the use of log.

Right now all that it is is the camel-context.xml, and a java class that is producing the topic in ActiveMQ and adding a simple string message to the queue. I am using the ActiveMQ interface to check to see if the topic is being created, and it is, but my message is not being added to the topic nor is it being routed through the camel route. Running main I can get the output of my sys out to the console, and I see that 1 message is "enqueued" and 1 message is "dequeued" in the activemq interface. I just do not get any output to the console from the "log message" in my route.

Any help or tips would be greatly appreciated since I am new to all 3 of these technologies, and I just want to get this simple "Hello World" working.

Thank you! The two files are found below:

After further testing I think that it just has something to do with the way that I am trying to log the contents of the message, because I know that it is picking up my camel route because I added a second topic and told the camel route to route the messages to it like the following:

to uri="activemq:topic:My.SecondTestTopic"

and I am able to see if being redirected to that queue in the activeMQ interface.


TestMessageProducer.java

package com.backend;

import javax.jms.*;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

public class TestMessageProducer {

 private static String url = ActiveMQConnection.DEFAULT_BROKER_URL;

    public static void main(String[] args) throws JMSException {

        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();


        Session session = connection.createSession(false,
                Session.AUTO_ACKNOWLEDGE);

        Topic topic = session.createTopic("My.TestTopic");

        MessageProducer producer = session.createProducer(topic);

        TextMessage message = session.createTextMessage();

        message.setText("THIS IS A TEST TEXT MESSAGE BEING SENT TO THE TOPIC AND HOPEFULLY BEING PICKED UP BY THE" +
                "CAMEL ROUTE");

        producer.send(message);
        System.out.println("Sent message '" + message.getText() + "'");

        connection.close();
    }

}


Camel-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<spring:beans xmlns:spring="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://camel.apache.org/schema/spring"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:alch="http://service.alchemy.kobie.com/"
xsi:schemaLocation="http://www.springframework.org/schema/beans classpath:META-INF/spring/spring-beans.xsd 
    http://camel.apache.org/schema/spring classpath:META-INF/spring/camel-spring.xsd">

<!-- load properties -->
<spring:bean
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <spring:property name="locations" value="file:backend.properties" />
</spring:bean>

<spring:bean id="properties"
    class="org.apache.camel.component.properties.PropertiesComponent">
    <spring:property name="location" value="file:backend.properties" />
</spring:bean>

<spring:bean id="jmsConnectionFactory" 
    class="org.apache.activemq.ActiveMQConnectionFactory">
    <spring:property name="brokerURL" value="tcp://0.0.0.0:61616?useLocalHost=true" />
</spring:bean>

<spring:bean id="pooledConnectionFactory" 
    class="org.apache.activemq.pool.PooledConnectionFactory">
    <spring:property name="maxConnections" value="8" />
    <spring:property name="maximumActive" value="500" />
    <spring:property name="connectionFactory" ref="jmsConnectionFactory" />
</spring:bean>

<spring:bean id="jmsConfig" 
    class="org.apache.camel.component.jms.JmsConfiguration">
    <spring:property name="connectionFactory" ref="pooledConnectionFactory"/>
    <spring:property name="transacted" value="false"/>
    <spring:property name="concurrentConsumers" value="1"/>
</spring:bean>

<spring:bean id="activemq" 
    class="org.apache.activemq.camel.component.ActiveMQComponent">
    <spring:property name="configuration" ref="jmsConfig"/>
</spring:bean>


<!-- camel configuration -->

 <camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
  <from uri="activemq:topic:My.TestTopic"/>
  <log message="Output of message from Queue: ${in.body}"/>
  <to uri="activemq:topic:My.SecondTestTopic" />
</route>

Upvotes: 0

Views: 3226

Answers (2)

Claus Ibsen
Claus Ibsen

Reputation: 55525

And you have started the Camel application first. Eg as you send non persistent messages to a topic. And if there is no active subscribers when sending, then the messages is not received by anybody. You may want to use persistent durable topic instead.

Upvotes: 1

Nicholas
Nicholas

Reputation: 16056

I suspect you are creating two seperate instances of an ActiveMQ broker. Can you update your TestMessageProducer to use the URL tcp://localhost:61616 ? Also, can you use jconsole to check the topic activity in the activemq instance on both VMs ?

=== UPDATE ===

I missed the bit about you verifying that the 2nd topic did receive the message, so your route is working.... Must be the logger. If you have the camel source code in your IDE, you could turn the debugger on and place a break point on

org.apache.camel.component.log.LogProducer
    .process(Exchange exchange, AsyncCallback callback)

to see what happens and if it is called. Which logging package do you have configured ?

Upvotes: 0

Related Questions