Bom dia a todos!
Eu tenho um classe que implementa o Task e nela preciso chamar um método do controller do vraptor. Como eu faria isso?
Classe que implementa o task
[code]@ApplicationScoped
@Scheduled(cron = “0 15 10 ? * *”)
public class VerificaAgenda implements Task{
public void execute() {
}
}[/code]
Método do controller
[code]public void verifica_tempo_chamado(){
List listaCliente = clientedao.listaTudo();
for(Cliente cliente : listaCliente){
if(chamadodao.qtde_dias_ultimo_chamado(cliente.getId()) > 30){
Chamado chamado = new Chamado();
chamado.setCliente(cliente);
chamado.setData_abertura(new Date());
chamado.setDescricao_inicial("CLIENTE NAO ENTRA EM CONTATO POR MAIS DE 30 DIAS!");
chamado.setTipo_problema("MLPonto");
chamado.setStatus_tempo("NORMAL");
chamado.setStatus_prioridade("NORMAL");
chamado.setUsuario_abriu(usuariodao.load("clientepadrao"));
chamado.setDepartamento("SUPORTE");
chamadodao.salva(chamado);
}
}
}[/code]
desde já agradeço.
Quintanilhasi, nesse seu caso específico não terá como, pois sua Task VerificaAgenda tem escopo ApplicationScoped, e os @Resources são RequestScoped. Você pode extrair essa lógica para outra classe, também ApplicationScoped, e chamá-la tanto na Task quanto no Controller:
@Componet
@ApplicationScoped
public class VerificadorDeTempoDeChamado {
// Recebe o ClienteDao como parâmetro do método, porque provavelmente ele é @ResquestScoped
public void verifica(ClienteDao clientes) {
List<Cliente> listaCliente = clientedao.listaTudo();
for(Cliente cliente : listaCliente) {
if(chamadodao.qtde_dias_ultimo_chamado(cliente.getId()) > 30) {
Chamado chamado = new Chamado();
chamado.setCliente(cliente);
chamado.setData_abertura(new Date());
chamado.setDescricao_inicial("CLIENTE NAO ENTRA EM CONTATO POR MAIS DE 30 DIAS!");
chamado.setTipo_problema("MLPonto");
chamado.setStatus_tempo("NORMAL");
chamado.setStatus_prioridade("NORMAL");
chamado.setUsuario_abriu(usuariodao.load("clientepadrao"));
chamado.setDepartamento("SUPORTE");
chamadodao.salva(chamado);
}
}
}
}
@ApplicationScoped
@Scheduled(cron = "0 15 10 ? * *")
public class VerificaAgenda implements Task{
// Vai ter que receber o container pra poder pegar o ClienteDao que é @RequestScoped
private Container container;
private VerificadorDeTempoDeChamado verificador;
public VerificaAgenda(Container container, VerificadorDeTempoDeChamado verificador) {
this.container = container;
this.verificador = verificador;
}
public void execute() {
ClienteDao clientes = container.instanceFor(ClienteDao.class);
verificador.verifica(clientes);
}
}
@Resource
public class SeuController {
private ClienteDao clientes;
private VerificadorDeTempoDeChamado verificador;
public SeuController(ClienteDao clientes, VerificadorDeTempoDeChamado verificador) {
this.clientes = clientes;
this.verificador = verificador;
}
public void verificaTempoDeChamado() {
verificador.verifica(clientes);
}
}
bob_sponja obrigado pela ajuda!
Boas,
esse codigo funcionou?
Sempre que tendo obter um component requestScoped na task usando o container obtenho NullPointerException