保持线程运行以执行任务

时间:2017-08-02 18:01:04

标签: java multithreading

我编写了一个线程类,其run方法将从数据库中获取某些提交的作业并执行它们。我已经在我的会话监听器的上下文初始化方法中启动了这个线程,以便线程在我的服务器上启动重新启动。 在run方法中,第一步是获取数据库中处于“已提交”状态的所有任务,然后逐个执行。 在执行完所有任务后我提交一个新任务时我遇到了一个问题。理想我的线程应该选择它但不是。我检查了线程的状态,它是“RUNNABLE”。一旦我重启服务器线程正在接受这个任务,但其他方面。

public void contextInitialized(ServletContextEvent sce) {
    try {

        Configuration configuration = new Configuration(); 
        configuration.configure("hibernate.cfg.xml");
        ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().
        applySettings(configuration.getProperties()).buildServiceRegistry();
        sessionFactory =  new AnnotationConfiguration().
        buildSessionFactory(serviceRegistry);
        logger.debug("sessionFactory created in HibernateSessionFactoryListener.contextInitialized() : " + sessionFactory);
        // get servletcontext
        context = sce.getServletContext();
        // start session factory
        context.setAttribute("datasource", sessionFactory);
        isSessionActive = true;

        //SubmitTaskThread t = new SubmitTaskThread();

        t.start();

}

以上是上下文初始化的代码

run方法中的代码:

     public void run(){
    //logger1.debug("in run method of thread class");

        //SubmitTask st = new SubmitTask();
        //st.runJobs();
       //TASKS THAT ARE SUBMITTED
     try {
        pendingList=getPendingList();
    } catch (Exception e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

        if (pendingList.size()>0){




        boolean isObjStorage=false;
       CornicheVO runVO;
       Transfer newTransferJob;
       List<String> locations;
       JobVO jobSubmitVo;

            for (int listSize=0;listSize<pendingList.size();listSize++){
                locations = new ArrayList<String>();
                runVO=pendingList.get(listSize);
                newTransferJob=new Transfer();
                jobSubmitVo=new JobVO();
                newTransferJob.setTask_id(runVO.getTask_Id());
                locations.add(runVO.getSrcLocDesc());
                locations.add(runVO.getDstLocDesc());
                 try {
                     drivesInfo = getLocationInfo(locations);
                } catch (CornicheException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                 try {

                    for (NasDrive drive : drivesInfo) {
                        if (drive.getSrc_loc_desc().equals(
                                runVO.getSrcLocDesc())) {
                                if ("OBJSTORAGE".equals(drive.getType())) {
                                    isObjStorage = true;
                                newTransferJob.setSrc_server_type("OOSS");
                            } else {
                                newTransferJob.setSrc_server_type("NAS");
                            }
                            newTransferJob.setSrc_server(drive.getSrc_server());
                            newTransferJob.setSrc_server_dflt_loc(drive.getSrc_Loc());
                            newTransferJob.setSrc_server_id(drive.getUsr_id());
                            newTransferJob.setSrc_server_pswd(drive.getPswd());

                        } else {
                            if ("OBJSTORAGE".equals(drive.getType())) {
                                newTransferJob.setDst_server_type("OOSS");
                            } else {
                                newTransferJob.setDst_server_type("NAS");
                            }
                            newTransferJob.setDst_server(drive.getSrc_server());
                            newTransferJob.setDst_server_dflt_loc(drive.getSrc_Loc());
                            newTransferJob.setDst_server_id(drive.getUsr_id());
                            newTransferJob.setDst_server_pswd(drive.getPswd());
                        }
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block

                    e.printStackTrace();
                }

                 jobSubmitVo.setClientName(runVO.getClientName());
                 jobSubmitVo.setSrcServer(runVO.getSrcLoc());
                 jobSubmitVo.setDstServer(runVO.getDstLoc());
                 jobSubmitVo.setSrcServerDesc(runVO.getSrcLocDesc());
                 jobSubmitVo.setDstServerDesc(runVO.getDstLocDesc());
                 jobSubmitVo.setFileName(runVO.getFileName());
                 jobSubmitVo.setSizeOfFile("32");
                 jobSubmitVo.setUsrName(runVO.getLstUpdtIdCd());
                 jobSubmitVo.setMetaTag(runVO.getMetaTag());
                 jobSubmitVo.setRententionPeriod(runVO.getRetentionPrdcurrent());
                 jobSubmitVo.setTask_Id(runVO.getTask_Id());

                 if (!isObjStorage) {

                       //CURLProcessor uploader = new CURLProcessor();
                        // Export the scripts first

                        util.exportFiles(newTransferJob.getSrc_server(), newTransferJob.getSrc_server_id(),newTransferJob.getSrc_server_pswd(),newTransferJob.getSrc_server_dflt_loc());
                        uploadtrasnfer(newTransferJob, runVO.getFileName(), jobSubmitVo);
                    } else {





                        util.exportFiles(newTransferJob.getDst_server(), newTransferJob.getDst_server_id(),newTransferJob.getDst_server_pswd(),newTransferJob.getDst_server_dflt_loc());
                        downloadTrasnfer(newTransferJob, runVO.getFileName(), jobSubmitVo);
                    }

                   try {

                } catch (Exception e) {
                    // TODO Auto-generated catch block

                    e.printStackTrace();
                }
            }

            }

2 个答案:

答案 0 :(得分:0)

您的run()方法获取一次待处理项目列表,并尝试处理它们。但是,一旦处理完毕,它似乎不会返回获取更多待处理项目。您需要获取列表并在循环中处理项目。

也可能存在其他一些问题。

答案 1 :(得分:0)

如果您的应用程序在应用程序服务器中运行,那么您需要从DB中选择已提交任务的代码作为计划任务运行。假设您希望每隔x分钟/小时运行一次,并且每次代码唤醒时,它都会从DB读取所有提交的任务,直到完成为止。最好的方法是使用外部调度程序,例如quartz。这样的调度程序可以定期处理您的任务,如果您的应用程序在服务器集群中运行,甚至可以处理它。即Quartz将确保无论您在群集中拥有多少台服务器,您的任务将只在其中一个上运行,就像您安排它一样。如果这对你来说太过分了,那么你仍然不需要编写自己的Thread,这是一种古老的方式。查看java类ExecutorService并阅读所有不同的实现。请特别注明ScheduledThreadPoolExecutorScheduledExecutorService。那些应该用更少的编码来做你需要的东西