Java – 自定义线程池 vs 使用Spring事件与异步处理程序

huangapple go评论73阅读模式
英文:

Java - Custom Thread Pool vs Spring Event with Async Handlers

问题

以下是翻译好的部分:

我正在努力拦截服务层方法并捕获运行时业务数据,然后将其写入某种持久性存储。在拦截方法之后,我计划异步执行持久性部分。我正在评估是否应该使用ExecutorService还是使用Spring事件与异步处理程序。

使用任一方法的利弊是什么?

英文:

I am working on intercepting service layer methods and capture runtime business data and write it to some sort of persistence. After intercepting the methods, I am planning to do the persistence part asynchronously. I am working on evaluating if I should use ExecutorService or use Spring Events with Async Handler.

What could be the pros and cons of using either of the approach?

答案1

得分: 1

在自然界中,线程池和Spring事件异步之间没有区别。从技术上讲,它们都位于由JDK提供的“JUC”包中,用于并发请求。但它们的用法和场景不同。

线程池

  • 线程池通常用于一般异步处理,您可以将任务分配给单独的线程以并行执行。

以下是线程池的示例代码片段:

ExecutorService executorService = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
    final int taskId = i;
    executorService.execute(() -> {
        // 执行异步任务
        System.out.println("执行任务:" + taskId);
    });
}

使用异步处理的Spring事件

  • Spring事件提供了在Spring应用程序内部组件之间进行通信和解耦的机制。
  • 您可以专注于业务,而不必担心环境。

以下是Spring事件的示例代码片段:

@Configuration
@EnableAsync
public class SpringEventsThreadPoolExample {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringEventsThreadPoolExample.class);
        
        // 发布事件
        MyEvent event = new MyEvent("Hello, Spring Events with Custom Thread Pool!");
        context.publishEvent(event);
    }

    public static class MyEvent {
        private String message;

        public MyEvent(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }
    }

    @Async
    @EventListener
    public void handleEvent(MyEvent event) {
        // 执行异步事件处理
        System.out.println("处理事件:" + event.getMessage() + " 在线程:" + Thread.currentThread().getName());
    }

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(50);
        executor.setThreadNamePrefix("async-thread-");
        executor.initialize();
        return executor;
    }
}

根据前述确定,Spring事件基于线程池,您可以将其视为提供更集成和流畅的方法的超集。但是,如果您需要对线程执行和资源分配进行细粒度控制,或者如果您需要更广泛的异步处理,超出了事件处理范围,那么线程池可能更合适。

英文:

In nature , There is no difference between thread pool and spring event async. Technically , both of them lies on JUC package which is provied by jdk used to concurrently request. But the usage of them has different usage and scenario.

Thread pool

  • Thread pooling is typically used for general-purpose asynchronous processing, where you want to payload tasks to separate threads for parallel execution.

following is sample code snippet of Thread pool

ExecutorService executorService = Executors.newFixedThreadPool(5);

        for (int i = 0; i &lt; 10; i++) {
            final int taskId = i;
            executorService.execute(() -&gt; {
                // Perform asynchronous task
                System.out.println(&quot;Executing task: &quot; + taskId);
            });
        }

Spring Events with Async Handlers

  • Spring events provide a mechanism for communication and decoupling between components within a Spring application.
  • you can focus on your bussiness , not environment

following is sample code snippet of Spring Events

@Configuration
@EnableAsync
public class SpringEventsThreadPoolExample {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringEventsThreadPoolExample.class);
        
        // Publish an event
        MyEvent event = new MyEvent(&quot;Hello, Spring Events with Custom Thread Pool!&quot;);
        context.publishEvent(event);
    }

    public static class MyEvent {
        private String message;

        public MyEvent(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }
    }

    @Async
    @EventListener
    public void handleEvent(MyEvent event) {
        // Perform asynchronous event handling
        System.out.println(&quot;Handling event: &quot; + event.getMessage() + &quot; on thread: &quot; + Thread.currentThread().getName());
    }

    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(50);
        executor.setThreadNamePrefix(&quot;async-thread-&quot;);
        executor.initialize();
        return executor;
    }
}

As pervious determine, Spring Event is based on Thread pool , you can relaize it as a superset that provide more integrated and streamlined approach. howeveer,if you need fine-grained control over thread execution and resource allocation, or if you have a broader need for asynchronous processing beyond event handling, thread pooling might be more appropriate.

huangapple
  • 本文由 发表于 2023年7月7日 03:32:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/76632033.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定