From abbfc01105f4968c78d439eb66afa04600a3c32c Mon Sep 17 00:00:00 2001 From: mgooty Date: Sun, 7 Dec 2014 21:15:52 +0530 Subject: [PATCH] Code samples for spring @Async annotation. --- .../async/AsyncAnnotationExample.java | 43 +++++++++++++ .../async/CustomAsyncExceptionHandler.java | 21 +++++++ .../async/config/SpringAsyncConfig.java | 34 +++++++++++ .../src/main/resources/springAsync-config.xml | 13 ++++ .../async/AsyncAnnotationExampleTest.java | 61 +++++++++++++++++++ .../org/baeldung/async/AsyncWithXMLTest.java | 25 ++++++++ 6 files changed, 197 insertions(+) create mode 100644 spring-all/src/main/java/org/baeldung/async/AsyncAnnotationExample.java create mode 100644 spring-all/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java create mode 100644 spring-all/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java create mode 100644 spring-all/src/main/resources/springAsync-config.xml create mode 100644 spring-all/src/test/java/org/baeldung/async/AsyncAnnotationExampleTest.java create mode 100644 spring-all/src/test/java/org/baeldung/async/AsyncWithXMLTest.java diff --git a/spring-all/src/main/java/org/baeldung/async/AsyncAnnotationExample.java b/spring-all/src/main/java/org/baeldung/async/AsyncAnnotationExample.java new file mode 100644 index 0000000000..99c69b5273 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/async/AsyncAnnotationExample.java @@ -0,0 +1,43 @@ +package org.baeldung.async; + +import java.util.concurrent.Future; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Component; + +@Component +public class AsyncAnnotationExample { + + @Async + public void asyncMethodWithVoidReturnType() { + System.out.println("Execute method asynchronously. " + + Thread.currentThread().getName()); + } + + @Async + public Future asyncMethodWithReturnType() { + System.out.println("Execute method asynchronously " + + Thread.currentThread().getName()); + try { + Thread.sleep(5000); + return new AsyncResult("hello world !!!!"); + } catch (final InterruptedException e) { + + } + + return null; + } + + @Async("threadPoolTaskExecutor") + public void asyncMethodWithConfiguredExecutor() { + System.out + .println("Execute method asynchronously with configured executor" + + Thread.currentThread().getName()); + } + + @Async + public void asyncMethodWithExceptions() throws Exception { + throw new Exception("Throw message from asynchronous method. "); + } +} diff --git a/spring-all/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java b/spring-all/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java new file mode 100644 index 0000000000..94b1f7a49d --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java @@ -0,0 +1,21 @@ +package org.baeldung.async; + +import java.lang.reflect.Method; + +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; + +public class CustomAsyncExceptionHandler implements +AsyncUncaughtExceptionHandler { + + @Override + public void handleUncaughtException(final Throwable throwable, + final Method method, final Object... obj) { + System.out.println("Exception message - " + throwable.getMessage()); + System.out.println("Method name - " + method.getName()); + for (final Object param : obj) { + System.out.println("Param - " + param); + } + + } + +} diff --git a/spring-all/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java b/spring-all/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java new file mode 100644 index 0000000000..6e3f96c18a --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java @@ -0,0 +1,34 @@ +package org.baeldung.async.config; + +import java.util.concurrent.Executor; + +import org.baeldung.async.CustomAsyncExceptionHandler; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.SimpleAsyncTaskExecutor; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableAsync() +@ComponentScan("org.baeldung.async") +public class SpringAsyncConfig implements AsyncConfigurer { + + @Bean(name = "threadPoolTaskExecutor") + public Executor threadPoolTaskExecutor() { + return new ThreadPoolTaskExecutor(); + } + + @Override + public Executor getAsyncExecutor() { + return new SimpleAsyncTaskExecutor(); + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new CustomAsyncExceptionHandler(); + } +} \ No newline at end of file diff --git a/spring-all/src/main/resources/springAsync-config.xml b/spring-all/src/main/resources/springAsync-config.xml new file mode 100644 index 0000000000..23905943d5 --- /dev/null +++ b/spring-all/src/main/resources/springAsync-config.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-all/src/test/java/org/baeldung/async/AsyncAnnotationExampleTest.java b/spring-all/src/test/java/org/baeldung/async/AsyncAnnotationExampleTest.java new file mode 100644 index 0000000000..a44d4e9cd8 --- /dev/null +++ b/spring-all/src/test/java/org/baeldung/async/AsyncAnnotationExampleTest.java @@ -0,0 +1,61 @@ +package org.baeldung.async; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +import org.baeldung.async.config.SpringAsyncConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = { SpringAsyncConfig.class }, loader = AnnotationConfigContextLoader.class) +public class AsyncAnnotationExampleTest { + + @Autowired + AsyncAnnotationExample asyncAnnotationExample; + + @Test + public void testAsyncAnnotationForMethodsWithVoidReturnType() { + System.out.println("Start - invoking an asynchronous method. " + + Thread.currentThread().getName()); + asyncAnnotationExample.asyncMethodWithVoidReturnType(); + System.out.println("End - invoking an asynchronous method. "); + } + + @Test + public void testAsyncAnnotationForMethodsWithReturnType() + throws InterruptedException, ExecutionException { + System.out.println("Start - invoking an asynchronous method. " + + Thread.currentThread().getName()); + final Future future = asyncAnnotationExample + .asyncMethodWithReturnType(); + + while (true) { + if (future.isDone()) { + System.out.println("Result from asynchronous process - " + + future.get()); + break; + } + System.out.println("Continue doing something else. "); + Thread.sleep(1000); + } + } + + @Test + public void testAsyncAnnotationForMethodsWithConfiguredExecutor() { + System.out.println("Start - invoking an asynchronous method. "); + asyncAnnotationExample.asyncMethodWithConfiguredExecutor(); + System.out.println("End - invoking an asynchronous method. "); + } + + @Test + public void testAsyncAnnotationForMethodsWithException() throws Exception { + System.out.println("Start - invoking an asynchronous method. "); + asyncAnnotationExample.asyncMethodWithExceptions(); + System.out.println("End - invoking an asynchronous method. "); + } +} diff --git a/spring-all/src/test/java/org/baeldung/async/AsyncWithXMLTest.java b/spring-all/src/test/java/org/baeldung/async/AsyncWithXMLTest.java new file mode 100644 index 0000000000..7436928c0c --- /dev/null +++ b/spring-all/src/test/java/org/baeldung/async/AsyncWithXMLTest.java @@ -0,0 +1,25 @@ +package org.baeldung.async; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration("classpath:springAsync-config.xml") +public class AsyncWithXMLTest { + + @Autowired + AsyncAnnotationExample asyncAnnotationExample; + + @Test + public void testAsyncAnnotationForMethodsWithVoidReturnType() + throws InterruptedException { + System.out.println("Start - invoking an asynchronous method. " + + Thread.currentThread().getName()); + asyncAnnotationExample.asyncMethodWithVoidReturnType(); + Thread.sleep(2000); + System.out.println("End - invoking an asynchronous method. "); + } +}