Na seção anterior, terminamos a interface da interface do usuário da página inicial, mas há um problema: se eu adicionar um produto em segundo plano, precisará reiniciar o servidor para ressincronizar os dados em segundo plano e atualizar a página inicial para sincronizar os dados. Obviamente, esse não é o efeito que queremos. Geralmente, esse tipo de página inicial do Online Mall definitivamente não é dados sincronizados manualmente, então como resolvê -los? Precisamos usar threads e temporizadores para sincronizar automaticamente os dados da página inicial regularmente.
1. Timer e Timertosk
Precisamos usar as classes Timer e Timertosk. Vamos apresentar essas duas categorias primeiro.
Timer é uma classe de ferramentas. No pacote java.util, os threads o usam para organizar tarefas que serão executadas nos threads de segundo plano posteriormente. As tarefas podem ser executadas uma vez ou podem ser executadas regularmente. Tem um construtor:
Timer (Boolean Isdaemon) // Crie um novo timer que possa especificar seu thread associado para ser executado como um daemon.
Após o fio daemon, ou seja, o encadeamento principal termina, a rosca também termina e, após a rosca não daemon, ou seja, a rosca principal termina, a rosca continua a executar. Quando o Isdaemon é verdadeiro, é o tópico daemon. A classe do temporizador possui um método de cronograma que pode criar uma tarefa, como segue:
cronograma de vazios (tarefa do TimerTask, data da primeira hora, período longo) // Programe a tarefa especificada para executar a execução de atraso fixo repetido no horário especificado. // O primeiro parâmetro é a tarefa especificada, ou seja, o objeto TimerTask; O segundo parâmetro é o primeiro tempo de abertura da tarefa; O terceiro parâmetro é o intervalo de tempo, ou seja, quanto tempo leva para executar sempre
Vamos dar uma olhada no TimerTask. O TimerTask é usado para criar uma nova tarefa de thread. Ele implementa a interface executável. Se queremos criar uma nova tarefa de thread, precisamos apenas herdar o TimerTask e reescrever o método de execução.
2. Crie uma nova tarefa de thread
Vamos criar uma nova tarefa de thread para atualizar os dados em segundo plano:
@Component // Deixe o objeto para o gerenciamento de primavera Public Class ProductimerTask estende o TimerTask {@Resource Private Products Service PRODUTSERVICE = NULL; // injete o ProduckerService @Resource CategoryService CategoryService = NULL; // injetar categoryService private servletContext aplicativo = null; // Defina um objeto ServletContext, porque depois de atualizarmos os dados em segundo plano, precisamos armazená -lo no domínio do aplicativo public void Stapplication (ServletContext Application) {this.application = Application; // Defina este objeto de aplicativo através do ouvinte, porque o objeto de aplicativo não pode ser levado aqui} @Override // a mesma lógica que a inicialização dos dados do ouvinte quando o projeto inicia o public void run () {System.out.println ("--------"); List <List <Product>> biglist = new ArrayList <List <Product>> (); // Armazene uma lista com a classe de categoria em BigList // 1. Consulte a categoria Hot para (categoria Categoria: CategoryService.QueryByHot (true)) {// Obtenha informações recomendadas do produto com base na lista de identificação da categoria hot <Production> lst = ProductService.QuerBycateGoryId (Categoria.getId ()); biglist.add (LST); // Coloque a lista na categoria em BigList} // 2. Deixe a consulta BigList no aplicativo Application.setAttribute ("biglist", BigList); // Suponha que tenhamos o objeto de aplicação}}Em seguida, modificamos o conteúdo do ouvinte quando o projeto é iniciado. A operação de consulta original acima foi colocada no ouvinte. Quando o projeto é iniciado, o ouvinte começa a executar, obtém dados de fundo e o armazena no domínio do aplicativo. Em seguida, o primeiro plano obtém os dados do domínio do aplicativo através da tag JSTL. Agora, entregamos essas coisas ao ProductimerTask que definimos, então basta definir um cronômetro no ouvinte e deixar o produto produzir atualizar os dados em segundo plano regularmente. Confira o código modificado no ouvinte:
3. Comece o temporizador no ouvinte
//@componente // ouvinte é um componente da camada da web. É instanciado por Tomcat, não na primavera. Não pode ser colocado na classe pública da primavera initDatalistener implementa servletContextListener {private ProductimerTask ProductImerTask = null; // Defina um objeto ProductImerTask Private ApplicationContext context = null; @Override public void contextDestroyed(ServletContextEvent event) { // TODO Auto-generated method stub } @Override public void contextInitialized(ServletContextEvent event) { context = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); ProductImerTask = (ProductImerTask) Context.getBean ("ProductImerTask"); // Obtenha o objeto ProductImerTask do arquivo de configuração // Fale o objeto embutido em ProductImerTask, porque o produto ProductimerTask não pode obter o aplicativo, você só pode fornecer o ouvinte Set ProductimerTask.SetApplication (event.getSertlectCoxt (); // Defina o timer para sincronizar os dados na página inicial uma vez a cada hora (configurada como um thread de daemon) novo timer (true) .Schedule (ProductimerTask, 0, 1000*60*60); // Execute a tarefa Productimertosk uma vez a cada hora, atualize os dados em segundo plano}}}}}}}} Em relação ao código de operação original no ouvinte InitDatalistener, você pode comparar o conteúdo na seção anterior. De fato, são os dados de atualização do ProductImerTask, mas são apenas colocados no TimerTask por enquanto. Dessa forma, concluímos o uso de threads e temporizadores para sincronizar regularmente os dados da página inicial, e esse intervalo de tempo pode ser definido por nós mesmos.
De fato, alguns dados da página inicial nos blogs do CSDN não são atualizados em tempo real. Haverá um tempo para atualizar todas as noites, como o ranking do blog na coluna esquerda, o número de visualizações exibidas após a leitura da classificação, etc. Elas são atualizadas todas as noites e devem ser definidas em segundo plano para atualizar uma vez por dia. O princípio deve ser o mesmo que aqui. Isso também reduz a pressão no servidor.
Link para este artigo: http://blog.csdn.net/eson_15/article/details/51387378
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.