Problema de mais de uma pessoa acessar o sistema [RESOLVIDO]

13 respostas
P

Pessoal,

Tenho um sistema onde se faz upload de arquivos, e consultas através de dados em arquivos…

Eu queria saber como faz para que mais de uma pessoa possa acessar o sistema sem dar erro no java… por exemplo, duas pessoas fazendo consultas ou carregando arquivos…

tem a tela JSP, que enviará para um servlet específico o arquivo, este passará por algumas validações em classe, depois vai na DAO pega os dados, e retorna para classe para gerar arquivo de excel ou simplesmente mostra na tela de volta.

O erro se da quando chega na classe de criar excel, onde ele mistura os dois resultados e da erro…:

jxl.read.biff.BiffException: The input file was not found
	at jxl.read.biff.File.<init>(File.java:124)
	at jxl.Workbook.getWorkbook(Workbook.java:221)
	at jxl.Workbook.getWorkbook(Workbook.java:198)
	at br.com.simcard.CriarExcel.CriarPlanilhaColetivaNew(CriarExcel.java:784)
	at br.com.simcard.dao.PlanilhaColetivaDAO.pesquisaSimCardCL(PlanilhaColetivaDAO.java:255)
	at br.com.simcard.VerificarRegistroConsultaColetiva.Verificador(VerificarRegistroConsultaColetiva.java:147)
	at br.com.simcard.VerificarRegistroConsultaColetiva.<init>(VerificarRegistroConsultaColetiva.java:201)
	at br.com.simcard.UploadConsultaColetiva.anexos(UploadConsultaColetiva.java:43)
	at servlet.br.com.simcard.ServletUploadConsultaColetiva.doPost(ServletUploadConsultaColetiva.java:152)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)





Meu método é esse...


public void CriarPlanilhaColetivaNew(String dispositivoCL, String simCardCL, String linhaCL, String erro, String dispositivo, String codTecnologia,
			String apnConfigurada, String simCard, String linha,
			String operadora, String apnProvisionada, String statusSIMCard,
			String fonte, String imei, String imsi, String statusLinha,
			String consDados, String matricula, String chamado, HttpServletResponse response)
			throws Exception, IOException, BiffException,
			ClassNotFoundException, SQLException {

		// FORMATANDO FONTE
		// Adicionando formato de fonte no título... se adicionar ", true"
		// depois de bold adiciona Italico
		WritableFont bold = new WritableFont(WritableFont.ARIAL, 10,
				WritableFont.BOLD);
		bold.setColour(Colour.WHITE);
		WritableCellFormat arial10font = new WritableCellFormat(bold);
		arial10font.setBackground(Colour.BLUE);
		arial10font.setAlignment(Alignment.CENTRE);
		arial10font.setBorder(Border.ALL, BorderLineStyle.MEDIUM, Colour.BLACK);

		// Adicionando formato de fonte resultados... se adicionar ", true"
		// depois de bold adiciona Italico
		WritableFont bold2 = new WritableFont(WritableFont.ARIAL, 10);
		WritableCellFormat arial10fontResult = new WritableCellFormat(bold2);
		arial10fontResult.setAlignment(Alignment.CENTRE);
		arial10fontResult.setBorder(Border.ALL, BorderLineStyle.THIN,
				Colour.BLACK);

		NomeArquivoExcel arquivoExcel = new NomeArquivoExcel();
		File filename = arquivoExcel.NomeExcel();

		File filename2 = new File(filename.toString());

		if (!filename2.exists()) {

			// Instanciando a classe q gera o novo arquivo do Excel
			WritableWorkbook workbook = Workbook.createWorkbook(new File(
					filename.toString()));

			// Criando uma nova planilha
			WritableSheet sheet = workbook.createSheet("Resultado 0", 0);

			// col, lin Consultado
			Label labelTitulo0 = new Label(0, 0, "Dispositivo Consultado", arial10font);
			sheet.addCell(labelTitulo0);

			Label labelTitulo1 = new Label(1, 0, "SIMCard Consultado", arial10font);
			sheet.addCell(labelTitulo1);

			Label labelTitulo2 = new Label(2, 0, "Linha Consultado", arial10font);
			sheet.addCell(labelTitulo2);
			
			
			Label labelTitulo3 = new Label(3, 0, "ERRO", arial10font);
			sheet.addCell(labelTitulo3);
			
			// col, lin
			Label labelTitulo4 = new Label(4, 0, "Dispositivo", arial10font);
			sheet.addCell(labelTitulo4);

			Label labelTitulo5 = new Label(5, 0, "SIMCard", arial10font);
			sheet.addCell(labelTitulo5);

			Label labelTitulo6 = new Label(6, 0, "Linha", arial10font);
			sheet.addCell(labelTitulo6);

			Label labelTitulo7 = new Label(7, 0, "Tecnologia", arial10font);
			sheet.addCell(labelTitulo7);

			Label labelTitulo8 = new Label(8, 0, "APN Configurada", arial10font);
			sheet.addCell(labelTitulo8);

			Label labelTitulo9 = new Label(9, 0, "Operadora", arial10font);
			sheet.addCell(labelTitulo9);

			Label labelTitulo10 = new Label(10, 0, "APN Provisionada",
					arial10font);
			sheet.addCell(labelTitulo10);

			Label labelTitulo11 = new Label(11, 0, "Status SIMCard", arial10font);
			sheet.addCell(labelTitulo11);

			Label labelTitulo12 = new Label(12, 0, "Fonte", arial10font);
			sheet.addCell(labelTitulo12);

			Label labelTitulo13 = new Label(13, 0, "IMEI", arial10font);
			sheet.addCell(labelTitulo13);

			Label labelTitulo14 = new Label(14, 0, "IMSI", arial10font);
			sheet.addCell(labelTitulo14);

			Label labelTitulo15 = new Label(15, 0, "Status Linha", arial10font);
			sheet.addCell(labelTitulo15);

			Label labelTitulo16 = new Label(16, 0, "Consumo de Dados",
					arial10font);
			sheet.addCell(labelTitulo16);

			Label labelTitulo17 = new Label(17, 0, "Matrícula", arial10font);
			sheet.addCell(labelTitulo17);
			
			Label labelTitulo18 = new Label(18, 0, "Chamado", arial10font);
			sheet.addCell(labelTitulo18);

			int i = sheet.getRows();

			// col, lin consultado
			Label label0 = new Label(0, i, dispositivoCL, arial10fontResult);
			sheet.addCell(label0);

			Label label1 = new Label(1, i, simCardCL, arial10fontResult);
			sheet.addCell(label1);

			// col, lin
			Label label2 = new Label(2, i, linhaCL, arial10fontResult);
			sheet.addCell(label2);	
			
			
			Label label3 = new Label(3, i, erro, arial10fontResult);
			sheet.addCell(label3);
			
			Label label4 = new Label(4, i, dispositivo, arial10fontResult);
			sheet.addCell(label4);

			Label label5 = new Label(5, i, simCard, arial10fontResult);
			sheet.addCell(label5);

			Label label6 = new Label(6, i, linha, arial10fontResult);
			sheet.addCell(label6);

			Label label7 = new Label(7, i, codTecnologia, arial10fontResult);
			sheet.addCell(label7);

			Label label8 = new Label(8, i, apnConfigurada, arial10fontResult);
			sheet.addCell(label8);

			Label label9 = new Label(9, i, operadora, arial10fontResult);
			sheet.addCell(label9);

			Label label10 = new Label(10, i, apnProvisionada, arial10fontResult);
			sheet.addCell(label10);

			Label label11 = new Label(11, i, statusSIMCard, arial10fontResult);
			sheet.addCell(label11);

			Label label12 = new Label(12, i, fonte, arial10fontResult);
			sheet.addCell(label12);

			Label label13 = new Label(13, i, imei, arial10fontResult);
			sheet.addCell(label13);

			Label label14 = new Label(14, i, imsi, arial10fontResult);
			sheet.addCell(label14);

			Label label15 = new Label(15, i, statusLinha, arial10fontResult);
			sheet.addCell(label15);

			Label label16 = new Label(16, i, consDados, arial10fontResult);
			sheet.addCell(label16);

			Label label17 = new Label(17, i, matricula, arial10fontResult);
			sheet.addCell(label17);
			
			Label label18 = new Label(18, i, chamado, arial10fontResult);
			sheet.addCell(label18);

			// Escrevedo o arquivo em disco
			workbook.write();

			// Fechando a IO
			workbook.close();

		} else {

			Workbook rw = Workbook.getWorkbook(new File(filename2.toString()));
			WritableWorkbook wwb = Workbook.createWorkbook(
					new File(filename2.toString()), rw);

			WritableSheet sheet = wwb.getSheet(wwb.getNumberOfSheets() - 1);

			int i = sheet.getRows();

			int a = wwb.getNumberOfSheets();

			if (i > 29999) {
				sheet = wwb.createSheet("Resultado " + a, a + 1);
				sheet = wwb.getSheet(a);
				i = 1;

				// col, lin consultado
				Label labelTitulo0 = new Label(0, 0, "Dispositivo Consultado", arial10font);
				sheet.addCell(labelTitulo0);

				Label labelTitulo1 = new Label(1, 0, "SIMCard Consultado", arial10font);
				sheet.addCell(labelTitulo1);

				Label labelTitulo2 = new Label(2, 0, "Linha Consultado", arial10font);
				sheet.addCell(labelTitulo2);

				// ERRO
				Label labelTitulo3 = new Label(3, 0, "ERRO", arial10font);
				sheet.addCell(labelTitulo3);				
				
				// col, lin
				Label labelTitulo4 = new Label(4, 0, "Dispositivo", arial10font);
				sheet.addCell(labelTitulo4);

				Label labelTitulo5 = new Label(5, 0, "SIMCard", arial10font);
				sheet.addCell(labelTitulo5);

				Label labelTitulo6 = new Label(6, 0, "Linha", arial10font);
				sheet.addCell(labelTitulo6);
				
				Label labelTitulo7 = new Label(7, 0, "Tecnologia", arial10font);
				sheet.addCell(labelTitulo7);

				Label labelTitulo8 = new Label(8, 0, "APN Configurada",
						arial10font);
				sheet.addCell(labelTitulo8);

				Label labelTitulo9 = new Label(9, 0, "Operadora", arial10font);
				sheet.addCell(labelTitulo9);

				Label labelTitulo10 = new Label(10, 0, "APN Provisionada",
						arial10font);
				sheet.addCell(labelTitulo10);

				Label labelTitulo11 = new Label(11, 0, "Status SIMCard",
						arial10font);
				sheet.addCell(labelTitulo11);

				Label labelTitulo12 = new Label(12, 0, "Fonte", arial10font);
				sheet.addCell(labelTitulo12);

				Label labelTitulo13 = new Label(13, 0, "IMEI", arial10font);
				sheet.addCell(labelTitulo13);

				Label labelTitulo14 = new Label(14, 0, "IMSI", arial10font);
				sheet.addCell(labelTitulo14);

				Label labelTitulo15 = new Label(15, 0, "Status Linha",
						arial10font);
				sheet.addCell(labelTitulo15);

				Label labelTitulo16 = new Label(16, 0, "Consumo de Dados",
						arial10font);
				sheet.addCell(labelTitulo16);

				Label labelTitulo17 = new Label(17, 0, "Matrícula", arial10font);
				sheet.addCell(labelTitulo17);
				
				Label labelTitulo18 = new Label(18, 0, "Chamado", arial10font);
				sheet.addCell(labelTitulo18);
			}

			// col, lin Consultado
			Label label0 = new Label(0, i, dispositivoCL, arial10fontResult);
			sheet.addCell(label0);

			Label label1 = new Label(1, i, simCardCL, arial10fontResult);
			sheet.addCell(label1);

			Label label2 = new Label(2, i, linhaCL, arial10fontResult);
			sheet.addCell(label2);
			
			
			Label label3 = new Label(3, i, erro, arial10fontResult);
			sheet.addCell(label3);
			
			// col, lin
			Label label4 = new Label(4, i, dispositivo, arial10fontResult);
			sheet.addCell(label4);

			Label label5 = new Label(5, i, simCard, arial10fontResult);
			sheet.addCell(label5);

			Label label6 = new Label(6, i, linha, arial10fontResult);
			sheet.addCell(label6);

			Label label7 = new Label(7, i, codTecnologia, arial10fontResult);
			sheet.addCell(label7);

			Label label8 = new Label(8, i, apnConfigurada, arial10fontResult);
			sheet.addCell(label8);

			Label label9 = new Label(9, i, operadora, arial10fontResult);
			sheet.addCell(label9);

			Label label10 = new Label(10, i, apnProvisionada, arial10fontResult);
			sheet.addCell(label10);

			Label label11 = new Label(11, i, statusSIMCard, arial10fontResult);
			sheet.addCell(label11);

			Label label12 = new Label(12, i, fonte, arial10fontResult);
			sheet.addCell(label12);

			Label label13 = new Label(13, i, imei, arial10fontResult);
			sheet.addCell(label13);

			Label label14 = new Label(14, i, imsi, arial10fontResult);
			sheet.addCell(label14);

			Label label15 = new Label(15, i, statusLinha, arial10fontResult);
			sheet.addCell(label15);

			Label label16 = new Label(16, i, consDados, arial10fontResult);
			sheet.addCell(label16);

			Label label17 = new Label(17, i, matricula, arial10fontResult);
			sheet.addCell(label17);
			
			Label label18 = new Label(18, i, chamado, arial10fontResult);
			sheet.addCell(label18);

			// Escrevedo o arquivo em disco
			wwb.write();

			// Fechando a IO
			wwb.close();

		}
	}

A linha que indica no stacktrace é a que está o:

Workbook rw = Workbook.getWorkbook(new File(filename2.toString()));

WritableWorkbook wwb = Workbook.createWorkbook(

new File(filename2.toString()), rw);

Eu não tenho ideia de como fazer para reparar isso…

13 Respostas

mauricioadl

Me parece que vc usa o mesmo arquivo para todos os usuarios, se dois tentarem ao mesmo tempo vai dar problema mesmo, faça que crie um arquivo para cada request que resolve o problema.

P

Acho que é isso mesmo meu amigo… pois ele sobrescreve o que já esta em andamento… e como faria essa solução… não tenho muito conhecimento sobre isso… você poderia me ajudar?

douglaskd

NomeArquivoExcel arquivoExcel = new NomeArquivoExcel();

aqui parece que ele cria sempre com o mesmo nome;

seu código ta muito bagunçado…

P

Como assim bagunçado? pode me dar umas dicas amigo, aceito toda ajuda…

É essa classe que da um nome de arquivo…:

public File NomeExcel() {
		
	   	//ADICIONA DATA/HORA NO ARQUIVO GERADO
    	GregorianCalendar calendar = new GregorianCalendar();   
        SimpleDateFormat formatador = new SimpleDateFormat("dd' de 'MMMMM' de 'yyyy");     
            	
        File dir = new File(".\\arquivoUpload\\");
        File arq = new File(dir, "Consulta_Coletiva - "+formatador.format(calendar.getTime())+".xls");
		
		return arq;

	}

E esse lance de colocar cada um em cada request? pois o nome não deveria inteferir não é??

P

Fiz um contador para ir mudando o nome do arquivo, mas mesmo assim ele ainda mistura os dois e quem imprime primeiro pega o arquivo....

no servlet quando a pessoa clica em baixar o arquivo, faço desse jeito para baixar o arquivo :

NomeArquivoExcel arquivoExcel = new NomeArquivoExcel();
		File arq = arquivoExcel.NomeExcel();

        if(!arq.exists()){

        	msgRetorno = "Arquivo Inexistente";
        	
        } else {
   	
        	request.setAttribute("msgRetorno", msgRetorno);
    		response.setHeader("Content-Disposition", "filename=" + arq.getName());
    		response.setContentType("application/vnd.ms-excel");
    		ServletOutputStream out;
    		out = response.getOutputStream();
    		FileInputStream fin = new FileInputStream(arq);
    		
    		BufferedInputStream bin = new BufferedInputStream(fin);
    		BufferedOutputStream bout = new BufferedOutputStream(out);
    		int ch =0; ;
    		while((ch=bin.read())!=-1)
    		{
    		bout.write(ch);
    		}
    		
    		bin.close();
    		fin.close();
    		bout.close();
    		out.close();
    		arq.delete();
douglaskd

então, eu não sei o formato de como sua planilha vai ficar, mas eu para facilitar a manutenção eu faria isso pelo menos para ficar mais claro, mas ainda assim da pra refatorar muita coisa ai...

ArrayList<String> Titulos = new ArrayList();

Titulos.add("Dispositivo Consultado");
Titulos.add("SIMCard Consultado");
Titulos.add("Linha Consultado");
Titulos.add("ERRO");
Titulos.add("Dispositivo");
Titulos.add("SIMCard");

public void configuraTitulos(ArrayList<String> titulos){

      for(int i=0;i<=Titulos.size();i++){
            sheet.addCell(new Label(i, 0, Titulos.get(0), arial10font));
      }

}
P

Entendi…

Valeu Douglas pelas informações…

E sobre o meu problema vc teria um exemplo?? cara estou sem ideia alguma de como resolver… nem como colocaria em cada request como o mauricio informou

douglaskd

pacato o erro ocorre quando 2 pessoas tentam acessar ao mesmo tempo ? com somente 1 funciona normal ?

P

Oi Douglas… funciona perfeitamente… com uma pessoa apenas…

é assim a pessoa sobe um arquivo com dados para fazer uma consulta, ou seleciona umas opções em uma tela em JSP, dai vai para as classes fazem as validações, e mandam para esta classe que possui métodos de criar excel, e quando duas pessoas utilizam a mesma opção de consulta ao mesmo tempo, uma sobrepõem a outra.

Testei aqui com um amigo e está assim… se ele está fazendo um upload de um arquivo para gerar uma planilha de resultado, e eu subo enquanto esta montando esta planilha, os dados se misturam (isso acho que é por causa do nome também) e para de ler a que estava lendo e começa a ler a que entrou por último fazendo uma misturada…

e quem clica em baixar arquivo primeiro pega o outro vai para a tela em branco pois eu apago o arquivo após baixarem, isso também acho que ocorre por causa do nome…

douglaskd

então funciona assim: uma pessoa faz upload o arquivo… depois outra pessoa faz o download o arquivo e então exclúi o mesmo.

se eu faço upload e o jõao faz upload, ficam 2 arquivos, quando outro usuário fizer o download ele exclui o arquivo… seria isso ?

por que esta me parecendo que o erro ocorre por que 2 pessoas tentam fazer download do mesmo arquivo…a primeira baixa e a segunda não acha o arquivo dando o erro de filenotfoundexception.

ou esta ocorrendo o seguinte, o arquivo é criado porém antes dele ser usado pelo método workbook ele esta sendo excluido por algum outro código.

dificil saber…tem que debugar…

P

É quase isso…

No momento que esta sendo criado o arquivo excel… ele está na metade… ai eu vou la em outra máquina e faço o mesmo tipo de pesquisa… ele vai parar o arquivo que o sistema estava criando e começar o meu… ai ele termina com o arquivo com os dados do primeiro na metade e continuou e terminou o meu… ai como os dois tem o mesmo nome quando um baixa o outro não pega nada pois já deletou o arquivo…

Eu pensei em colocar no nome do arquivo o login do usuário… mas não sei se isso adiantaria… pois ele mesmo mudando o nome acaba montando tudo em um mesmo arquivo…

P

Douglas, adicionei o nome de login e tal…

agora quando esta um arquivo fazendo upload e eu tento subir junto da erro na servlet ao tentar subir um novo:

java.io.FileNotFoundException: .\arquivoUpload (Acesso negado)

File uploadedFile = new File("./arquivoUpload/" + fileItem.getName()); fileItem.write(uploadedFile); caminho = "./arquivoUpload/" + fileItem.getName();

P

Só deu erro uma vez… refiz os testes e funcionou… eu adicionei o login no nome do arquivo e agora ele gera normal… ele devia estar sobrescrevendo o mesmo nome…

mas não sei se isso é correto ou perfeitamente funcional…

Criado 16 de agosto de 2013
Ultima resposta 16 de ago. de 2013
Respostas 13
Participantes 3