Jakarta ee 使用调度器在服务器启动函数上调用方法EJB时使用空指针

Jakarta ee 使用调度器在服务器启动函数上调用方法EJB时使用空指针,jakarta-ee,jboss,ejb,wildfly,Jakarta Ee,Jboss,Ejb,Wildfly,大家好,当我启动服务器WildFly时,我尝试访问一个方法EJB,我希望该方法每5秒执行一次,这就是为什么我使用Schedular类,但问题是,当我执行服务器时,我会看到这个异常 02:12:54738错误[stderr](Timer-2)javax.naming.NameNotFoundException:Map JavaEE ear/Map JavaEE ejb/ProjectService!tn.esprit.Map.interfaces.ProjectRemote——服务jboss.na

大家好,当我启动服务器WildFly时,我尝试访问一个方法EJB,我希望该方法每5秒执行一次,这就是为什么我使用Schedular类,但问题是,当我执行服务器时,我会看到这个异常

02:12:54738错误[stderr](Timer-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:54738 org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106)上的错误[stderr](计时器-2) 02:12:54738 org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)处的错误[stderr](计时器-2) 02:12:54738 org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:235)处的错误[stderr](计时器-2) 02:12:54738 org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)上的错误[stderr](Timer-2) 02:12:54738 org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)上的错误[stderr](计时器-2) 02:12:54738 javax.naming.InitialContext.lookup处的错误[stderr](计时器-2)(未知源) 02:12:54738 javax.naming.InitialContext.lookup处的错误[stderr](计时器-2)(未知源) 02:12:54738 tn.esprit.Map.utilities.Schedular.run(Schedular.java:23)处的错误[stderr](计时器-2) 02:12:54738 java.util.TimerThread.mainLoop处的错误[stderr](计时器-2)(未知源) 02:12:54738 java.util.TimerThread.run处的错误[stderr](计时器-2)(未知源)

这是我的班级服务

@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";

}
最后,我调用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);
}
}

有人能帮忙吗

您可以将以下单例添加到EJB模块中(或在archiveProject方法中添加日程注释)


您可以将以下单例添加到EJB模块(或在archiveProject方法中添加日程注释)


您必须在服务中添加注释LocalBean

导入javax.ejb.LocalBean

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

您必须在服务中添加注释LocalBean

导入javax.ejb.LocalBean

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


如果ProjectService部署在Scheduler类的另一个jar或EAR中,则必须使用@EJB(lookup=“[JNDI portable name]”)。我已经尝试过了,但没有成功:/能否告诉Schedular类必须在哪里?在EJB或WEB项目中?我总是使用EJB定时器服务并将其放入EJB项目中。解决方案是什么?我尝试了每一件事我总是尝试在WEB项目中运行它我得到了相同的例外如果ProjectService部署在另一个jar或来自Scheduler类的EAR中,您必须使用@EJB(lookup=“[JNDI portable name]”)。我尝试了,但没有成功:/n您能告诉Schedular类必须在哪里吗?在EJB或WEB项目中?我总是使用EJB定时器服务并将其放入EJB项目中。解决方案是什么?我尝试了每一件事我总是尝试在WEB项目中运行它我得到了相同的例外谢谢你的回答但我的问题是我无法从methode init()访问methode EJB因为我希望该方法在服务器启动时运行。您可以在PostConstruct Callback中用Startup和call方法注释singleton bean这也是我的做法!谢谢你的回答,但我的问题是我无法从methode init()访问methode EJB,因为我希望该方法在服务器启动时运行。你可以用Startup注释singleton bean,并在PostConstruct callback中调用方法。我也是这样做的!谢谢你的回答,终于成功了!我必须使用本地接口,并将@LocalBean添加到我的服务中。谢谢你的回答,终于成功了!我必须使用本地接口并将@LocalBean添加到我的服务中
@Stateless
@LocalBean
public class ProjectService implements ProjectRemote {
@PersistenceContext(unitName = "MAP")
private EntityManager em;
/**/
}