Данные не сохраняются в mysql при вызове из MessageListener в springboot

#java #spring-boot #jpa #spring-data-redis #message-listener

#java #весенняя загрузка #jpa #spring-data-redis #прослушиватель сообщений

Вопрос:

У меня есть служба, которая обновляет ячейку в MySQL. Служба отлично работает при вызове с контроллера.

Но той же службе не удается сохранить данные при вызове из MessageListener. Мой слушатель выглядит примерно так, как показано ниже

     public class KeySpaceNotificationMessageListener implements MessageListener
{
     @Autowired
     ServiceImpl service;

     @Override
    public void onMessage(Message message, byte[] pattern) 
    {
          if( (data = createPublishData(new String(message.getBody()), new String(message.getChannel()))) != null)
        {
            LOG.info("publishing data to deepstream channel with payload = {}", data);

    }

   private String createPublishData(String messageBody, String messageChannel)
    {
         //find id from message channel
         service.unAssign(id);
         return someString;
    }
}
  

ServiceImpl Метод отмены назначения

 @Override
    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
    public ResponseEntity<String> unAssign(Long Id) 
    {
        Optional<Image> Image = ImageRepository.findById(Id);

        if(!Image.isPresent())
            throw new ResourceNotFoundException("could not find image with id = "   Id);

        Image.get().setAssignedTo(null);

        return new ResponseEntity<String>("Unassign successfull", HttpStatus.OK);
    }
  

Приветствуется любая помощь.

Комментарии:

1. Было бы полезно, если бы мы могли увидеть тело сообщения и его синтаксический анализ, чтобы определить, есть ли какие-либо проблемы с форматированием; также код ServiceImpl, чтобы увидеть, происходит ли там что-нибудь с контекстами транзакций, возможно, возможно, с кодом вашего контроллера; также было бы здорово посмотреть, не возникло ли какое-либо исключение.

2. @PollyShaw С моей стороны не было ошибки. Я все отладил и не обнаружил проблем при разборе сообщений. Но я обновлю с более подробной информацией, если это поможет. Служба сначала находит объект из базы данных, а затем обновляет. Во время отладки я увидел, что служба нашла объект, иначе она вызвала бы исключение ResourceNotFoundException. И после этого все идет безупречно. Но данные не сохраняются. Как вы думаете, это как-то связано с тем, что прослушиватель выполняется в каком-то другом потоке или что-то в этом роде?

3. Код в ServiceImpl не вызывает ImageRepository.save(Изображение). Однако я не уверен, как это работает в вашем контроллере. Вы уверены, что они сохраняются? Возможно, это просто получение несохраненного объекта из репозитория и отображение его.

Ответ №1:

Если внутри вашего класса Image не происходит какой-либо магии, вам нужно вызывать ImageRepository.save(Image.get()) после вызова Image.get().setAssignedTo(null) . Предполагается, что ImageRepository это реализация org.springframework.data.repository.CRUDRepository .

Комментарии:

1. Они сохраняются в более новой версии spring boot. Для подтверждения я попробовал даже с ImageRepository.save(Image.get()) и один раз обновил объект с помощью @DynamicUpdate, но у меня все равно это не сработало.

2. ХОРОШО — я пытаюсь воспроизвести то, что у вас есть, но я не обижусь, если вы понизите голос, чтобы другие с большей вероятностью обратили на вас внимание. Или можете удалить, если хотите.