我有几个服务类(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