使用apache camel java DSL从activemq接收消息

时间:2017-03-02 10:57:19

标签: java apache-camel activemq

  • 我正在使用apache camel接收队列中的所有消息。但是我 需要提一下线程的休眠时间来运行驼峰上下文。
  • 现在问题是它只消耗一些消息,即。在...内 指定睡眠时间。
  • 如果我增加睡眠时间,那么它将路由所有消息,但是 它一直等到睡眠时间结束才终止程序。
  • 我需要的是,驼峰应该路由队列中的所有消息 然后它应该立即终止。

有没有办法在没有使用java DSL指定线程休眠时间的情况下运行camel?

示例代码:

import javax.jms.ConnectionFactory;

import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.jms.JmsComponent;
import org.apache.camel.impl.DefaultCamelContext;

public class SplitJson {

    public static void main(String[] args) {

        try {
            CamelContext context = new DefaultCamelContext();
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin", "admin",
                    ActiveMQConnection.DEFAULT_BROKER_URL);
            context.addComponent("test-jms", JmsComponent.jmsComponentAutoAcknowledge(connectionFactory));
            context.addRoutes(new RouteBuilder() {
                public void configure() {
                    from("test-jms:queue:testMQDestination")
                    .choice()
                    .when().jsonpath("$.[?(@.Status == 'YetToStart')]")
                    .to("test-jms:queue:YetToStart")
                    .when().jsonpath("$.[?(@.Status == 'Started')]]")
                    .to("test-jms:queue:Started")
                    .when().jsonpath("$.[?(@.Status == 'Completed')]]")
                    .to("test-jms:queue:Completed")
                    .otherwise()
                    .to("test-jms:queue:Others")
                    .end();
                }
            });
            context.start();
            Thread.sleep(10000);
            context.stop();
            System.out.println("Done");
        } catch (Exception e) {

            e.printStackTrace();
        }

    }

}

1 个答案:

答案 0 :(得分:2)

您需要构建自己的逻辑来检查Camel何时处于空闲状态,并且该队列中不再有消息。

您可以使用路由策略,然后在onExchangeDone中可以重置一个时钟,这是新消息进入时的事件。然后,如果在X时间段之后没有新消息,则时钟到达超时或某个时间点然后你知道要停止JVM。

此票证:https://issues.apache.org/jira/browse/CAMEL-10596类似于能够在X秒,消息或闲置X时间后自动停止的事情。所以它将在Camel 2.19开始时开箱即用。