当 war 部署在 JBoss 上时,@Async 注释不起作用
@Async annotation does not works when war is deployed on JBoss
我有一个包含 API Rest 的应用程序作为 Spring 启动应用程序(1.5.18.RELEASE 版本)
此 API 包含一个异步执行服务方法的控制器。该方法用@Async
注解
标注
我的配置 class 上设置了 @EnableAsync
注释。
当我像典型的 Spring 引导应用程序一样执行应用程序时,该方法是异步执行的。如果我生成一个 war(使用 maven)并且这个 war 部署在 JBoss(6.4 版本)上,相同的服务是同步执行的。
有人可以向我解释这种行为吗?我应该添加任何类型的配置吗?
源码如下:
Spring启动配置
@SpringBootApplication
@EnableCustomConfiguration
@EnableCaching
@EnableScheduling
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
我的自定义注释:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({CustomServicesConfiguration.class})
@Documented
public @interface EnableCustomConfiguration {
}
我的配置class:
@Configuration
@ComponentScan("com.bs.custom.api")
@EntityScan(basePackages = "com.bs.custom.api.domain", basePackageClasses = Jsr310JpaConverters.class)
@EnableJpaRepositories(basePackages = "com.bs.custom.api.repository")
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@EnableAsync
public class CustomServicesConfiguration {
static {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
}
我修改了 WebApplication class 以从 SpringBootServletInitializer 扩展,如 Spring Boot reference guide (thanks M.Deinum)
中所定义
最终的 WebApplication class 源代码如下:
@SpringBootApplication
@EnableCustomConfiguration
@EnableCaching
@EnableScheduling
@EnableAsync
public class WebApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebApplication.class);
}
}
现在,异步方法 运行 在 JBoss
上正确
我有一个包含 API Rest 的应用程序作为 Spring 启动应用程序(1.5.18.RELEASE 版本)
此 API 包含一个异步执行服务方法的控制器。该方法用@Async
注解
我的配置 class 上设置了 @EnableAsync
注释。
当我像典型的 Spring 引导应用程序一样执行应用程序时,该方法是异步执行的。如果我生成一个 war(使用 maven)并且这个 war 部署在 JBoss(6.4 版本)上,相同的服务是同步执行的。
有人可以向我解释这种行为吗?我应该添加任何类型的配置吗?
源码如下:
Spring启动配置
@SpringBootApplication
@EnableCustomConfiguration
@EnableCaching
@EnableScheduling
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
我的自定义注释:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({CustomServicesConfiguration.class})
@Documented
public @interface EnableCustomConfiguration {
}
我的配置class:
@Configuration
@ComponentScan("com.bs.custom.api")
@EntityScan(basePackages = "com.bs.custom.api.domain", basePackageClasses = Jsr310JpaConverters.class)
@EnableJpaRepositories(basePackages = "com.bs.custom.api.repository")
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@EnableAsync
public class CustomServicesConfiguration {
static {
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
}
我修改了 WebApplication class 以从 SpringBootServletInitializer 扩展,如 Spring Boot reference guide (thanks M.Deinum)
中所定义最终的 WebApplication class 源代码如下:
@SpringBootApplication
@EnableCustomConfiguration
@EnableCaching
@EnableScheduling
@EnableAsync
public class WebApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(WebApplication.class);
}
}
现在,异步方法 运行 在 JBoss
上正确