0

私が持っている ActiveMQ トピックからメッセージを取得し、ログを使用してメッセージの内容をコンソールに出力する必要がある単純なキャメル ルートで問題が発生しています。

現時点では、camel-context.xml と、ActiveMQ でトピックを生成し、単純な文字列メッセージをキューに追加する Java クラスだけです。ActiveMQ インターフェイスを使用して、トピックが作成されているかどうかを確認していますが、作成されていますが、メッセージがトピックに追加されておらず、キャメル ルートを介してルーティングされていません。main を実行すると、sys の出力をコンソールに出力できます。activemq インターフェイスで、1 つのメッセージが「エンキュー」され、1 つのメッセージが「デキュー」されていることがわかります。ルートの「ログメッセージ」からコンソールへの出力が得られません。

私はこれら 3 つのテクノロジのすべてに慣れていないため、ヘルプやヒントをいただければ幸いです。この単純な "Hello World" を機能させたいだけです。

ありがとうございました!2 つのファイルは次の場所にあります。

さらにテストした後、メッセージの内容をログに記録しようとしている方法と関係があると思います.2番目のトピックを追加してラクダルートに次のようにメッセージをルーティングします。

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

}


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>

4

2 に答える 2

1

そして、最初にCamelアプリケーションを開始しました。たとえば、永続的でないメッセージをトピックに送信する場合です。また、送信時にアクティブなサブスクライバーがいない場合、メッセージは誰にも受信されません。代わりに、永続的な永続トピックを使用することをお勧めします。

于 2013-02-09T08:47:54.337 に答える
0

ActiveMQブローカーの2つの別個のインスタンスを作成していると思われます。URL tcp:// localhost:61616を使用するようにTestMessageProducerを更新できますか?また、jconsoleを使用して、両方のVMのactivemqインスタンスのトピックアクティビティを確認できますか?

===更新===

2番目のトピックがメッセージを受信したことを確認することについて少し聞き逃したので、ルートは機能しています....ロガーである必要があります。IDEにラクダのソースコードがある場合は、デバッガーをオンにしてブレークポイントをオンにすることができます

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

何が起こるか、そしてそれが呼び出されるかどうかを確認します。どのロギングパッケージを構成しましたか?

于 2013-02-06T16:01:21.690 に答える