Отдельная сделка на Java весна - PullRequest
1 голос
/ 08 апреля 2020

Я не совсем уверен, как это сделать. Но я нахожу способ разделить транзакции функций.

У меня есть прослушиватель, который обрабатывает результаты каждого сообщения (messageListener). И прежде чем отправить его на следующий шаг (sendToNextProcess), я бы хотел убедиться, что первая транзакция (updateMessagesResults) прошла успешно. (Возможно, создать отдельную транзакцию?)

Как мне сделать это на Java Spring? Спасибо

public void messageListener(List<Message> messages) {
    resultUpdater.updateMessagesResults(messages);
    sendToNextProcess(messages);
}

Примечание: и слушатель, и resultUpdater имеют аннотации @Transactional.

Спасибо!

1 Ответ

1 голос
/ 08 апреля 2020

Добавьте REQUIRES_NEW на sendToNextProcess и updateMessagesResults

и не вызывайте sendToNextProcess напрямую, потому что это не сработает, вы должны добавить текущую услугу и вызвать ее вот так

@Service
public CurrentService {
    @Autowire
    CurrentService CurrentService;  

    @Transactional
    public void messageListener(List<Message> messages) {
        resultUpdater.updateMessagesResults(messages);
        currentService.sendToNextProcess(messages);
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void sendToNextProcess(List<Message> messages) {

    }
}

почему вы должны вызывать его из внедренного сервиса, потому что @transactional пытается обернуть его извне области видимости класса, а затем пытается вызвать его с this, и он не будет работать так, как вы ожидаете

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