有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

是否有任何方法可以在不使用JavaDSL指定线程睡眠时间的情况下运行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) 个答案

  1. # 1 楼答案

    您需要构建自己的逻辑,以便在Camel空闲且该队列上没有更多消息时进行检查

    您可以使用路由策略,然后在onExchangeDone中,您可以重置一个时钟,该时钟是新消息传入时的事件。然后,如果在X周期之后没有新消息,那么时钟就会超时,或者知道要停止JVM

    这个票证:https://issues.apache.org/jira/browse/CAMEL-10596类似于在X秒后自动停止、消息或空闲X次。因此,它将在骆驼2.19版之后推出