当前位置: 首页 > 知识库问答 >
问题:

当我使用调度程序在服务器启动函数上调用方法EJB时,空指针

蓬长恨
2023-03-14

大家好,我试图达到一个方法EJB当我启动服务器WildFly,我希望该方法执行每5秒钟,这就是为什么我使用类Schedular,但问题是,当我执行服务器这个异常出现在我面前

02:12:54738错误[stderr](定时器2)javax.naming。NameNotFoundException:映射JavaEE ear/Map JavaEE ejb/ProjectService!tn.esprit.Map.interfaces(接口)。ProjectRemote--org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106)02:12:54738 ERROR[stderr](Timer-2)在org.jboss.as.naming.InitialContext$DefaultInitialContext.lookup(InitialContext.java:235)02:12:54738 ERROR[stderr](Timer-1)在org.jboss.as.naming.NamingContext.loukup(NamingContext.java:193)02:14:54738 ERROR[stderr](Timer-2)在.org.jboss.as.naming.Nameing.Context.loolookup(naming-Context.jawa:189)02:1:22:54738ERROR[stderr](Timer-2)在javax.naming.Initial Context。查找(未知源)02:12:54738 ERROR[stderr](Timer-2)at javax.naming.InitialContext。查找(未知源)02:12:54738 ERROR[stderr](Timer-2),位于tn.esprit.Map.utilities.Schedular.run(Schedular.java:23)02:14:54738错误[stderr](Timer-2),位于java.util.TimerThread。mainLoop(未知源)02:12:54738 ERROR[stderr](Timer-2)at java.util.TimerThread。运行(未知源)

这是我的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个答案

司凡
2023-03-14

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

导入javax.ejb.LocalBean;

@Stateless
@LocalBean
public class ProjectService implements ProjectRemote {
@PersistenceContext(unitName = "MAP")
private EntityManager em;
/**/
}
公孙锋
2023-03-14

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

@Singleton
    public class ProjectArchivingScheduler {

        @EJB
        ProjectRemote projectRemote;

        @Schedule(minute = "*", hour = "*", second = "*/5", persistent = false)
        public void refresh() {
            projectRemote.archiveProject();
        }
    }
 类似资料:
  • 我想把spring注释@Scheduled添加到spring bean中,并在另一个类中的方法中启动task。在spring引用中只有一种启动task的方法--Scheduling-Tasks。如何在没有@SpringBootApplication和Spring Boot运行器的情况下启动它。

  • 我们通过提供SQL server和maven repo详细信息创建了一个DataFlow服务器,对于调度程序,我们在创建服务时没有提供任何额外的参数,因此默认情况下,它是禁用的。从这里获得了一些关于如何启用调度程序的信息:https://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#_enabling

  • 我有quartz.properties文件,其中定义了如下RAM作业 我的课是 } 请指出我在这里做错了什么

  • 我正在从另一个WildFly服务器实例中查找并调用部署在WildFly服务器(目标服务器)实例上的EJB。为此,我使用链接--https://docs.jboss.org/author/display/wfly9/developer+guide#developerguide-ejbinvocationsFromaRemoteserver test.jar已经部署在目标服务器上。以下是部署日志。 无

  • 我已经在MyEclipse Tomcat服务器中部署了我的应用程序,我在本地使用JDK 1.6配置了Apache -Tomcat 7.0.8。成功启动服务器后,我尝试在地址栏中输入本地主机网址。但是我没有得到回应。我试过了 但它被称为“HTTP 400错误请求”。我重新部署了应用程序,并通过重新启动服务器重试。 启动我的服务器后,控制台有 当我在浏览器中输入url时,我在控制台中没有找到任何日志。

  • 我正在使用summernote,我想上传图片到我的网络服务器…下面是我正在使用的代码 Default.aspx default.asp.cs 错误: 注意:我已经将页面从default.aspx更改为about.aspx(但代码相同)