MessageListener не разрешает транзакции с БД - PullRequest
0 голосов
/ 08 мая 2020

После прослушивания сообщения успешно пытается сохранить данные в Postgres БД, которая не работает. Однако то же сохранение JPA работает, если мы вызываем через HTTP-запрос или метод планировщика.

@Configuration
@EnableScheduling
public class RedisConfig {

    @Bean
    LettuceConnectionFactory lettuceConnectionFactory() {
        return new LettuceConnectionFactory();
    }

    @Bean
    RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(lettuceConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        template.setEnableTransactionSupport(true);
        return template;
    }

    @Bean
    MessageListenerAdapter messageListener() {
        return new MessageListenerAdapter(new RedisMessageListener());
    }

    @Bean
    RedisMessageListenerContainer redisContainer() {
        final RedisMessageListenerContainer container = new RedisMessageListenerContainer();

        container.setConnectionFactory(lettuceConnectionFactory());
        container.addMessageListener(messageListener(), topic());

        return container;
    }

    @Bean
    MessagePublisher redisPublisher() {
        return new RedisPublisherImpl(redisTemplate(), topic());
    }

    @Bean
    ChannelTopic topic() {
        return new ChannelTopic("pubsub:queue");
    }

}

Вызов сохранения репозитория, вызываемый в этом классе прослушивателя для сохранения в Postgres

 public class RedisMessageListener implements MessageListener {
    @Autowired
    TestRepo testRepo;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        System.out.println("Message received: " + message.toString());
        TestEntity test = new TestEntity();
        test.setName("RedisMessageListener invoke");
        testRepo.save(test);
        System.out.println("data saved ");
    }

}

Журналы:

Получено сообщение: Сообщение 2, планирование -1 2020-05-08 12: 03: 01.596 ОШИБКА 18164 --- [edisContainer-3] osdrlaMessageListenerAdapter: выполнение прослушивателя не удалось

...