Desde que o sistema SEOTcs atualizou o algoritmo de pontuação de SEO em 24 de novembro, surgiu um problema que tem me incomodado. O seguinte erro será relatado frequentemente durante a execução da tarefa de trabalho de dados Java:
"2011-12-03 18:00:32 DefaultHttpClient [INFO] Exceção de E/S (java.net.SocketException) detectada ao processar a solicitação: Conexão redefinida por peer: erro de gravação de soquete
03/12/2011 18:00:32 DefaultHttpClient [INFO] Tentando novamente solicitação”…
Para isso, pesquisei alguns sites em chinês e inglês, procurei em todos os cantos que encontrei e descobri o motivo pelo qual essa situação ocorre. Essa exceção Java pode ocorrer tanto no lado do cliente quanto no lado do servidor. dois motivos:
1. Se o soquete em uma extremidade estiver fechado (ou fechado ativamente, ou fechado devido a uma saída anormal), a outra extremidade ainda envia dados, e o primeiro pacote de dados enviado aciona esta exceção (redefinição de conexão por peer).
2. Uma extremidade sai, mas a conexão não é fechada ao sair. Se a outra extremidade estiver lendo dados da conexão, a exceção (redefinição de conexão) será lançada. Simplificando, é causado por operações de leitura e gravação após a desconexão da conexão.
Então, simplesmente pensei que isso poderia ser resolvido definindo alguns tempos limite de soquete:
Mas depois de configurar a situação continua a mesma.
Este problema me incomoda há vários dias, e tenho pensado e feito testes comparativos todos os dias para descobrir o código que causou esse problema, não posso deixar de pensar, sob a premissa do mesmo número de palavras-chave, por que. não houve erro nos dados de classificação da consulta em lote anterior, mas erros foram relatados com frequência recentemente. O site da interface solicitada está bloqueando o IP do nosso servidor? Este motivo não é suficiente. Deve ser causado pela falha em liberar a conexão corretamente em algum lugar do programa!
Sob a orientação desta ideia, após vários dias de trabalho e prática contínua, hoje finalmente descobri a essência do problema, que é causado pelo método do cronômetro! A situação é assim. Nos últimos dias, acionei manualmente algumas tarefas em lote e descobri que quando o valor de classificação do filtro é 100, o erro java.net.SocketException: Connection reset in java continuará sendo gerado e a tela. a atualização é particularmente poderosa, depois de comparar cuidadosamente este código do temporizador.
Finalmente, de repente percebi, sim! Há um problema aqui, deixe-me analisar sozinho:
Um valor de função, o valor que ele retorna é um valor crítico, mas no meu método temporizador, considera-se que se o valor retornado for um valor crítico, ele o forçará a continuar executando esse método dentro de 10 segundos, e este método é para Para obter dados específicos do código-fonte em uma página, cada execução deste método consumirá dezenas de milissegundos, o que equivale a construir Uma conexão de soquete é estabelecida, mas como sempre retorna o valor crítico, este método estabelecerá continuamente uma conexão de soquete dentro de 10 segundos para obter dados. Se este método for executado a cada vez, levará cerca de 80ms (após o teste, a cada O tempo de execução. desse método é de cerca de 80 milissegundos) e dentro de 10 segundos, 10*1000/80 será criado. = 125 conexões de soquete, ou seja, 12,5 conexões de soquete serão estabelecidas por segundo. Além disso, por se tratar de um programa de filtragem, vários valores críticos aparecerão juntos continuamente. para a mesma página do site aumentará muito, chegando a centenas ou até milhares, fazendo com que o número de conexões de solicitação aguardando processamento seja muito alto:
Em primeiro lugar, por que você usou esse método de cronômetro para executar um método várias vezes? O motivo foi obter um valor de dados estável, mas agora que penso nisso, o impacto negativo é tão caro e o efeito não pode ser subestimado. , mas depois de vários dias de análises e testes abrangentes, o culpado foi finalmente descoberto. Depois que o problema foi resolvido, minha mente de repente ficou aliviada e pude dormir em paz. . .