2017-03-08 5 views
2

저는 Object Programming과 Java를 처음 접했으므로 여기에서 조언과 피드백을 수집하려고합니다. 기본적으로 다른 간격으로 다른 작업을 수행하는 백그라운드 서비스를 작성하려고합니다. 나는 코딩 표준을 따르고 있거나 효율적이라고 100 % 확신하지 못했습니다.Java 응용 프로그램 설계

홈페이지/시작 클래스 :

public class Start { 

    public static void main(String[] args) { 
     Service s = new Service(); 
     s.Start(); 
    } 

} 

데이터베이스 클래스 :

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.SQLException; 

public class Database { 

    /* Database settings */ 
    private final String HOSTNAME = "localhost"; 
    private final String DATABASE = "java_database"; 
    private final String USERNAME = "java_username"; 
    private final String PASSWORD = "java_password"; 

    /* Database connection */ 
    public Connection getConnection() { 
     try { 
      return DriverManager.getConnection("jdbc:mysql://" + HOSTNAME + "/" + DATABASE + "?user=" + USERNAME + "&password=" + PASSWORD + "&useSSL=false&useUnicode=true&characterSetResults=utf8"); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
     return null; 
    } 


} 

서비스 클래스 :

import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class Service { 

    private int taskId; 
    private int taskType; 


    /* Start Service */ 
    public void Start() { 
     try { 
      System.out.println("Starting Service..."); 
      while(true) { 
       System.out.print("Checking for tasks... "); 
       getNextTask(); 
       if (this.taskId > 0) { 
        System.out.println("Task ID " + this.taskId + " found."); 
        switch (this.taskType) { 
         case 1: 
          System.out.println("Task 1"); 
          SampleTask s = new SampleTask(); 
          s.Start(); 
          s = null; 
          break; 
         default: 
          System.out.println("Error: Unknown Task"); 
        }     
        setUsedTask(); 
       } else { 
        System.out.println("No tasks to perform at this time."); 
       } 
       this.taskId = 0; 
       this.taskType = 0; 
       Thread.sleep(5000); 
      } 
     } catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 


    /* Gets the next available task from the database */ 
    public void getNextTask() { 
     try { 
      Database db = new Database(); 
      String query = "select taskId, taskType " 
        + "from tasks " 
        + "where (time_to_sec(timediff(now(), taskLastRun)) > taskFrequency or taskLastRun is null) and taskEnabled = 1 " 
        + "limit 1"; 
      Statement stmt = db.getConnection().createStatement(); 
      ResultSet rset = stmt.executeQuery(query); 
      if (rset.next()) { 
       this.taskId = rset.getInt(1); 
       this.taskType = rset.getInt(2); 
      } 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
    } 


    /* Set task as complete */ 
    public void setUsedTask() { 
     try { 
      Database db = new Database(); 
      String query = "update tasks " 
        + "set taskLastRun = now() " 
        + "where taskId = ? " 
        + "limit 1"; 
      PreparedStatement pstmt = db.getConnection().prepareStatement(query); 
      pstmt.setInt(1, this.taskId); 
      pstmt.executeUpdate(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 
    } 


} 
+2

시도 : http://codereview.stackexchange.com/ – David

+3

는'Thread.seep()를'사용하지 마십시오. 대신에'ScheduledExecutorService'를 사용하십시오 –

+0

작업 코드를 검토하도록 요청하는 질문은 http://codereview.stackexchange.com/에 가야하기 때문에이 질문을 주제와 관련이없는 것으로 닫으려고합니다. – GhostCat

답변

0

(대기와 Thread.sleep를() 접근 방식을 대체하는 고려) 그리고 here과 같이 notify() 접근법을 사용한다.

public class Service { 

    private int taskId; 
    private int taskType; 
    private final Object serviceMonitor; 


    /* Start Service */ 
    public void Start() { 
     synchronized(serviceMonitor){ 
      try { 
      System.out.println("Starting Service..."); 
      while(true) { 
       System.out.print("Checking for tasks... "); 
       getNextTask(); 
       if (this.taskId > 0) { 
        System.out.println("Task ID " + this.taskId + " found."); 
        switch (this.taskType) { 
         case 1: 
          System.out.println("Task 1"); 
          SampleTask s = new SampleTask(); 
          s.Start(); 
          s = null; 
          break; 
         default: 
          System.out.println("Error: Unknown Task"); 
        }     
        setUsedTask(); 
       } else { 
        System.out.println("No tasks to perform at this time."); 
       } 
       this.taskId = 0; 
       this.taskType = 0; 
       serviceMonitor.wait(); 
      } 
      } 
     } 
     catch (InterruptedException ex) { 
      ex.printStackTrace(); 
     } 
    } 

public void getNextTask() { 
    synchronized(serviceMonitor){ 
    try { 
     Database db = new Database(); 
     String query = "select taskId, taskType " 
       + "from tasks " 
       + "where (time_to_sec(timediff(now(), taskLastRun)) > taskFrequency or taskLastRun is null) and taskEnabled = 1 " 
       + "limit 1"; 
     Statement stmt = db.getConnection().createStatement(); 
     ResultSet rset = stmt.executeQuery(query); 
     if (rset.next()) { 
      this.taskId = rset.getInt(1); 
      this.taskType = rset.getInt(2); 
      serviceMonitor.notifyAll(); 
     } 
     } 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
    } 
} 
0
public class Main { 
    public static void main(String[] args) { 
     Service service = new Service(Arrays.asList(new SampleTask(),new AnotherTask())); 
     service.execute(); 
    } 
} 



class Service { 
    private List<Task> taskList; 

    public Service(List<Task> taskList) { 
     this.taskList = taskList; 
    } 
    public void addTask(Task task) { 
     taskList.add(task); 
    } 
    public void execute() { 
     for (Task task : taskList) { 
      new Timer().schedule(task, task.getDelay(), task.getPeriod()); 
     } 
    } 
    public void clearTasks() { 
     taskList.clear(); 
    } 
} 


abstract class Task extends TimerTask { 
    abstract long getDelay(); 
    abstract long getPeriod(); 
} 


class SampleTask extends Task { 
    public void run() { 
     System.out.println("Sample task executed"); 
    } 

    long getDelay() { 
     return 1000; 
    } 

    long getPeriod() { 
     return 60000; 
    } 
} 

class AnotherTask extends Task { 
    public void run() { 
     System.out.println("Another task is executed"); 
    } 

    long getDelay() { 
     return 1000; 
    } 

    long getPeriod() { 
     return 500000; 
    } 
}