使用调度程序在服务器启动函数上调用方法 EJB 时的空指针
Null pointer when I call method EJB on server startup function using scheduler
大家好我在启动服务器 WildFly 时尝试访问方法 EJB,我希望该方法每 5 秒执行一次,这就是我使用 class Schedular 的原因,但问题是当我执行服务器时这个例外在我看来
02:12:54,738 ERROR [stderr] (Timer-2) javax.naming.NameNotFoundException: Map-JavaEE-ear/Map-JavaEE-ejb/ProjectService!tn.esprit.Map.interfaces.ProjectRemote -- service jboss.naming.context.java.Map-JavaEE-ear.Map-JavaEE-ejb."ProjectService!tn.esprit.Map.interfaces.ProjectRemote"
02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106)
02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207)
02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:235)
02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193)
02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189)
02:12:54,738 ERROR [stderr] (Timer-2) at javax.naming.InitialContext.lookup(Unknown Source)
02:12:54,738 ERROR [stderr] (Timer-2) at javax.naming.InitialContext.lookup(Unknown Source)
02:12:54,738 ERROR [stderr] (Timer-2) at tn.esprit.Map.utilities.Schedular.run(Schedular.java:23)
02:12:54,738 ERROR [stderr] (Timer-2) at java.util.TimerThread.mainLoop(Unknown Source)
02:12:54,738 ERROR [stderr] (Timer-2) at java.util.TimerThread.run(Unknown Source)
这是我的类服务
@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";
}
我的日程安排 class:
@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);
}
}
有人可以帮忙吗?
您可以将以下单例添加到您的 EJB 模块(或在 archiveProject 方法中添加计划注释)
@Singleton
public class ProjectArchivingScheduler {
@EJB
ProjectRemote projectRemote;
@Schedule(minute = "*", hour = "*", second = "*/5", persistent = false)
public void refresh() {
projectRemote.archiveProject();
}
}
您必须在您的服务中添加注释 LocalBean。
进口javax.ejb.LocalBean;
@Stateless
@LocalBean
public class ProjectService implements ProjectRemote {
@PersistenceContext(unitName = "MAP")
private EntityManager em;
/**/
}
大家好我在启动服务器 WildFly 时尝试访问方法 EJB,我希望该方法每 5 秒执行一次,这就是我使用 class Schedular 的原因,但问题是当我执行服务器时这个例外在我看来
02:12:54,738 ERROR [stderr] (Timer-2) javax.naming.NameNotFoundException: Map-JavaEE-ear/Map-JavaEE-ejb/ProjectService!tn.esprit.Map.interfaces.ProjectRemote -- service jboss.naming.context.java.Map-JavaEE-ear.Map-JavaEE-ejb."ProjectService!tn.esprit.Map.interfaces.ProjectRemote" 02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106) 02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207) 02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:235) 02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:193) 02:12:54,738 ERROR [stderr] (Timer-2) at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:189) 02:12:54,738 ERROR [stderr] (Timer-2) at javax.naming.InitialContext.lookup(Unknown Source) 02:12:54,738 ERROR [stderr] (Timer-2) at javax.naming.InitialContext.lookup(Unknown Source) 02:12:54,738 ERROR [stderr] (Timer-2) at tn.esprit.Map.utilities.Schedular.run(Schedular.java:23) 02:12:54,738 ERROR [stderr] (Timer-2) at java.util.TimerThread.mainLoop(Unknown Source) 02:12:54,738 ERROR [stderr] (Timer-2) at java.util.TimerThread.run(Unknown Source)
这是我的类服务
@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";
}
我的日程安排 class:
@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);
}
}
有人可以帮忙吗?
您可以将以下单例添加到您的 EJB 模块(或在 archiveProject 方法中添加计划注释)
@Singleton
public class ProjectArchivingScheduler {
@EJB
ProjectRemote projectRemote;
@Schedule(minute = "*", hour = "*", second = "*/5", persistent = false)
public void refresh() {
projectRemote.archiveProject();
}
}
您必须在您的服务中添加注释 LocalBean。
进口javax.ejb.LocalBean;
@Stateless
@LocalBean
public class ProjectService implements ProjectRemote {
@PersistenceContext(unitName = "MAP")
private EntityManager em;
/**/
}