アプリケーションの一部をリファクタリングした後、キャッシュされたメソッドを含むクラスは変更されていませんが、Spring cacheable でアノテーションが付けられたメソッドはキャッシュされなくなりました。
いくつかのデバッグの後、リファクタリングしていくつかの新しい Spring Bean を追加した後、cachable メソッドを持つ Bean が internalCacheAdvisor 自体と同じバッチで作成されていることがわかります。したがって、アドバイスを適用することはできず、Spring キャッシュ アスペクトは呼び出されません。そのため、メソッドの結果はキャッシュされず、 @Cachable アノテーションは機能しません。
同時に作成できる Bean を決定するメカニズムは何ですか? また、このメカニズムをデバッグして影響を与えるにはどうすればよいですか?
Spring メソッド BeanFactoryAdvisorRetrievalHelper::findAdvisorBeans を調べたところ、古くて機能しているコードを実行すると、次のようになります。
リファクタリング後は次のようになります。
私たちの注釈付きクラスcouchbaseTranslationProviderは、internalCacheAdvisorと同じバッチで作成されますが、これは不可能です。アドバイス プロキシを適用しようとすると、「現在作成されているアドバイザーをスキップしています ...」というデバッグ メッセージが表示されます。(これはエラーメッセージであるべきだったと思います!)
キャッシュを有効にする POM ファイルは次のようになります。
@Configuration
@EnableWebMvc
@ComponentScan({"[package]", "[package].connectors"})
@Import({EventsConfig.class,
CmsConfig.class})
@EnableCaching
public class ApiConfig {
public static class Caches{
public static final String SPORTS = "sports";
[...]
public static final String PIPEDTRANSLATIONS = "translations";
}
@Value("${[package].document}")
private String someUrl;
@Bean
public CouchbaseClient getCouchbaseClient() throws IOException {
[code]
}
@Bean
public CacheManager cacheManager() {
SimpleCacheManager cacheManager = new SimpleCacheManager();
cacheManager.setCaches(Arrays.asList(new ConcurrentMapCache(Caches.SPORTS),
[...],
new ConcurrentMapCache(Caches.PIPEDTRANSLATIONS)));
return cacheManager;
}
@Autowired
private EventUpdateGate eventUpdateGate;
@Bean
@ConditionalOnProperty("AdapterGate.events.active")
public AdapterGateReceiver eventAdapterGateReceiver(@Value("${AdapterGate.events.gateChannel}") String channel,
@Value("${AdapterGate.events.apiVersion}") String version) {
return new AdapterGateReceiver(channel, version, eventUpdateGate);
}
}