将服务方法添加到队列,以便将其他数据加载到缓存



我有几个服务类(CustomerService、AgreementService)。每个方法的结果都使用ehcache进行缓存。

有些服务方法的调用非常昂贵,或者运行时间很长。

当我加载时,例如客户,我知道接下来很有可能需要客户协议。所以我需要将它们加载到后台缓存中,使应用程序更加负责。

我试过使用方面。我已经为CustomerService.getById(id)方法和@AfterReturning建议设置了切入点。

@AfterReturning(
    pointcut = "execution(* com.example.CustomerService.getById(..))", 
    returning = "result"
)
public void loadCustomerAgreements(Object result) {
    Customer customer = (Customer) result;
    // calls method which caches result into ehcache
    agreementService.findByCustomer(customer.getId());
}

不幸的是,此解决方案一次加载客户及其协议(由于响应时间长,这是不可取的)。相反,我想加载客户并返回给用户。然后异步加载协议。

为此,建议@After非常有效。但我无法获得客户身份,所以我不知道该加载哪些协议。

有没有一种方法可以使用方面或任何Spring触发器或其他技术来实现这一点?

谢谢你的建议。

我发现方面运行的方法阻止了程序的进一步执行,因为它是在同一个线程中执行的。可能的解决方案是使用Spring任务执行框架异步运行方面方法。

弹簧配置如下所示:

<task:annotation-driven executor="executorWithPoolSizeRange" scheduler="taskScheduler"/>
<task:executor id="executorWithPoolSizeRange" pool-size="5-25" queue-capacity="100"/>
<task:scheduler id="taskScheduler" pool-size="1"/>

然后方面将看起来像:

@Async
@AfterReturning(
    pointcut = "execution(* com.example.CustomerService.getById(..))", 
    returning = "result"
)
public void loadCustomerAgreements(Object result) {
    Customer customer = (Customer) result;
    // calls method which caches result into ehcache
    agreementService.findByCustomer(customer.getId());
}

如果有可用的线程,这将在不同的线程中运行CCD_ 2方法。

有关更多信息,请参阅:

  • http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html
  • http://krams915.blogspot.cz/2011/01/spring-3-task-scheduling-via.html

相关内容

  • 没有找到相关文章

最新更新