How can I run the method asynchronously with spring?

The following code is supposed to work asynchronously, but instead, it waits for Async to complete, and then. How can I run the blah() method asynchronously?

spring.xml

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:task="http://www.springframework.org/schema/task" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <!-- Activates @Scheduled and @Async annotations for scheduling --> <task:annotation-driven /> <bean id="test" class="com.spring.test.Test"> </beans> 

Test.java

 @Path("/test") public class Test { @GET @Path("/test") @Produces("text/plain") public String tester() { return "Running..."; } @GET @Path("/triggerNew") @Produces("text/plain") public String triggerNew() { System.out.println("BEFORE " + new Date() + " BEFORE"); new Process().blah(); System.out.println("AFTER " + new Date() + " AFTER"); return "TRIGGERED"; } } 

Process.java

  @Component public class Process { @Async public void blah() { try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("NEW THREAD " + new Date() + " NEW THREAD"); } } 
+6
source share
2 answers

@Async only works when annotating Spring -managed beans, not arbitrary classes. You must define the Process as a Spring bean and then inject it into your controller class, for example.

 <bean id="test" class="com.spring.test.Test"> <property name="process"> <bean class="com.spring.test.Process"/> </property> </bean> 

 public class Test { private Process process; public void setProcess(Process process) { this.process = process; } ... public String triggerNew() { process.blah(); } } 
+7
source

Alternatively, you can complete your task manually using TaskExecutor. Just define the artist in the context of:

 <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/> 

How can you accomplish your task:

 taskExecutor.execute(new Process ()); 

But in this case, your Process class must implement the Runnable interface

+3
source

Source: https://habr.com/ru/post/911328/


All Articles