Как обрабатывать транзакции в потоке - PullRequest
0 голосов
/ 27 марта 2020

Я хочу по-настоящему простое требование отправить массовое сообщение брокеру сообщений. Для этого кто-то нажимает на URL, а затем система Asy c начинает отправлять сообщения. Но когда система начинает сборку DTO из объекта Entity, она отправляет несколько сообщений и после запуска выдает исключение GenericJDBCException. Это выглядит как проблема параллелизма из-за прерванной транзакции. Но все это всего лишь операция чтения с использованием представления. За весь этот процесс не происходит ни одной записи. здесь код

. 



@Transactional
public void bullMessage(){
    getPersonList();
}

public List<PersonDTO> getPersonList(){
try (Stream<Person> persons = perservice.getStream()) {
            try {
                persons.forEach(pers -> {

                    try {
                        prepareDTO(jobDomain);

                    } catch (JsonProcessingException | NullPointerException exception) {

                        // Does not stop on exception
                        // keep emitting event for other records
                        return;

                    } catch (Exception exception) {
                        log.error("Failed to convert");
                        return;
                    }

                });
            } catch (PersistenceException ex) {
                log.error("Error on loading entity = [{}]", ex);
            }
        }

}

public PersonDTO prepareDTO(jobDomain){
    another service call 1
    another service call 2
    return pers;
}

, как можно видеть, метод bullMessage является транзакционным, который все метод getPersonList. этот метод извлекает список сущностей Person и затем начинает преобразование в DTO.

Чтобы преобразовать DTO, нет никаких услуг, которые входят в картину. Теперь после нескольких итераций он начинает выдавать исключение, вот код.

org.hibernate.exception.GenericJDBCException: could not extract ResultSet
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:79) ~[hibernate-core-5.1.0.Final.jar:5.1.0.Final]
    at org.hibernate.loader.plan.exec.internal.AbstractLoadPlanBasedLoader.getResultSet(AbstractLoadPlanBasedLoader.java:434) 

Может ли кто-нибудь помочь в этом, так как я мало что знаю об этом.

...