【问题标题】:How to Cache a Method with two parameters in Spring-Mvc如何在 Spring-Mvc 中缓存具有两个参数的方法
【发布时间】:2019-05-11 20:36:12
【问题描述】:

我想将交易的金额字段转换为另一种货币,我决定使用带有@Cacheable 注释的缓存机制。在这个可缓存的方法中,我调用了一个 rest api 方法来获取货币汇率。根据我将缓存周期设置为 60 秒并始终发送相同的参数,程序为每个即将到来的事务执行可缓存方法范围。

我想查看每分钟的日志或调用不同的参数,因此我使用了 log.error()。

CurrencyConverterService.java

@Service
public class CurrencyConverterService {
    private Logger log = LogManager.getLogger(CurrencyConverterService.class);
    @Autowired
    private ICurrencyService currencyService;

    int counter=0;

    @Cacheable(value = "allCurrency")
    public Float getCurrencyRate(String targetCurrCode, String baseCurrCode){
        log.error("getCurrencyRate called " +targetCurrCode +" - "+baseCurrCode+" - counter "+ counter+" Times");
        counter++;
        Float rate = currencyService.calculateParity(targetCurrCode, baseCurrCode);
        return rate;
    }

    public BigDecimal currencyConverter(Object value, String targetCurrCode, String baseCurrCode){
        float rate;

        if (baseCurrCode.equals(targetCurrCode)){
            rate = 1.0f;
        }else{
            rate = getCurrencyRate(targetCurrCode, baseCurrCode);
        }
        return ((BigDecimal)value).multiply(new BigDecimal(rate));
    }
}

Demo.java

@Service
public class Demo{
    @Autowired
    public ApplicationContext appContext;
    public CurrencyConverterService currencyConverterService;

    public void getCurrencyFromAPI(Object value, String targetCurrCode, String baseCurrCode){
        ....
        currencyConverterService = (CurrencyConverterService) appContext.getBean("currencyConverterService");
        currencyConverterService.currencyConverter(value, targetCurrCode, baseCurrCode);
        ....

    }
}

ehcache.xml

<ehcache
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
        updateCheck="false" monitoring="off" dynamicConfig="true">

    <diskStore path="java.io.tmpdir"/>

    <cache
            name="allCurrency"
            eternal="false"
            maxElementsInMemory="200"
            maxElementsOnDisk="10000"
            timeToIdleSeconds="600"
            timeToLiveSeconds="600"
            overflowToDisk="true"
            diskExpiryThreadIntervalSeconds="86400"
            memoryStoreEvictionPolicy="LFU"/>
</ehcache>

如果我在四分钟内发送 1000 笔交易。我看到下面的输出;

getCurrencyRate calleddd EUR-USD - 计数器 1 次
getCurrencyRate calleddd EUR-USD - 计数器 2 次
...
getCurrencyRate calleddd EUR-USD - 柜台 999 次
getCurrencyRate calleddd EUR-USD - counter 1000 次

但我想看到下面的样子;

getCurrencyRate calleddd EUR-USD - 计数器 1 次
getCurrencyRate calleddd EUR-USD - 计数器 2 次
getCurrencyRate calleddd EUR-USD - 计数器 3 次
getCurrencyRate calleddd EUR-USD - 计数器 4 次

感谢您的帮助。

【问题讨论】:

  • 我不认为多个参数是问题;所有参数都由default 考虑。请分享有关代码的更多详细信息,例如主类以及如何使用此方法

标签: java rest spring-mvc ehcache


【解决方案1】:

我解决了这个问题。如果我像上面一样从同一类中的其他方法调用缓存方法,则不起作用。如果我从其他类直接调用缓存方法,则可以正常工作。我应该像下面这样使用;

Demo.java

@Service
public class Demo{
    @Autowired
    public ApplicationContext appContext;
    public CurrencyConverterService currencyConverterService;

    public void getCurrencyFromAPI(Object value, String targetCurrCode, String baseCurrCode){
        ....
        currencyConverterService = (CurrencyConverterService) appContext.getBean("currencyConverterService");
        currencyConverter(value, targetCurrCode, baseCurrCode);
        ....

    }

    public BigDecimal currencyConverter(Object value, String targetCurrCode, String baseCurrCode){
        float rate;

        if (baseCurrCode.equals(targetCurrCode)){
            rate = 1.0f;
        }else{
            rate = currencyConverterService.getCurrencyRate(targetCurrCode, baseCurrCode);
        }
        return ((BigDecimal)value).multiply(new BigDecimal(rate));
    }

}

CurrencyConverterService.java

@Service
public class CurrencyConverterService {
    private Logger log = LogManager.getLogger(CurrencyConverterService.class);
    @Autowired
    private ICurrencyService currencyService;

    int counter=0;

    @Cacheable(value = "allCurrency")
    public Float getCurrencyRate(String targetCurrCode, String baseCurrCode){
        log.error("getCurrencyRate called " +targetCurrCode +" - "+baseCurrCode+" - counter "+ counter+" Times");
        counter++;
        Float rate = currencyService.calculateParity(targetCurrCode, baseCurrCode);
        return rate;
    }
}

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 2021-11-10
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多