Пустой указатель при вызове метода EJB для функции запуска сервера с использованием планировщика - PullRequest
0 голосов
/ 27 октября 2018

Привет всем, я пытаюсь достичь метода EJB, когда я запускаю сервер WildFly, и я хочу, чтобы метод выполнялся каждые 5 секунд, поэтому я использовал класс Schedular, но проблема в том, что когда я выполняю сервер, мне кажется, что это исключение

02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) javax.naming.NameNotFoundException: Map-JavaEE-ear / Map-JavaEE-ejb / ProjectService! Tn.esprit.Map.interfaces.ProjectRemote - служба jboss .naming.context.java.Map-JavaEE-ear.Map-JavaEE-EJB. "Проектсервис! tn.esprit.Map.interfaces.ProjectRemote" 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в org.jboss.as.naming.ServiceBasedNamingStore.lookup (ServiceBasedNamingStore.java:106) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в org.jboss.as.naming.NamingContext.lookup (NamingContext.java:207) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в org.jboss.as.naming.InitialContext $ DefaultInitialContext.lookup (InitialContext.java:235) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в org.jboss.as.naming.NamingContext.lookup (NamingContext.java:193) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в org.jboss.as.naming.NamingContext.lookup (NamingContext.java:189) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в javax.naming.InitialContext.lookup (неизвестный источник) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в javax.naming.InitialContext.lookup (неизвестный источник) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) на tn.esprit.Map.utilities.Schedular.run (Schedular.java:23) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в java.util.TimerThread.mainLoop (Неизвестный источник) 02: 12: 54,738 ОШИБКА [stderr] (Таймер-2) в java.util.TimerThread.run (неизвестный источник)

А это мой ClassService

@Stateless
public class ProjectService implements ProjectRemote {
@PersistenceContext(unitName = "MAP")
private EntityManager em;

@Override
public List<Project> getAllProjects() {
    Query query = em.createQuery(
            "SELECT p.id ,p.projectName , p.startDate" + " , p.endDate , p.address , p.totalNumberResource ,"
                    + " p.levioNumberResource,p.picture, p.projectType  FROM Project p");
    List<Object[]> res = query.getResultList();
    List<Project> projects = new ArrayList<Project>();
    res.forEach(array -> {
        Project project = arrayToProject(array);
        projects.add(project);
    });

    return projects;
}

public Project arrayToProject(Object[] array){
    Project project = new Project();
    project.setId((int) array[0]);
    project.setProjectName((String) array[1]);
    project.setStartDate((Date) array[2]);
    project.setEndDate((Date) array[3]);
    project.setAddress((String) array[4]);
    project.setTotalNumberResource((int) array[5]);
    project.setLevioNumberResource((int) array[6]);
    project.setPicture((String) array[7]);
    project.setProjectType((ProjectType) array[8]);

    return project;
}
    @Override
public String archiveProject() throws ParseException {
    List<Project> projects = this.getAllProjects();
    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = new Date();
    ArchivedProjects archivedProjects = new ArchivedProjects();
    for (Project project : projects) {
        archivedProjects.setId(project.getId());
        archivedProjects.setProjectName(project.getProjectName());
        archivedProjects.setProjectType(project.getProjectType());
        archivedProjects.setAddress(project.getAddress());
        archivedProjects.setClient(project.getClient());
        archivedProjects.setStartDate(project.getStartDate());
        archivedProjects.setEndDate(project.getEndDate());
        archivedProjects.setLevioNumberResource(project.getLevioNumberResource());
        archivedProjects.setTotalNumberResource(project.getTotalNumberResource());
        archivedProjects.setOrganizationalChart(project.getOrganizationalChart());
        archivedProjects.setPicture(project.getPicture());
        if ((dateFormat.format(date).compareTo(project.getEndDate().toString()) > 0)) {
            em.remove(em.contains(project) ? project : em.merge(project));
            em.persist(em.contains(archivedProjects) ? archivedProjects : em.merge(archivedProjects));
        }

        System.out.println(project.getEndDate().toString() + "   " + dateFormat.format(date).toString());
    }
    return "Archived";

}

Мой класс занятий:

@ManagedBean
public class Schedular extends TimerTask{
@EJB
ProjectRemote projectRemote;
@Override
public void run() {

    try {
        projectRemote.archiveProject();
    } catch (ParseException e) {
        e.printStackTrace();
    }

}
}

и, наконец, где я вызываю метод EJB:

@SuppressWarnings("serial")
public class StartUpService extends HttpServlet {

Schedular sc = new Schedular();
public void init() throws ServletException {
    Timer timer = new  Timer()  ;
    timer.scheduleAtFixedRate(sc,5000,1000);
}
}

Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы должны добавить аннотацию LocalBean в свой сервис.

import javax.ejb.LocalBean;

@Stateless
@LocalBean
public class ProjectService implements ProjectRemote {
@PersistenceContext(unitName = "MAP")
private EntityManager em;
/**/
}
0 голосов
/ 27 октября 2018

Вы можете добавить следующий синглтон в свой модуль EJB (или добавить аннотацию расписания в методе archiveProject)

@Singleton
    public class ProjectArchivingScheduler {

        @EJB
        ProjectRemote projectRemote;

        @Schedule(minute = "*", hour = "*", second = "*/5", persistent = false)
        public void refresh() {
            projectRemote.archiveProject();
        }
    }
...