Java @与Spring3.0.6异步

Java @与Spring3.0.6异步,java,spring,multithreading,spring-async,Java,Spring,Multithreading,Spring Async,我正在尝试使用@Async注释实现异步调用。显然,由于它是一个遗留项目,Spring版本是3.0.6,因此它不支持较新的接口(AsyncConfigurer)和后来的Spring版本中引入的侦听器 目前,@Async调用在发送电子邮件所需的方法上运行良好。调用代码调用该方法并返回以恢复正常控制。然后,@Async调用作为单独的线程调用。这一切都很好,达到了目的 @Async调用的方法用于在应用程序中发送电子邮件。然而,有时会触发1000封电子邮件。我假设这将产生1000个左右的线程。这会不会导致

我正在尝试使用@Async注释实现异步调用。显然,由于它是一个遗留项目,Spring版本是3.0.6,因此它不支持较新的接口(AsyncConfigurer)和后来的Spring版本中引入的侦听器

目前,@Async调用在发送电子邮件所需的方法上运行良好。调用代码调用该方法并返回以恢复正常控制。然后,@Async调用作为单独的线程调用。这一切都很好,达到了目的

@Async调用的方法用于在应用程序中发送电子邮件。然而,有时会触发1000封电子邮件。我假设这将产生1000个左右的线程。这会不会导致应用程序中有这么多活动线程出现问题?这些线程是否自行终止?JVM在内存使用和堆空间方面发生了什么

此外,我试图通过将该方法标记为@Async来从另一个方法调用该方法,但看起来线程没有创建,控件实际上在那里等待完成该方法中的所有操作。为什么它有不同的行为?不知道为什么会这样


提前谢谢

它产生了多少线程以及事情队列的方式取决于您如何定义TaskExecutorbean


此处的文档:

您的Emailtasks将首先存储在一个(默认情况下不受限制)队列中

默认情况下,队列是无界的,但这很少是所需的配置,因为如果在所有池线程都繁忙的情况下向该队列添加足够的任务,则可能会导致OutOfMemoryErrors

如果只使用注释,则spring将创建一个默认执行器。此执行器使用默认设置,您可以通过在配置文件或配置类中配置执行器属性来更改这些设置:

<task:executor
        id="emailSenderExecutor"
        pool-size="5-25"
        queue-capacity="100"/>
阅读更多信息以及如何配置执行器:

@Async: 可以在方法上提供@Async注释,以便异步调用该方法。换句话说,调用方将在调用后立即返回,方法的实际执行将发生在已提交给Spring TaskExecutor的任务中

异步的工作原理:

异步处理的这种行为是在运行时使用类的代理实现的。 当您的类的一个bean通过Spring注入到另一个类中时,Spring实际上会注入代理。因此,将调用代理的相关方法

这是否会导致应用程序中存在如此多的live应用程序问题 线程

在定义任务执行器配置时,您必须非常具体。 e、 如何配置任务执行器(如果您使用SpringXML配置)

>class=“org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor”>
>     
>     
>      
这些线程是否自行终止

这些线程由Spring容器管理

JVM在内存使用和堆空间方面发生了什么

显然,创建的代理数量越多,消耗的堆内存就越多

为什么它有不同的行为

我假设您在同一个类中创建了两个异步方法,并在另一个类中调用了一个。
因此,当您从类内部调用一个方法时,Spring AOP的一个限制是代理从未发挥作用,而是作为常规方法触发的。

我没有使用任务执行器。我没有在applicationContext.xml或任何spring文件中配置任何内容。有时应用程序的其他部分会配置一个,而异步注释只会选择这些内容。您可能需要显式配置ThreadPoolTaskExecutor bean,然后假设您在Spring 3中使用的是XML,而不是编程配置,将您的异步支持绑定到该执行器,如下所示:
我不太理解任务的内容:executor。我只为异步调用的方法提供了一个注释。所有的结果都是一个独立执行的新线程,让控件从此处恢复。我没有使用任何任务执行器
@Async(value = "emailSenderExecutor")
public void sendEmail(Email email) {
    [...]
}
> <bean id="taskExecutor"
> class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
>     <property name="corePoolSize" value="5" />
>     <property name="maxPoolSize" value="10" />
>     <property name="queueCapacity" value="25" /> </bean>