2017-03-08 7 views
2

Ich bin ziemlich neu in der Objektprogrammierung und Java, also bin ich hier, um Ihren Rat und Ihr Feedback zu sammeln. Im Grunde versuche ich einen Hintergrunddienst zu schreiben, der verschiedene Aufgaben in verschiedenen Intervallen ausführt. Ich bin nur nicht 100% sicher, was ich mache, ist den Kodierungsstandards zu folgen oder ist effizient.Java Application Design

Haupt/Start Klasse:

public class Start { 

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

} 

Datenbank Klasse:

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; 
    } 


} 

Service-Klasse:

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

Versuchen: http://codereview.stackexchange.com/ – David

+3

Verwenden Sie keine 'Thread.seep()'. Verwenden Sie 'ScheduletedExecutorService' anstelle von –

+0

. Ich stimme für das Schließen dieser Frage als Off-Topic ab, da Fragen zur Überprüfung des Arbeitscodes an http://codereview.stackexchange.com/ gesendet werden sollten. – GhostCat

Antwort

0

Betrachten Sie Ihre Thread.sleep() Ansatz mit einer Warte ersetzen() und notify() Ansatz wie diskutiert 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; 
    } 
} 
Verwandte Themen