Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 驼峰中带队列的线程DSL行为_Java_Multithreading_Apache Camel - Fatal编程技术网

Java 驼峰中带队列的线程DSL行为

Java 驼峰中带队列的线程DSL行为,java,multithreading,apache-camel,Java,Multithreading,Apache Camel,对于下面的路由,我希望队列1中的10个消息应该是并发处理的,但一次只能有一个GET进程 我的预期是错的吗?还是做错了什么? context.addRoutes(new RouteBuilder() { public void configure() { from("test-jms:queue:test.queue1").threads(10) .proc

对于下面的路由,我希望队列1中的10个消息应该是并发处理的,但一次只能有一个GET进程

我的预期是错的吗?还是做错了什么?

context.addRoutes(new RouteBuilder() {
        public void configure() {                                       
            from("test-jms:queue:test.queue1").threads(10)
            .process(sleep(1)); // sleep id is 1                
        }

        private Processor sleep(final int sleepId) {
            return new Processor() {                    
                @Override
                public void process(Exchange exchange) throws Exception {                       
                    System.out.println(curTime() + " Going for sleep sleepid=" + sleepId );
                    Thread.sleep(5000l);                        
                    System.out.println(curTime() + " Done sleep sleepid=" + sleepId );
                }
            };
        }
使用以下命令调用上述路由:

   ExecutorService ec = Executors.newFixedThreadPool(5);

    ec.submit(new Task(context,template));
    ec.submit(new Task(context,template));
    ec.submit(new Task(context,template));
    ec.submit(new Task(context,template));
    ec.submit(new Task(context,template));

static class Task  implements Runnable{
    CamelContext context;
    ProducerTemplate template;
    public Task(CamelContext context, ProducerTemplate template) {
        super();
        this.context = context;
        this.template = template;
    }
    @Override
    public void run() {         
           Exchange exchange = new DefaultExchange(context);
           exchange.setPattern(ExchangePattern.InOnly);
           exchange.getIn().setBody("Test Message: " + Thread.currentThread().getName());
           System.out.println(Thread.currentThread().getName());
           Exchange send = template.send("test-jms:queue:test.queue1",exchange);
           System.out.println("completed");           
    }

}
代码的输出:

10:24:11 Going for sleep sleepid=1
10:24:16 Done sleep sleepid=1

10:24:16 Going for sleep sleepid=1
10:24:21 Done sleep sleepid=1

10:24:21 Going for sleep sleepid=1
10:24:26 Done sleep sleepid=1

10:24:26 Going for sleep sleepid=1
10:24:31 Done sleep sleepid=1

10:24:31 Going for sleep sleepid=1
10:24:36 Done sleep sleepid=1

如果我们观察时间戳,我们将看到路由一次只处理1个消息。

您需要在JMS端点上启用
asyncConsumer
,以允许它是异步的。执行此操作时,从队列中消费的消息可能会被无序处理,因此,消费者在默认情况下是有序的

代码应该是

 public void configure() {                                       
            from("test-jms:queue:test.queue1?asyncConsumer=true").threads(10)
            .process(sleep(1)); // sleep id is 1                
        }

但是JMS组件具有内置的并发性,这通常更好地使用,因为它可以使用并发JMS消费者和并发网络。有关详细信息,请参阅选项
concurrentcummers
maxconcurrentcummers

提供了设置“concurrentcummers”。。。那么这是否表明jms端点不支持线程dsl。。即使我使用的是INONLY exchange模式……如果我理解正确,您希望它同时处理所有10条消息以使其休眠,对吗?@Itrollin是的,更正是的,最好在jms端点中使用concurrentConsumers=10,然后不需要线程。claus Ibsen。。上面的例子是针对我的学习骆驼的,所以说它将支持的所有DSL的upto端点是正确的吗?如果是,是否在某处记录了。。。。只是好奇为什么jms端点不支持线程DSL,那么这是否意味着说它的upto端点将支持特定DSL是正确的。。。如果是,则没有很好地记录哪个端点支持哪个DSL