2012-06-07 5 views
0

SQL 작업을 실행하는 앱을 개발했습니다. 실행 버튼을 클릭하면 응용 프로그램이 실행 중 상태가되고 쿼리가 실행될 때까지 실행이 중단됩니다.백그라운드에서 Java 실행

내 앱이 중단되어서는 안되며 사용자가 다른 검색어를 입력 할 수 있어야하며 검색어 실행이 백그라운드에서 실행되어야합니다.

제 질문은 백그라운드에서 쿼리 실행을 실행하는 방법입니다. 은 실행 버튼을 클릭하면 나머지 실행이 화면 뒤에서 실행되어야 함을 의미합니다.

내 응용 프로그램은 주요 기능의 액션 클래스의) (당신은 ExecutorService 또는 Java를 사용할 수 있습니다

DAO dao1=new DAO(); 
        System.out.println("Here...1"); 
        con1=dao1.DBConnection(jndiname); 
        Statement st = con1.createStatement(); 
        //status_id=1; 
        ResultSet rs = st.executeQuery(query); 
        System.out.println("Here...2"); 
        String id = Long.toString(System.currentTimeMillis()); 
        //int req_id = System.currentTimeMillis(); 
        String dirTree= rsBundle.getString("CSV_DIR"); 
        File f=new File(dirTree); 
        String[] directories = dirTree.split("/"); 
        String[] lists=f.list(); 

        for (String dir : directories) 
        { 
         if (!dir.isEmpty()) 
         { 
          if (f.exists()) 
          { 

           System.out.println("directory exist"); 
          } 
          if (!f.exists()) 
          { 
           boolean success = (new File(dirTree).mkdirs()); 
           if(success) 
           { 
           System.out.println("directory created"); 
           } 

          } 

          } 

          } 
        for(String s:lists) 
        { 
         System.out.println("files.." + s); 
        } 
        String csv_file_path=dirTree+"/"; 
        String csv_file_name=id +".csv"; 
        //writing to csv file 
        CSVWriter writer = new CSVWriter(new FileWriter(csv_file_path + csv_file_name), ',',CSVWriter.NO_QUOTE_CHARACTER); 

        writer.writeAll(rs, true); 
        writer.close(); 
        //status_id=7; 
        String zip_file_path=rsBundle.getString("zip_file_path"); 
        String zip_filename=id + ".zip"; 

        String zip_file_pwd=rsBundle.getString("zip_file_pwd"); 
        //zip file creation 
        ZipUtil.zipDirWithPassword(dirTree, zip_file_path + zip_filename,zip_file_pwd); 
        String ftp_file_path=rsBundle.getString("ftp_file_path"); 
        long zip_file_size= new File(zip_file_path + zip_filename).length(); 
        System.out.println("File size..inside" + zip_file_size); 
        System.out.println("Here...3"); 
        String exec_id=(String)request.getSession().getAttribute("userLoginId"); 
        //int executor_id= Integer.parseInt(exec_id); 
         DateFormat dateFormat = new SimpleDateFormat("mm/dd/yyyy"); 
         //get current date time with Date() 
         Date date = new Date(); 
         System.out.println(dateFormat.format(date)); 

        String query4 = "select executor_id,email_id from m_executor where windows_id = '" + exec_id + "'"; 
        System.out.println("Query... " + query4); 
        //int i=0; 
        iPreparedStatement4=con.prepareStatement(query4); 

        iResultSet3=iPreparedStatement4.executeQuery(); 
        while(iResultSet3.next()) 
        { 
         //restriction=iResultSet2.getString(1); 
         exec_email=iResultSet3.getString(2); 
         executor_id=iResultSet3.getInt(1); 
        } 

            ValueListForExec db= new ValueListForExec(); 
        String status_name=""; 
        status_name=db.getStatusName(status_id); 

        if(zip_file_size <= 5242880){ 
         System.out.println("send via email"); 
        /*} 
        else 
        {*/ 
         System.out.println("send via FTP"); 
         upload.upload(host, usrname, pwd,zip_file_path + zip_filename, ftp_file_path,zip_filename); 
        } 


        String insertquery="{ call sp_process_job (?,?,?,?) }"; 

        cs = con.prepareCall(insertquery.toString()); 
        cs.setString(1,id); 
        cs.setString(2,host); 
        cs.setString(3,usrname); 
        cs.setString(4,pwd); 


        cs.execute(); 

        con.commit(); 
+0

스레드를 사용해야합니다. ExecutorService를 사용하면 작업 관리가 쉬워 지므로 사용하는 것이 좋습니다. –

+0

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ –

+0

[스레드] (http://www.roseindia.net/java/thread/)에 대한 연구를 시도하십시오 – Crazenezz

답변

0

스레딩의 세계로 들어 가려고합니다.

백그라운드에서 작업을 실행하려면 별도의 스레드에서 해당 작업을 시작해야합니다. 스윙 앱에서 실행중인 경우 이벤트 디스패처 스레드에서 작업을 실행하지 않아야합니다.

SwingUtilities invokeLater를 살펴보십시오.

0

실행의

코드를() 실행 작성한 struts1.3의 framework.I를 사용하여 개발 이 작업을 수행 할 스레드. Runnable/Callable 객체에 SQL 작업을 작성할 수 있으며 일단 사용자가 버튼을 클릭하면 작업이 백그라운드에서 실행될 다른 스레드에 주어져야합니다. 스레드 풀을 사용하여 풀링 된 스레드로 작업을 전송할 수도 있습니다.

관련 문제