Galera,
estou com o seguinte problema de concorrência.
Tentamos assinar toda o método com o synchronized (sei que nao é a melhor forma, pois honera muito o processamento) mas mesmo assim não funciona. As duas chamadas estão entrando ao mesmo tempo e embaralhando o array de indices que estava sendo formado. E assim acabo numa exception do tipo IndexOutOfBound.
Para tentar melhorar a perfomance tentei criar alguns blocos de synchronized nas regiões que considerava críticas.
Esse é uma parte do código um dos métodos que estamos tentando sincronizar.
public boolean gerarXML() {
listaGuias = null;
numeroLote = "";
String codigo = "";
String tipoGuia = "";
String numerofatura = "";
TissGuiaLote guiaLote = null;
FuncsDBBean funcs = null;
try {
sql = " select mi.cod_internamento codigo, f.cod_fatura,
f.tip_fatura, f.num_nf,"
+" case when (i.tip_internamento = 'E' and
i.cod_local in (104,158) and i.tip_consulta in ('P','S')) then"
+" 'CONSULTA_INTERNO'"
+" else case when (i.tip_atendimento in
('T','P','E','N','A','H')) then"
+" 'SADT_INTERNO'"
+" else "
+" 'RESUMO_INTERNACAO'"
+" end"
+" end tipo_guia"
+" from fatura f,"
+" marca_inter mi,"
+" internamento i,"
+" nota_fiscal_fatura nff"
+" where"
+" f.cod_fatura in ("+retornaCodFaturas()+")"
+" and mi.cod_fatura = f.cod_fatura"
+" and i.cod_internamento = mi.cod_internamento"
+" and nff.num_nf = f.num_nf"
+" and f.tip_fatura = 'I'"
+" union all"
+" select distinct ir.cod_requisicao codigo,
f.cod_fatura, f.tip_fatura, f.num_nf,"
+" case when (r.tip_atendimento in ('P','S','N'))
then "
+" 'CONSULTA_EXTERNO'"
+" else "
+" 'SADT_EXTERNO'"
+" end tipo_guia"
+" from fatura f,"
+" item_requisicao ir,"
+" requisicao r,"
+" nota_fiscal_fatura nff"
+" where"
+" f.cod_fatura in ("+retornaCodFaturas()+")"
+" and ir.cod_fatura = f.cod_fatura"
+" and r.cod_requisicao = ir.cod_requisicao"
+" and nff.num_nf = f.num_nf"
+" and f.tip_fatura = 'E'"
+" order by codigo";
rs=stmt.executeQuery(sql);
listaGuias = new ArrayList();
funcs = new FuncsDBBean();
while(rs.next()) {
if(rs.isFirst()) {
num_nf = rs.getString("NUM_NF");
}
codigo = rs.getString("CODIGO");
tipoGuia = rs.getString("TIPO_GUIA");
numerofatura = rs.getString("COD_FATURA");
if(tipoGuia.equalsIgnoreCase("RESUMO_INTERNACAO")) {
if (funcs.isInternamentoPacotePPP(codigo)) {
tipoGuia =
"RESUMO_INTERNACAO_PACOTE_PPP";
} else {
if(funcs.isInternamentoPacote(codigo)) {
tipoGuia =
"RESUMO_INTERNACAO_PACOTE";
} else {
tipoGuia =
"RESUMO_INTERNACAO_NORMAL";
}
}
}
guiaLote = new TissGuiaLote();
guiaLote.setCodigo(codigo);
guiaLote.setEstrategia(TissTipoGuiaLoteV20103.obterEstrategiaPorTipoGuia(tip
oGuia));
guiaLote.setTipoGuia(TissTipoGuiaLoteV20103.obterTipoGuiaTiss(tipoGuia));
guiaLote.setTipoConta(TissTipoGuiaLoteV20103.obterTipoContaPorTipoGuia(tipoG
uia));
guiaLote.setNumeroFatura(numerofatura);
listaGuias.add(guiaLote);
}
List listaInformacoesGuias = new ArrayList();
String[] parametrosQuery = null;
Iterator itListaGuias = listaGuias.iterator();
while (itListaGuias.hasNext()) {
guiaLote = (TissGuiaLote) itListaGuias.next();
if(guiaLote.getEstrategia() instanceof
EstrategiaConstrucaoGuiaConsultaAB) {
parametrosQuery = new
String[]{guiaLote.getCodigo()};
InformacoesGuiaConsulta infoGuiaConsulta =
TemplateInformacoesGuiasV20103.getInformacoesGuiaConsulta();
setInformacoesPersonalizadasGuiaConsulta(cod_equipe_empresa,
infoGuiaConsulta);
infoGuiaConsulta.setEstrategia(guiaLote.getEstrategia());
infoGuiaConsulta.setParamQueryIdentificacaoGuia(parametrosQuery);
infoGuiaConsulta.setParamQueryDadosBeneficiario(parametrosQuery);
infoGuiaConsulta.setParamQueryDadosContratado(parametrosQuery);
infoGuiaConsulta.setParamQueryProfissionalExecutante(parametrosQuery);
infoGuiaConsulta.setParamQueryHipoteseDiagnostica(parametrosQuery);
infoGuiaConsulta.setParamQueryDadosAtendimento(parametrosQuery);
infoGuiaConsulta.setParamQueryDadosAvulsos(parametrosQuery);
listaInformacoesGuias.add(infoGuiaConsulta);
} else {
if(guiaLote.getEstrategia() instanceof
EstrategiaConstrucaoGuiaSPSADTAB) {
parametrosQuery = new
String[]{guiaLote.getCodigo()};
InformacoesGuiaSPSADT infoGuiaSPSADT =
TemplateInformacoesGuiasV20103.getInformacoesGuiaSPSADT();
setInformacoesPersonalizadasGuiaSPSADT(cod_equipe_empresa, infoGuiaSPSADT);
infoGuiaSPSADT.setEstrategia(guiaLote.getEstrategia());
infoGuiaSPSADT.setParamQueryIdentificacaoGuiaSADTSP(parametrosQuery);
infoGuiaSPSADT.setParamQueryDadosAutorizacao(parametrosQuery);
infoGuiaSPSADT.setParamQueryDadosBeneficiario(parametrosQuery);
infoGuiaSPSADT.setParamQueryDadosSolicitante(parametrosQuery);
infoGuiaSPSADT.setParamQueryPrestadorExecutante(parametrosQuery);
infoGuiaSPSADT.setParamQueryDiagnosticoGuia(parametrosQuery);
infoGuiaSPSADT.setParamQueryProcedimentosRealizados(parametrosQuery);
infoGuiaSPSADT.setParamQueryEquipePorProcedimento(parametrosQuery);
infoGuiaSPSADT.setParamQueryOutrasDespesas(parametrosQuery);
infoGuiaSPSADT.setParamQueryOPMUtilizada(parametrosQuery);
infoGuiaSPSADT.setParamQueryDadosAvulsos(parametrosQuery);
listaInformacoesGuias.add(infoGuiaSPSADT);
} else {
if(guiaLote.getEstrategia() instanceof
EstrategiaConstrucaoGuiaResumoInternacaoAB) {
parametrosQuery = new
String[]{guiaLote.getCodigo()};
InformacoesGuiaResumoInternacao
infoGuiaResumoInternacao =
TemplateInformacoesGuiasV20103.getInformacoesGuiaResumoInternacao();
setInformacoesPersonalizadasGuiaResumoInternacao(cod_equipe_empresa,
infoGuiaResumoInternacao);
infoGuiaResumoInternacao.setEstrategia(guiaLote.getEstrategia());
infoGuiaResumoInternacao.setParamQueryIdentificacaoGuiaResumoInternacao(para
metrosQuery);
infoGuiaResumoInternacao.setParamQueryDadosBeneficiario(parametrosQuery);
infoGuiaResumoInternacao.setParamQueryIdentificacaoExecutante(parametrosQuer
y);
infoGuiaResumoInternacao.setParamQueryDadosAutorizacao(parametrosQuery);
infoGuiaResumoInternacao.setParamQueryInternacaoObstetrica(parametrosQuery);
infoGuiaResumoInternacao.setParamQueryDeclaracoesNascidosVivos(parametrosQue
ry);
infoGuiaResumoInternacao.setParamQueryDiagnosticoSaidaInternacao(parametrosQ
uery);
infoGuiaResumoInternacao.setParamQueryProcedimentosRealizados(parametrosQuer
y);
infoGuiaResumoInternacao.setParamQueryEquipePorProcedimento(parametrosQuery)
;
infoGuiaResumoInternacao.setParamQueryOPMUtilizada(parametrosQuery);
infoGuiaResumoInternacao.setParamQueryOutrasDespesas(parametrosQuery);
infoGuiaResumoInternacao.setParamQueryDadosAvulsos(parametrosQuery);
listaInformacoesGuias.add(infoGuiaResumoInternacao);
}
}
}
}
sql = "select sec_tiss_envio_lote.nextval num_lote from
dual";
rs = stmt.executeQuery(sql);
if(rs.next()) {
numeroLote = rs.getString("NUM_LOTE");
}
TissVersaoAtualV20103.setVersaoAtual();
BuilderLoteGuiasTISSAdapterV20103 builder = new
BuilderLoteGuiasTISSAdapterV20103(numeroLote,listaInformacoesGuias);
InformacoesCabecalhoTransacao infoCabecalhoTransacao =
TemplateInformacoesGuiasV20103.getInformacoesCabecalhoTransacao();
setInformacoesPersonalizadasCabecalhoTransacao(cod_equipe_empresa,
infoCabecalhoTransacao);
infoCabecalhoTransacao.setParamQueryCabecalhoTransacao(new
String[]{cod_prestador_operadora,cod_equipe_empresa});
DiretorMensagemTISS diretor = new
DiretorMensagemTISS(builder, infoCabecalhoTransacao, con, caminhoAplicacao);
synchronized (diretor) {
diretor.contruirMensagemTISS();
}
System.out.println("Gerando arquivo xml...");
File arquivoXml =
GeradorXML.gerarXML(builder.getMensagemTISS());
arq = "transmissao/" +
builder.getMensagemTISS().getCabecalho().getDestino().getRegistroANS() +
"/" + arquivoXml.getName();
System.out.println("Arquivo gerado com sucesso!!");
String[] dataRegistroTransacao =
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getData
RegistroTransacao().split("/");
String data = dataRegistroTransacao[0];
String mes = dataRegistroTransacao[1];
String ano = dataRegistroTransacao[2];
String[] horaRegistroTransacao =
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getHora
RegistroTransacao().split(":");;
String horas = horaRegistroTransacao[0];
String minutos = horaRegistroTransacao[1];
sql = "insert into tiss_transacao values ("+
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getSequ
encialTransacao().longValue() +", "
+ 1 +", to_date(('"+ data
+"/"+ mes
+"/"+ ano
+"' || ' ' || '"+ horas
+":"+ minutos
+"'), 'DD/MM/RRRR HH24:MI'), '"+
builder.getMensagemTISS().getCabecalho().getDestino().getRegistroANS()
+"', '"+ arquivoXml.getAbsolutePath() +"','')";
stmt.executeUpdate(sql);
sql = " insert into tiss_envio_lote_empresa "
+" values ("+ numeroLote +", "
+
builder.getMensagemTISS().getCabecalho().getIdentificacaoTransacao().getSequ
encialTransacao().longValue()+ ", '"
+ num_nf + "', " + cod_equipe_empresa + ", '" +
tipo_fatura + "')";
stmt.executeUpdate(sql);
System.out.println("O registro do arquivo enviado foi
inserido com sucesso.");
} catch (Exception e) {
if(e.getMessage().indexOf("Não se pode colocar em um lote
de guias de faturamento mais de um tipo de guia de faturamento") != -1) {
guiasDistintas = true;
}
log("Erro em EnvioLoteTISSV20103:gerarXML()
"+e.getMessage()+"SQL: "+sql);
return false;
}
return true;
}
Tentei tratar com blocos de synchronized dentro deste método que é minha região critica de verdade onde ele embaralha o indice e me encerra o processamento.
protected final void buildEquipePorProcedimento() throws
TissConstrucaoException {
Statement stmt = null;
ResultSet rs = null;
try {
if(listaDadosProcedimentos.size() != 0) {
if(FuncoesGerais.queryNaoENula(getQueryEquipePorProcedimento(infoGuiaResumoI
nternacao.getParamQueryEquipePorProcedimento(),listaDadosProcedimentos.get(0
)), false)
&&
FuncoesGerais.naoENulo(infoGuiaResumoInternacao.getParamQueryEquipePorProced
imento())) {
int indice = 0;
for (DadosProcedimento dadosProcedimento :
listaDadosProcedimentos) {
stmt = builder.conexao.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
rs =
stmt.executeQuery(getQueryEquipePorProcedimento(infoGuiaResumoInternacao.get
ParamQueryEquipePorProcedimento(), dadosProcedimento));
CtProcedimentoRealizadoEquipe.Procedimentos procedimento = null;
synchronized (this) {
procedimento =
guiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get(ind
ice);
}
while(rs.next()) {
if(rs.isFirst()) {
procedimento.setEquipe(new
CtIdentificacaoEquipe());
}
CtIdentificacaoEquipe.MembroEquipe
membroEquipe = new CtIdentificacaoEquipe.MembroEquipe();
membroEquipe.setCodigoProfissional(new CtIdentificacaoPrestadorEquipe());
if(FuncoesGerais.naoENulo(infoGuiaResumoInternacao.getProcedimentosRealizado
s().getProcedimentos().getEquipe().getMembroEquipe().getCodigoProfissional()
.getConselhoProfissional())) {
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getConselhoProfissional()
.getSiglaConselho(), true)) {
membroEquipe.getCodigoProfissional().getConselhoProfissional().setSiglaConse
lho(StConselhoProfissional.fromValue(FuncoesGerais.removerEspacosEmBranco(
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getConselhoP
rofissional().getSiglaConselho()))));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getConselhoProfissional()
.getNumeroConselho(), true)) {
membroEquipe.getCodigoProfissional().getConselhoProfissional().setNumeroCons
elho(FuncoesGerais.removerEspacosEmBranco(
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getConselhoP
rofissional().getNumeroConselho())));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getConselhoProfissional()
.getUfConselho(), true)) {
membroEquipe.getCodigoProfissional().getConselhoProfissional().setUfConselho
(StUF.fromValue(FuncoesGerais.removerEspacosEmBranco(
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getConselhoP
rofissional().getUfConselho()))));
}
} else {
if(FuncoesGerais.naoENulo(infoGuiaResumoInternacao.getProcedimentosRealizado
s().getProcedimentos().getEquipe().getMembroEquipe().getCodigoProfissional()
.getCpf())) {
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getCpf(), true)) {
membroEquipe.getCodigoProfissional().setCpf(FuncoesGerais.removerEspacosEmBr
anco(
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getCpf())));
}
} else {
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCodigoProfissional().getCodigoPrestadorNaOpera
dora(), true)) {
membroEquipe.getCodigoProfissional().setCodigoPrestadorNaOperadora(FuncoesGe
rais.removerEspacosEmBranco(
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getCodigoProfissional().getCodigoPre
stadorNaOperadora())));
}
}
}
membroEquipe.setIdentificacaoProfissional(new CtProfissionalExecutante());
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getNomeExecutante(),
false)) {
membroEquipe.getIdentificacaoProfissional().setNomeExecutante(FuncoesGerais.
removerEspacosEmBranco(
rs.getString(infoGuiaResumoInternacao.getProcedimentosRealizados().getProced
imentos().getEquipe().getMembroEquipe().getIdentificaoProfissional().getNome
Executante())));
}
membroEquipe.getIdentificacaoProfissional().setConselhoProfissional(new
CtConselhoProfissional());
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getConselhoProfissio
nal().getSiglaConselho(), true)) {
membroEquipe.getIdentificacaoProfissional().getConselhoProfissional().setSig
laConselho(StConselhoProfissional.fromValue(
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getConselhoProfissional().getSiglaConselho()))
));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getConselhoProfissio
nal().getNumeroConselho(), true)) {
membroEquipe.getIdentificacaoProfissional().getConselhoProfissional().setNum
eroConselho(
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getConselhoProfissional().getNumeroConselho())
));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getConselhoProfissio
nal().getUfConselho(), true)) {
membroEquipe.getIdentificacaoProfissional().getConselhoProfissional().setUfC
onselho(StUF.fromValue(
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getConselhoProfissional().getUfConselho()))));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getIdentificaoProfissional().getCodigoCbos(),
false)) {
membroEquipe.getIdentificacaoProfissional().setCodigoCBOS(
FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGuiaResumoInternacao.g
etProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe()
.getIdentificaoProfissional().getCodigoCbos())));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getCpf(), false)) {
membroEquipe.setCpf(FuncoesGerais.removerEspacosEmBranco(rs.getString(infoGu
iaResumoInternacao.getProcedimentosRealizados().getProcedimentos().getEquipe
().getMembroEquipe().getCpf())));
}
if(FuncoesGerais.valorNaoENulo(rs,
infoGuiaResumoInternacao.getProcedimentosRealizados().getProcedimentos().get
Equipe().getMembroEquipe().getPosicaoProfissional(), true)) {
membroEquipe.setPosicaoProfissional(rs.getString(infoGuiaResumoInternacao.ge
tProcedimentosRealizados().getProcedimentos().getEquipe().getMembroEquipe().
getPosicaoProfissional()));
}
procedimento.getEquipe().getMembroEquipe().add(membroEquipe);
}
synchronized (this) {
indice = indice + 1;
}
}
}
}
} catch (Exception e) {
throw new
TissConstrucaoException(this.getClass().getSimpleName(),
"buildEquipePorProcedimento" ,"getQueryEquipePorProcedimento",
infoGuiaResumoInternacao.getParamQueryEquipePorProcedimento(),
e.getMessage());
} finally {
try {
if ( stmt != null ) {
stmt.close();
}
if ( rs != null ) {
rs.close();
}
} catch (Exception e) {
throw new
TissConstrucaoException(this.getClass().getSimpleName(),
"buildEquipePorProcedimento" ,"getQueryEquipePorProcedimento",
infoGuiaResumoInternacao.getParamQueryEquipePorProcedimento(),
e.getMessage());
}
}
}
Se alguém puder me dar uma luz ou me mostrar o ponto onde estou falhando. Pois o syncronized não está surtindo efeito, ele entra com as duas solicitões mesmo que eu assine o método com o synchronized e ocorre tudo que já expliquei aqui. :shock:
Abraços a todos.