4
respostas

Problemas com simulação de erro

Olá, boa tarde. Neste ponto, no qual era o objetivo simular o problema com acesso concorrente a recursos quando se trabalha com servlets, tive problemas em simular a concorrência: conforme colocado no capítulo, criei um atributo na classe, e no método recebi ele com o getParameter() e dei um Thread.sleep(99999), mas não obtive os errors esperados. Alguém saberia o motivo???

Segue o código da classe:

package br.com.alura.gerenciador.web;

import java.io.IOException;
import java.util.Collection;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.alura.gerenciador.Empresa;
import br.com.alura.gerenciador.dao.EmpresaDAO;
import jdk.nashorn.internal.runtime.logging.Logger;

/**
 * Servlet implementation class BuscaEmpresa
 */
@Logger
@WebServlet ( "/busca" )
public class BuscaEmpresa extends HttpServlet {

  /**
  * 
  */
  private static final long serialVersionUID = -5640846148829616329L;

  String nome;

  /**
   * @see HttpServlet#HttpServlet()
   */
  public BuscaEmpresa () {
    super();
  }

  /**
   * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
   *      response)
   */
  @Override
  protected void doGet ( HttpServletRequest request , HttpServletResponse response )
      throws ServletException , IOException {
    try {
      response.setCharacterEncoding( "utf-8" );
      response.getWriter().append(
            "<!doctype html>"
          + "<html>"
            + "<head>"
              + "<meta charset='utf-8' />"
              + "<title> Gerenciador - Busca de Empresa</title>"
              + "<style>"
                + "table, td, th{border: 1px solid black}"
                + "table{border-collapse: collapse}"
                + "td,th{padding: 0.125em 1em}"
                + "th{background: lightgray}"
              + "</style>"
            + "</head>"
            + "<body>"
              + "<h3>Resultado da Busca: </h3>"
              + "<table>"
                + "<thead>"
                  + "<th>ID</th>"
                  + "<th>NOME</th>"
                + "</thead>"
                + "<tbody>");

      EmpresaDAO empresaDAO = new EmpresaDAO();
      String filtro = request.getParameter( "nome" );

      try {
        Thread.sleep( 999999 );
      } catch ( Exception e ) {
        e.printStackTrace();
      }

      Collection<Empresa> empresas = empresaDAO.buscaPorSimilaridade( filtro );

      for(Empresa empresa : empresas) {
        response.getWriter().append( 
            String.format(
                  "<tr>"
                + "<td>%s</td><td>%s</td>", empresa.getId(), empresa.getNome())
                + "</tr>"
            );
      }      

      response.getWriter().append(
                  "<tbody>"
              + "</table>"
            + "</body>"
          + "</html>" );
    } catch ( IOException e ) {
      log( e.getMessage() );
    }
  }

}
4 respostas

Bom dia Daniel, assim, o método getParameter() só é utilizado quando recebemos algo via request, nesse caso como estamos criando a variável na classe mesmo o getPArameter() não tem como pegar esse valor.

A ideia dess exercício é mostrar que criando uma variável em uma servlet, esta variável é compartilhada entre todas as suas threads. Então se você criar :

String nome = "Daniel";

e dentro do doGet/doPost chamar um:

System.out.println(nome);

Todas as chamadas a sua Servlet vão imprimir Daniel.

Ficou um pouco mais claro pra ti? tenta fazer e posta se deu certo!

Oi, Daniel

Aparentemente não tem nada errado, acredito que o erro não é no console e sim no resultado do GET, devolvendo o resultado apenas da segunda requisição. O trecho

Thread.sleep(10000);

é só para dar tempo de sobrescrever a requisição anterior.

Olá Guilherme, tentei fazer conforme você colocou, mas ainda assim minhas requisições trazem o retorno de acordo com o parâmetro fornecido.

Então Leonardo, mesmo com o sleep, a requisição permanece trazendo os recursos que pedi, corretamente.

Sei que não tem um impacto tão profundo no curso, mas é que eu realmente queria entender o que ocorre, na prática, e não somente em teoria.

Mas obrigado gente!

Entendi, na busca você usa o filtro como variável membro. Tente a seguinte alteração

String filtro; //como global fora do método doGet
...
filtro = request.getParameter( "filtro" );