Aumentar tempo de execução para upload
18/01/2017 12:31
0
Olá pessoal, na minha aplicação implementei um recurso para receber um planilha, ler todos os registros e gravar no banco, está tudo funcionando muito bem, porém como são arquivos com muito registros, de 50 mil pra cima, o tempo de execução estoura, porém ele completa a tarefa, sei disso pq na base de teste coloquei pra imprimir no console "terminado", e mesmo após minutos ou horas, dependendo do arquivo, ele imprime e os dados são persistidos corretamente, tem algum lugar no grails para aumentar esse tempo de execução? Se sim, esse parâmetro aumenta para a aplicação como um todo, ou tem como configurar por controller, action? Vi esse post no link abaixo, ensinando a alterar a configuração direto no tomcat, porém queria ver a possibilidade de fazer diretamente no grails. Vlw moçada!

Link: http://www.tothenew.com/blog/increasing-the-connection-timeout-between-browser-and-the-tomcat-server/
Tags: Grails, timeout, time, execução, tempo


1
Oi Francisco,

até hoje só vi esta configuração sendo feita diretamente no servidor de aplicações, no entanto, vou aproveitar para dar uma sugestão.
Por que não tornar este processamento assíncrono? Assim você evita de estourar o sistema quando vários usuários forem fazer a importação para você.


0
Oi Kico, como ficaria o upload de forma assíncrona? Pode dar um exemplo? Vlw.
18/01/2017 13:54


1
Opa, como  o Mestre Kiko disse, acho que seria bem legal tornar assíncrono. Eu uso esse plugin de Jquery: https://github.com/danielm/uploader/

Para o processamento você pode utilizar um servidor de filas como ActiveMQ (http://activemq.apache.org/)  ou  Amazon SQS ou QQ outro da sua preferência. Não sei se vocÊ saca de filas, mas o usuário faria o upload da planilha, em seguida seria gerada uma mensagem na fila que um consumidor receberia e processaria a planilha, ao final você avisa ao usuário que a planilha tá pronta. Evitando assim o risco de estourar o sistema como o Kiko falou! 


0
Olá Leonardo, não ouvi falar ainda sobre servidor de filas, vou dar uma lida a respeito, se tiver algum exemplo, posta aqui pra nós, de qualquer forma valeu pela ajuda!
19/01/2017 10:35


1
Opa, de nada. Então exemplo de implementação eu não tenho. Mas na net rola muuuuita coisa! tem Até spec do Java pra fila! E o conceito é bem simples.. 
Aqui tem um mini tutorial de como usa com Grails: http://grails.org/plugin/activemq .. Mas vale a lida no conceito de filas e tópicos =)


0
Leonardo após ler sobre o ActiveMQ, me atentei para um detalhe importante, não acho que é o caso de usar um servidor de filas, pq na verdade esse processo de carregar a planilha para atualização de dados será feita por um único usuário, e a cada 30 dias aproximadamente, logo o problema maior mesmo é o tempo necessário para ler cada linha da planilha(às vezes passam de 50 mil), fazer as devidas conversões de tipo, e em seguida salvar ou atualizar a informação no banco após o upload do arquivo.
19/01/2017 11:34


0
Não conhecia essas gerenciadores de fila ActiveMQ Amazon SQ não. Muito interessante!
Francisco, dá uma olhada aqui sobre como fazer de forma assincrona http://docs.grails.org/3.0.17/guide/async.html

Acho melhor deixar separado o "upload do arquivo" do "processamento do arquivo"... e não tentar fazer tudo numa coisa só. 
Só por curiosidade vc está usando que formato de arquivo Excel (xls, csv, xlsx ..)..? Usando algum plugin específico?

Obrigado!
20/01/2017 14:20


0
Olá Rafael, vi alguns plugins tanto para o upload quanto para o processamento de planilhas, mas preferi fazer na mão mesmo, está funcionando corretamente, o problema é só o tempo desse processamento devido aos arquivos serem muito grandes, o arquivo que recebemos para atualização é csv. Vlw!
20/01/2017 16:50


0
Então, o lance da fila é justamente para deixar assíncrono. Vc não deixaria o usuário esperando esse processamento que vc diz ser lento, sacou? 


0
Entendi Leonardo, vou testar o ActiveMQ e ver como fica. Vlw brother!
23/01/2017 10:26


0
se vc estiver rodando grails 3, eu acho que deve ter algum parâmetro de timeout que você pode colocar no application.yml
Esses tempos eu setei uma porta diferente assim:

#application.yml
server:
?port:9999


Eu já vi alguma coisa de timeout para sessão, mas para o request não. Mas deve ter também. 
23/01/2017 13:56


0
o ? que apareceu alí acho que foi por causa do TAB ou eu que vacilei mesmo.
23/01/2017 13:57


1
Francisco,

a coisa talvez seja mais simples e você talvez nem precise de um servidor de mensageria. Uma tabela simples contendo as requisições realizadas e um status para cada uma delas (processado, a processar, finalizado, etc) junto com um agendamento por Quartz já te atenderia bem.

É exatamente o que é feito no Grails Brasil quando estamos enviando e-mails. Ao invés de enviar tudo de uma vez, o que poderia ficar um pouco pesado, o que fazemos é ter uma tabela de mensagens a enviar e um job do Quartz que esporádicamente verifica o que deve ser enviado.


0
Olá Rafael C., vlw pela dica, mas estou utilizando Grails 2.5, ainda estou esperando os próximos capítulos do Grails 3, mudou muita coisa, e
tem mt coisa por ser feita pelo que ando lendo, inclusive aqui. Kico
realmente havia lembrado do Quartz, já vi o pessoal falando dele aqui,
apesar de não ter utilizado ainda, mas parece simples pra agendar uma
tarefa dessa forma que sugeriu, vou testar tb, outra coisa, vi na
documentação do Grails (http://docs.grails.org/2.4.3/guide/async.html?) no item 10.2 falando sobre Multiple Asynchronous GORM calls, seria uma alternativa também?

Achei esse post falando do plugin Grails Spring Events, que provê processamento assíncrono, e dá um exemplo, porém, lá nos
comentários tem um leitor falando em dividir o processo em várias
Threads com um "Thread.start()" para cada evento (link e comentário
abaixo), e que mais é eficiente do que usar o plugin.

Link: http://www.tothenew.com/blog/using-spring-events-in-grails/
Comentário do leitor:
Running the same code withOutSpringEvent with a Thread.start() for each event
is even much faster than implementing the spring event mechanism. I will
say the only mistake in withSpringEvent code is that each save
operation is not done asynchronously. Like @Roni says, that would have
produced better results, or even 10 operations at a time, would have
been better
23/01/2017 17:09


1
Excelente alternativa mestre Kiko! Aqui na emrpesa a gente usa essa estratégia que você citou pra envio de emails também. Mas quis sugerir o servidor de filas só pra abrir mais um leque no conhecimento do nosso brother! 


1
Olá pessoal, consegui resolver/melhorar a situação. Antes, para uma planilha com 90 mil itens(lembrando que cada linha tem 33 colunas), por exemplo, o processamento do arquivo para gravação ou atualização no banco de dados, demorava mais 2 horas, no link abaixo(old but good), tem vários ajustes para melhorar o desempenho, desde o banco até o próprio Grails, o que me chamou a atenção, foi a parte em que ele esclarece que durante uma importação são realizados muitos processamentos, com um tonelada de objetos que se acumulam em uma mesma sessão do hibernate, e não são coletados pelo coletor de lixo. Conforme o processamento vai avançando, vai ficando mais e mais lento, até dar um "timeout" ou geralmente um "out of memory" da vida, a solução proposta por ele é "limpar" a sessão do hibernate a cada 100 itens processados, evitando os erros que mencionei, e com isso o processamento se torna incomparavelmente mais rápido, reduzi com isso o tempo de processamento de 2h para 6 ou 7 minutos em média. Os exemplos estão no link. Opiniões são bem vindas!

http://naleid.com/blog/2009/10/01/batch-import-performance-with-grails-and-mysql/
16/02/2017 14:04


0
Esse post foi salvador!
Tive que fazer a importação de um arquivo de 110 mil linhas e durante o debug, com muito menos registros, já estava demorando pra caramba.
O lance de limpar a sessão a cada 100 registros deixou o processamento uma bala. Estou usando o Grails 3.
Obrigado por compartilhar!
21/02/2017 10:34



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto