Проблема десериализации с помощью Spring Data Redis с салатом - PullRequest
0 голосов
/ 14 июля 2020

Среда mnet: aix 7.1 Redis 2.6.17 jdk 1.6 Spring-data-commons-1.12.11.RELEASE весна-данные-ключ-значение-1.1.11.RELEASE Весна-данные-Redis-1.7.11 салат-латук-3.5.0.Финал Сервер Redis, работающий на одном хосте с веб-приложениями (клиентами Redis)

Проблема: Я установил следующую конфигурацию RedisTemplate Bean:

@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
    redisTemplate.setConnectionFactory(redisConnectionFactory());
    redisTemplate.setEnableTransactionSupport(true);
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    redisTemplate.sethashKeySerializer(new StringRedisSerializer);
    return redisTemplate;
}

, а также следующий код программы проверки для сервера Redis:

public class ObservableRedisStateChecker implements Runnable {
    ...
    public void run() {
       try {
           Thread.sleep(3000);
           redisTemplate.opfForValue().get("validation");
           notifyObservers(true);
       } catch (Exception e) {
           noifyObservers(false);  // meaning that the Redis' state isn't fine.
       }
    ...
}

Вышеупомянутый ObservableRedisStateChecker периодически проверяет и уведомляет другие экземпляры - состояние сервера Redis. Код обычно работает нормально, но когда делается слишком много запросов, возникает следующая ошибка:

org.springframework.data.redis.serializer.SerializationException: 
Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: 
Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; 
nested exception is java.io.EOFException

Странный момент заключается в том, что когда я запускаю простое тестовое приложение, которое запускает тот же код с указанной выше проверкой код на том же хосте возникает ошибка, в то время как ошибка возникает, тестовое приложение сообщает об отсутствии ошибки. ошибка возникла только в веб-приложениях. Код теста следующий:

...
ExecutorService es = Executors.newCachedThreadPool()
RedisTemplate<String, Obejct> redisTemplate = ...

es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
es.submit(new RedisValidationCheckTest(redisTemplate));
...

Что с ним не так?

1 Ответ

0 голосов
/ 14 июля 2020

Похоже на проблему с сериализацией.

Вы не установили десериализатор для своего значения. Итак, redis использует сериализатор по умолчанию: JdkSerializationRedisSerializer, что совсем не хорошо. Я рекомендую использовать Jackson или просто StringRedisSerializer.

Вероятно, из-за проблем с сетью он получает неполный ответ, а десериализатор jdk не распознает его и жалуется. Добавьте это в свою конфигурацию

redisTemplate.setValueSerializer (new StringRedisSerializer ());

Кроме того, я предлагаю вам изменить код с

redisTemplate.opfForValue (). get ("проверка");

до

redisTemplate.getConnectionFactory (). getConnection (). ping ()

Поскольку последний предназначен для проверки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...