0

我在使用简单的骆驼路由时遇到了一些问题,该路由应该从我拥有的 ActiveMQ 主题中获取消息,然后通过使用 log 将消息的内容打印到控制台。

现在它只是 camel-context.xml 和一个 java 类,它在 ActiveMQ 中生成主题并将简单的字符串消息添加到队列中。我正在使用 ActiveMQ 接口来检查是否正在创建主题,并且确实是,但是我的消息没有被添加到主题中,也没有通过骆驼路由进行路由。运行 main 我可以将我的 sys 的输出输出到控制台,我在 activemq 接口中看到 1 条消息“入队”,1 条消息“出队”。我只是没有从我的路由中的“日志消息”获得任何输出到控制台。

任何帮助或提示将不胜感激,因为我对所有这 3 种技术都是新手,我只想让这个简单的“Hello World”工作。

谢谢!这两个文件在下面找到:

经过进一步测试后,我认为这与我尝试记录消息内容的方式有关,因为我知道它正在选择我的骆驼路线,因为我添加了第二个主题并告诉骆驼路线将消息路由到它,如下所示:

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

我可以看到是否被重定向到 activeMQ 接口中的该队列。


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();
    }

}


骆驼上下文.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>

4

2 回答 2

1

并且您首先启动了 Camel 应用程序。例如,当您向主题发送非持久性消息时。如果发送时没有活跃的订阅者,那么任何人都不会收到消息。您可能想改用持久性持久主题。

于 2013-02-09T08:47:54.337 回答
0

我怀疑您正在创建 ActiveMQ 代理的两个单独实例。您可以更新您的TestMessageProducer以使用 URL tcp://localhost:61616吗?另外,您可以使用 jconsole 检查两个 VM 上的 activemq 实例中的主题活动吗?

=== 更新 ===

我错过了有关您验证第二个主题确实收到了消息的信息,因此您的路线正在运行....必须是记录器。如果您的 IDE 中有骆驼源代码,您可以打开调试器并在其上放置一个断点

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

看看会发生什么以及它是否被调用。您配置了哪个日志记录包?

于 2013-02-06T16:01:21.690 回答