Я видел довольно много примеров с веб-сайтов Инфиниспан и Красная шляпа о добавлении кодировки для ключа и значения кеша, но я не могу сделать это, используя мою текущую конфигурацию.
@Configuration
public class InfinispanConfiguration {
@Bean
public InfinispanRemoteConfigurer infinispanRemoteConfigurer() {
return () -> new ConfigurationBuilder()
.clientIntelligence(ClientIntelligence.TOPOLOGY_AWARE)
.addContextInitializers(new ProductInitializerImpl())
.statistics().enable()
.addServers("localhost:11222; localhost:11322")
.connectionPool().maxActive(10).exhaustedAction(ExhaustedAction.WAIT)
.security()
.authentication()
.username("user")
.password("1")
.realm("default")
.build();
}
@Bean
public InfinispanRemoteCacheCustomizer customizer() {
return builder -> builder.tcpKeepAlive(true);
}
}
Я использую кеш в другом классе, как показано ниже:
@Slf4j
@Component
@RequiredArgsConstructor
public class ProductCache {
private final RemoteCacheManager cacheManager;
public void cacheProducts(Feed feed){
cacheManager.administration().getOrCreateCache("prodCache", DefaultTemplate.INVALIDATION_ASYNC);
RemoteCache<String, Product> cacheProducts = cacheManager.getCache("productsCache");
feed.getProducts()
.getProduct()
.forEach(product -> cacheProducts.putIfAbsent(product.getPid(), product));
log.info("Number of Products are " + feed.getProducts().getProduct().size());
log.info("Number of cached Products are " + cacheProducts.size());
}
}
Я использовал и добавил аннотации Protostream в свои классы.
@AutoProtoSchemaBuilder(
includeClasses = {
Product.class, Facet.class
},
schemaFileName = "product.proto",
schemaFilePath = "build/proto/",
schemaPackageName = "products"
)
public interface ProductInitializer extends SerializationContextInitializer {
}
Я также получаю это предупреждающее сообщение терминала:
WARN (blocking-thread--p3-t2) [org.infinispan.encoding.impl.StorageConfigurationManager] ISPN000599: Configuration for cache 'productsCache' does not define the encoding for keys or values. If you use operations that require data conversion or queries, you should configure the cache with a specific MediaType for keys or values.
Я также заметил, что мой кеш хранит только 1 элемент, независимо от того, сколько продуктов находится в списке! Я также вижу на приборной панели, что есть промах кеша. Я просто не уверен, что эти проблемы как-то связаны.
Любая помощь будет высоко ценится. Спасибо!
Обновлять: Наконец-то я понял, почему в моем кеше была только одна часть данных! Исключительно из-за этой настройки, DefaultTemplate.INVALIDATION_ASYNC
. Он удаляет «устаревшие» данные при изменении кэша. Нашел эту информацию здесь.
Моя единственная оставшаяся проблема - разобраться с кодировкой, которая, как я теперь вижу, отличается, поэтому теперь мой единственный вопрос, поскольку кажется, что я задал два вопроса в одном!
Обновление2: кодировка устанавливается на основе ссылки, которую я предоставил в своем ответе ниже. Я только сейчас получаю эту ошибку ниже:
После борьбы с этим в течение нескольких дней я полностью изменил способ настройки и удалил конфигурацию в стиле лямбда, так как было сложно включить конфигурацию кодирования.
Я следовал этому руководство и просто объявил два метода конфигурации как компоненты Spring! Теперь он легко устанавливает кодировку!
Ответ на Обновление2: После добавления этих строк в конфигурацию билдера:
.marshaller(new ProtoStreamMarshaller())
.addContextInitializers(new ProductInitializerImpl())
.addJavaSerialAllowList("com.person.model.*")
Не забудьте добавить файл Proto, сгенерированный плагином процессора аннотаций ProtoStream, на панель инструментов, иначе вы получите то же сообщение об ошибке, что и в моем обновленном вопросе!