0

我有几个服务类(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 触发器或其他技术来做到这一点?

感谢您的任何建议。

4

1 回答 1

0

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

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());
}

loadCustomerAgreements()如果有可用的空闲线程,这将在不同的线程中运行方法。

有关更多信息,请参阅:

于 2013-02-18T11:25:57.370 回答