【问题标题】:Camel route execution priority骆驼路线执行优先级
【发布时间】:2020-11-20 00:31:47
【问题描述】:

我正在尝试了解 Camel 是否能够在同一进程中将路由执行优先于另一个路由执行。

例如,我们有:

from("cxfrs://restendpoint").routeId("HIGH").log("high priority");

from("file://filestore").routeId("LOW").log("low priority");

我希望 HIGH 路线不会被 LOW 路线拖慢。因此,当 LOW 路由正在处理一个大文件并且休息呼叫到达 HIGH 路由时,我希望 CPU 给 HIGH 路由更多的时间。

我正在考虑通过将路由拆分为 2 个应用程序并使用 Linux 进程优先级来为 HIGH 路由分配更多时间。

有没有办法用 Camel 做到这一点?例如,可以使用线程优先级吗?

感谢您的帮助

【问题讨论】:

    标签: java multithreading apache-camel


    【解决方案1】:

    看看Apache Camel/ActiveMQ priority route(初始情况不同,但解决方案也适用于您的用例):

    • 使用 JMS 并确定队列的优先级
    • here 所述,使用 SEDA 阻塞队列
    • 使用重测序器

    编辑:

    作为附加选项,使用 ExecutorService 和自定义 ThreadFactory 并设置线程优先级,例如:

    ThreadFactory threadFactory = new ThreadFactory() {
        @Override
        public Thread newThread(final Runnable r) {
            Thread thread = new Thread(r);
            thread.setPriority(Thread.MIN_PRIORITY);
            return thread;
        }
    };
    
    ExecutorService exe = Executors.newFixedThreadPool(3, threadFactory);
    
    from("direct:slow")
        .threads()
        .executorService(exe)
        ...
    

    可以找到一篇关于 Java 线程优先级的好文章 here

    【讨论】:

    • 感谢您的回复。您描述的解决方案允许优先考虑一条路线而不是另一条路线。但问题是:如果长时间处理(如解析一个非常大的文件)需要超过 5 分钟并且在解析开始后到达优先级调用,那么该解决方案之一如何帮助为优先级调用提供更多资源?据我了解,这些解决方案允许按优先级排序,但不能将更多资源分配给特别是一条路线。
    • @Thomas 我添加了一个ExecutorService 选项
    • 这看起来很棒!感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2018-08-08
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多