Spring JPA Не извлекает последнюю запись из базы данных

У меня есть метод, который обновляет базу данных с помощью ссылочного номера пользователя, а затем у меня есть механизм повторной попытки Spring, чтобы повторить попытку и проверить, обновлена ​​ли запись пользователя с помощью ссылочного номера. Но повторный вызов не извлекает последнюю запись из базы данных. У меня нет проблем с обновлением записи, но только с выборкой, она не извлекает последнюю обновленную запись.

Шаблон повторной попытки пользователя



@Component
public class UserRetryTemplate {


    @Value("${retry.max.attempts:5}")
    private int maxAttempts;

    @Value("${response.waiting.time.in.seconds:60}")
    private long maxDelay;

    @Autowired
    private UserRepository userRepository;

    private static final long INITIAL_INTERVAL = 2000L;

    public RetryTemplate retryTemplate() {

        // Max timeout in milliseconds
        long maxTimeout = maxDelay*1000;

        //double multiplier = (maxTimeout - INITIAL_INTERVAL)/((maxAttempts-2)*6000);

        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(maxAttempts);


        FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
        backOffPolicy.setBackOffPeriod(maxTimeout/(maxAttempts-1));

        RetryTemplate template = new RetryTemplate();
        template.setRetryPolicy(retryPolicy);
        template.setBackOffPolicy(backOffPolicy);
        return template;
    }

    public boolean doUserReferenceRetry(String userId) {
        boolean isUserReferenceValid = true;
        try {
            boolean isValidUser = retryTemplate().execute(context -> {
                logger.info("Attempted {} times", context.getRetryCount());
                User user = userRepository.findByUserName(userId);
                logger.info("User Retry :" + user);

                if (user.getResponseDateItem() == null || user.getReferenceNumber == null) {
                    logger.info("response not yet received");
                    throw new IllegalStateException("User Response not yet received");
                }
                if (user.getReferenceNumber != null)) {
                    return true;
                }
                throw new IllegalStateException("Response not yet received");
            });
            return isUserReferenceValid ;
        } catch (IllegalArgumentException e) {

        }
        return true;
    }

}

UserRepository.java

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    User findByUserName(String userName);

}

UserManagerImpl

public void updateReference(String userId, String referenceNumber) {

        User user = userRepository.findById(userId);
        if (user != null) {
            user.setReference(referenceNumber);
            user.setResponseDate(DateHelper.createXMLGregorianCalendar());
            userRepository.saveAndFlush(user);
        }
    }

Очередь при обработке ответа обновляет referenceNumber для пользователя в БД (который работает нормально)

UserQueueClient:

@Component
public class UserQueueClient {



    @JmsListener(id = "#{T(java.util.UUID).nameUUIDFromBytes('${in.res}",
            destination = "${in.res}", containerFactory = "containerFactory")
    public void receive(Message message, UserEnvelopeV1_0 envelope) throws{


        try {
            String userId = envelope.getHeader().getMessageIdentification().getUserId();
 ApplicationInformationStructure applicationInformation = envelope.getBody().getApplicationInformation();

if(CollectionUtils.isNotEmpty(applicationInformation.getApplicationInformationResult())) {
          String referenceNumber = applicationInformation.getApplicationInformationResult().getRefNumber();      

                userManager.updateReference(userId, referenceNumber);
            }

        } catch (Exception e) {
            //
        }
    }


}

Таким образом, есть другой процесс, который обновляет ссылочный номер, который работает нормально и обновляет БД со значением. Но чтение (из шаблона повторной попытки) не извлекает обновленную запись.


person Dev    schedule 03.04.2020    source источник
comment
Вам нужно сохранить объект.   -  person Patrick Santana    schedule 03.04.2020
comment
Я сохраняю объект другим методом, о котором не упоминал. Этот код, который я добавил, является только частью выборки.   -  person Dev    schedule 03.04.2020
comment
@Jens Schauder, это не связано с вопросом, который вы упомянули. Вы должны внимательно прочитать вопрос, прежде чем закрывать его. Вопрос, который вы отправили, связан с тем, что обновление не происходит должным образом. Мой вопрос не о том, что обновление не происходит. Речь идет о выборке, которая не происходит так, как я этого хочу. Итак, это 2 разные проблемы. Не могли бы вы снова открыть его   -  person Dev    schedule 03.04.2020
comment
Это та же проблема. Обновление работает так же хорошо, как и в вашем случае. Просто EntityManager не обновляет объекты, уже находящиеся в кеше первого уровня. Сначала вам нужно вытеснить объекты или использовать refresh или новый EntityManager. Пожалуйста, не думайте, что я не прочитал вопросы, прежде чем закрыть их.   -  person Jens Schauder    schedule 03.04.2020
comment
Я добавил еще один ответ на указанный вопрос, который может облегчить понимание ситуации.   -  person Jens Schauder    schedule 03.04.2020