Springboot синхронизированный метод - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть один метод, который мне нужно запустить синхронизированным (если 10 пользователей вызывают этот метод, первый запускает метод, а остальные 9 ждут, когда он завершает работу, а затем второй выполняет метод и 8 оставшихся ждет ...)

Таким образом, этот метод должен сохранить один регистр в моем postgresql, но мне нужно начать и зафиксировать транзакцию внутри этого метода, поэтому поиск в Интернете я нашел это решение:

@org.springframework.transaction.annotation.Transactional(isolation = Isolation.SERIALIZABLE, propagation = Propagation.REQUIRES_NEW)
private synchronized  Registro gerarRegistro(Protocolo protocolo, List<ServicoCalculado> servicos,String especialidade, LocalDateTime dtRegistro) throws Exception{
    Registro novoRegistro = new Registro();
    //this method executes one method in my service that call a method in my repository with this query -> @Query(value = "SELECT MAX(numero_registro) FROM rtdpj.registro WHERE tp_especialidade = ?1", nativeQuery = true)
    Long ultimoRegistro = this.registroService.findLastRegistro(especialidade);     

    ultimoRegistro++;
    novoRegistro.setEspecialidade(especialidade);
    novoRegistro.setNrPastaPj(protocolo.getPastaPJ());
    novoRegistro.setNumeroRegistro(ultimoRegistro);
    novoRegistro.setRegistro(registroService.gerarRegistro(ultimoRegistro, novoRegistro.getDataRegistro()));
    novoRegistro.setProtocolo(protocolo.getId());
    novoRegistro.setRegistroReferencia(protocolo.getRegistroReferencia());
    novoRegistro.setObjetos(protocolo.getObjetos());
    novoRegistro.setSituacaoAtual(protocolo.getSituacaoAtualRegistro());
    novoRegistro.setObservacao(protocolo.getObservacaoRegistro());
    novoRegistro.setServicos(servicos);
    novoRegistro.setProtocoloCancelamentoIndisponibilidade(protocolo.getProtocoloCancelamentoIndisponibilidade());
    novoRegistro.setProtocoloIndisponibilidade(protocolo.getProtocoloIndisponibilidade());
    novoRegistro.setNatureza(protocolo.getNatureza());
    novoRegistro.setCliente(protocolo.getCliente());
    novoRegistro.setIcGuardaConservacao(protocolo.getIcGuardaConservacao());
    novoRegistro.setIcPossuiSigiloLegal(protocolo.getIcPossuiSigiloLegal());
    novoRegistro.setNumeroRegistroReferencia(protocolo.getNumeroRegistroReferencia());



    return this.registroService.save(novoRegistro);

}

Этолучший способ сделать это?или есть лучший способ?

В моем домене свойство novoRegistro.setNumeroRegistro должно быть последовательным без ваших переходов, поэтому, если я использую SERIAL и в тот момент, когда что-то сохраняет регистр, я потерял следующее значение, и у меня естьсохранить заказ клиента при поступлении ПЕРВЫЙ к IN ПЕРВЫЙ, чтобы получить номер

1 Ответ

0 голосов
/ 19 сентября 2018

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

private synchronized long getNextVal(...){     
  return ultimoRegistro++;
}

Я бы предложил использовать генератор последовательности (может быть создана таблица последовательности), предоставляемая БД, а не подход, который вы используете.В вашем случае: генератор последовательности

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