#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. ХОРОШО — я пытаюсь воспроизвести то, что у вас есть, но я не обижусь, если вы понизите голос, чтобы другие с большей вероятностью обратили на вас внимание. Или можете удалить, если хотите.