4
respostas

Inserir uma tarefa dentro do projeto.

Estou com uma dúvida, finalizei o curso Spring MVC I e comecei a fazer alguns testes e me deparei com a seguinte dúvida, como eu faço pra colocar uma tarefa para executar dentro do projeto. Imagine que ao final do dia quero receber um e-mail com as vendas aprovadas. mas quero receber isso de forma automática.No meu caso fiz alguns testes a tarefa executa mas não consigo chamar a minha DAO de maneira correta podem me ajudar a injetar de maneira certa a DAO na minha tarefa.

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.casadocodigo.loja.task;

import br.com.casadocodigo.loja.dao.ProdutoDAO;
import br.com.casadocodigo.loja.models.Produto;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import org.springframework.beans.factory.annotation.Autowired;

/**
 *
 * @author Douglas
 */

@Singleton
public class TasktScheduler {

    @Autowired
    private ProdutoDAO dao;

    @Schedule(second = "*/10", minute = "*", hour = "*", persistent = false)
    private void sendEmail(){

        System.out.println("Send E-mail");
        Produto produto = new Produto();
        produto.setTitulo("Teste");
        produto.setDescricao("Teste descrição");
        produto.setPaginas(10);

        dao.gravar(produto);  Erro 
    }
}

Porém ocorre erro na linha Caused by: java.lang.NullPointerException at br.com.casadocodigo.loja.task.TasktScheduler.sendEmail(TasktScheduler.java:34)

4 respostas

A linha 34 é a do dao ?

é a chamada para a DAO dentro da Classe TasktScheduler

dao.gravar(produto);  Erro

Código da minha DAO

package br.com.casadocodigo.loja.dao;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.casadocodigo.loja.models.Produto;

@Repository
@Transactional
public class ProdutoDAO {

    @PersistenceContext
    private EntityManager manager;

    public void gravar(Produto produto) {
        manager.persist(produto);
    }

    public Produto find(Integer id) {
    return manager.createQuery("select distinct(p) from Produto p where p.id = :id", Produto.class).setParameter("id", id).getSingleResult();
    }

}

Como a classe task está como singleton o Springer não deve estar comseguindo criar e por isso não injeta o dão. Anota como componente do spring

Guilherme, boa tarde. desculpa a demora em responder. Fiz as alterações porém ainda estou com o problema. O Spring injeta a minha classe DAO, mas não injeta

@PersistenceContext
private EntityManager manager;

Que está dento da classe dao, por isso tenho o erro.Alterei meu método de schedule, e agora estou utilizando o schedule do spring.

@Component
@EnableScheduling
public class TasktScheduler {

    @Autowired
    private ProdutoDAO dao;

    private TaskScheduler scheduler = new ConcurrentTaskScheduler();

    public void sendTask(){
        scheduler.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println("Send E-mail");
                Produto produto = new Produto();
                produto.setTitulo("Teste");
                produto.setDescricao("Teste descrição");
                produto.setPaginas(10);
                dao.gravar(produto);
            }
        }, 10000);
    }
}

E estou chamando este método pelo endereço

@Controller
public class HomeController {

    @Autowired
    private ProdutoDAO dao;

    @RequestMapping("/initialize")
    public String initialize() {

        Produto produto = new Produto();
        produto.setTitulo("Teste");
        produto.setDescricao("Teste descrição");
        produto.setPaginas(10);
        dao.gravar(produto);

        TasktScheduler tasktScheduler = new TasktScheduler();
        tasktScheduler.sendTask();
        return "home";
    }
}

Dentro da classe HomeController eu consigo persistir o produto na base, porém quando na classe TasktScheduler eu não consigo persistir retorna erro. o que está faltando parar o spring reconhecer a meu EntityManager