@Async在REST类中不起作用

时间:2014-12-06 04:40:37

标签: java spring asynchronous annotations

我正在使用Spring构建的WebService项目。所有配置都使用Annotation完成。有一种方法可以发送推送通知。由于有许多通知要发送,这会导致响应延迟。所以,我将@Async注释应用于我的" sendPushnotification"方法。但是,回应仍然没有改善。我已经浏览了一些博客和stackoverflow来找到解决方案。但是,没有成功。我已将以下注释应用于我的服务类。

@Component
@Configuration
@EnableAspectJAutoProxy
@EnableAsync

异步调用的方法。

@POST
@Path("/sampleService")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response sampleService(@FormParam ...) {
    ...
    List<User> commentors = <other method to fetch commentors>;
    sendPushnotification(commentors);
    ...
}

我的异步方法。

@Async
private void sendPushnotification(List<User> commentors) {
    if (commentors != null) {
        for (User user : commentors) {
            try {
                int numNewComments = ps.getCommentsUnseenByUser(user); 

                sendMessage("ios", user, "2", "" + numNewComments, "true"); 
            } catch (Exception e) {
                log.error(e.getMessage(), e);
            }
        }
    }
}

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:1)

您正在调用this

上的方法
sendPushnotification(commentors);
// equivalent to
this.sendPushnotification(commentors);

那不行。 Spring通过代理您的bean来提供功能。它为您提供了一个代理bean,它具有对真实对象的引用。所以调用者看到并调用

proxy.someEnhancedMethod()

但是会发生什么

proxy.someEnhancedMethod() -> some enhanced logic -> target.someEnhancedMethod()

但是在您的sampleService服务方法中,您没有对代理的引用,您可以引用目标。基本上你什么都没得到。我建议将@Async逻辑移动到另一种类型,声明并将该类型的bean注入您的资源。

Spring在文档here中解释了上述所有内容。