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

使用apache camel java DSL从activemq接收消息 我正在使用ApacheCamel接收队列中的所有消息。但我 需要提到线程的睡眠时间来运行骆驼上下文 现在的问题是,它只消耗一些消息,即 指定的睡眠时间 如果我增加睡眠时间,那么它将路由所有消息,但是 它会等到睡眠时间结束后才终止程序 我需要的是,骆驼应该路由队列中的所有消息 然后它应该立即终止,java,apache-camel,activemq,Java,Apache Camel,Activemq,是否有任何方法可以在不使用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.buil

是否有任何方法可以在不使用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();
        }

    }

}

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

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


这张罚单:类似于在X秒后自动停止、发送消息或空闲X次。因此,它将在Camel 2.19以后的版本中开箱即用。

您需要构建自己的逻辑,以便在Camel空闲且队列中不再有消息时进行检查

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


这张罚单:类似于在X秒后自动停止、发送消息或空闲X次。因此,它将在驼峰2.19版之后推出。

为什么不使用destinationInterceptors或在经纪人端?您可以在使用destinationInterceptors时编辑配置,而无需在使用此插件时重新启动代理,您无需进入睡眠状态。您只需要确保上下文永远运行@SoucianceEqdamRashti,但在路由队列中的所有消息后,执行需要终止,只需停止路由中的所有消息即可。有一个EIP。为什么不使用destinationInterceptors或在代理端?您可以在使用destinationInterceptors时编辑配置,而无需在使用此插件时重新启动代理,您无需进入睡眠状态。您只需要确保上下文永远运行@SoucianceEqdamRashti,但在路由队列中的所有消息后,执行需要终止,只需停止路由中的所有消息即可。这有一个EIP。您能否引用一下,在每个特定时间使用QueueBrowser检查队列大小是一个好主意,还是有更好的方法来检查队列大小?QueueBrowser很糟糕,因为它加载了所有消息,而且在代理端也可能受到硬限制。对于ActiveMQ,最好使用JMX/Jolokia或咨询消息查询代理,后者可以在JMS回复消息中返回队列深度详细信息。您能否引用一下,是否最好在每个特定时间使用QueueBrowser检查队列大小,或者有更好的方法吗?QueueBrowser很糟糕,因为它加载了所有消息,而且在代理端也可能受到硬限制。对于ActiveMQ,最好使用JMX/Jolokia或咨询消息查询代理,后者可以在JMS回复消息中返回队列深度详细信息。