2017-03-08 6 views
2

私はオブジェクトプログラミングと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を参照してください。

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; 
    } 
} 
関連する問題