2016-03-19 2 views
0

Ich habe einen Cron-Job erstellt, der während des Anwendungsneustarts gestartet wird, aber wenn ich versuchte, db-Verbindung zu erstellen, geeeting null Zeigerausnahme. Ich bin in der Lage, db von einem anderen Modul mit der gleichen Konfiguration zu erstellen und zu verwenden.Nicht in der Lage, application.conf von Cron-Job in Play-Framework zu laden 2.4

Unten ist mein Application.conf

db.abc.driver=com.mysql.jdbc.Driver 
db.abc.url="jdbc:mysql://localhost:3306/db_name?useSSL=false" 
db.abc.username=root 
db.abc.password="" 
db.abc.autocommit=false 
db.abc.isolation=READ_COMMITTED 

Und Code, der versucht, db ist

public class SchduleJob extends AbstractModule{ 
    @Override 
    protected void configure() { 
     bind(JobOne.class) 
     .to(JobOneImpl.class) 
     .asEagerSingleton(); 
    } } 

@ImplementedBy(JobOneImpl.class) 
public interface JobOne {} 

@Singleton 
public class JobOneImpl implements JobOne { 
    final ActorSystem actorSystem = ActorSystem.create("name"); 
    final ActorRef alertActor = actorSystem.actorOf(AlertActor.props); 

    public JobOneImpl() { 
     scheduleJobs(); 
    } 

    private Cancellable scheduleJobs() { 
     return actorSystem.scheduler().schedule(
       Duration.create(0, TimeUnit.MILLISECONDS), //Initial delay 0 milliseconds 
       Duration.create(6, TimeUnit.MINUTES),  //Frequency 30 minutes 
       alertActor, 
       "alert", 
       actorSystem.dispatcher(), 
       null 
       ); 
    } 
} 

public class AlertActor extends UntypedActor{ 

public static Props props = Props.create(AlertActor.class); 
final ActorSystem actorSystem = ActorSystem.create("name"); 
final ActorRef messageActor = actorSystem.actorOf(MessageActor.props()); 

@Override 
public void onReceive(Object message) throws Exception { 
    if(message != null && message instanceof String) { 
     RequestDAO requestDAO = new RequestDAO(); 
     try { 
      List<DBRow> rows = requestDAO.getAllRow(); 
     } catch(Exception exception) { 
      exception.printStackTrace(); 
     } 
    } 
} 

}

public class RequestDAO { 
public List<DBRow> getAllRow() throws Exception { 
     List<DBRow> rows = new ArrayList<DBRow>(); 
     Connection connection = null;  
     try { 
      connection = DB.getDataSource("abc").getConnection(); 
      connection.setAutoCommit(false); 
} catch(Exception exception) { 
      exception.printStackTrace(); 
      if(connection != null) { 
       connection.rollback(); 
      } else { 
       System.out.println("in else***********"); 
      } 
      return null; 
     } finally { 
      if(connection != null) 
       connection.close(); 
     } 
     return schools; 
    } 

zuzugreifen, wenn ich rufe Methode getAllRow() von RequestDAO Klasse wirft es

java.lang.NullPointerException 
    at play.api.Application$$anonfun$instanceCache$1.apply(Application.scala:235) 
    at play.api.Application$$anonfun$instanceCache$1.apply(Application.scala:235) 
    at play.utils.InlineCache.fresh(InlineCache.scala:69) 
    at play.utils.InlineCache.apply(InlineCache.scala:55) 
    at play.api.db.DB$.db(DB.scala:22) 
    at play.api.db.DB$.getDataSource(DB.scala:41) 
    at play.api.db.DB.getDataSource(DB.scala) 
    at play.db.DB.getDataSource(DB.java:33) 

Aber der gleiche Code funktioniert ohne Cron-Job. Was soll ich tun, um diesen Fehler zu beheben?

+0

ich denke, ist im Zusammenhang mit der Ausführungsreihenfolge -Dconfig.resource=/path/to/application

  • verwenden Sie den vollständigen Namen anzugeben, verwenden. Ihr Cron wurde als eifriger Singleton erstellt und sendet sofort "Alarm" an den Alert-Actor. Wenn Sie die Ausnahme erhalten, ist die Erstellung des Injektors für die Datenbank noch nicht abgeschlossen. Bitte versuchen Sie die Anfangsverzögerung auf 1000 Millisekunden einzustellen, nur um zu sehen, ob es dann funktioniert. –

  • Antwort

    0

    Play verwendet die Typesafe config library für die Konfiguration.

    Ich vermute, dass Ihr aktuelles Arbeitsverzeichnis aus dem Cron-Skript nicht festgelegt ist, so dass es wahrscheinlich Ihre application.conf (application.properties) Datei nicht findet.

    jedoch Config schön in ist, dass es Ihnen ermöglicht, festzulegen, wo die Datei zu suchen, entweder durch ihre Basisnamen (zur Auswahl unter .conf | .properties | .json Erweiterungen) oder die Dateinamen einschließlich der Erweiterung auf der Java-Befehlszeile :

    • den Basisnamen angeben möchten, -Dconfig.file=/path/to/application.properties
    +0

    wenn ich versuchte, Anwendung mit dem Aktivator -Dconfig.file = conf/application.conf run immer noch laufen zu lassen, bekomme ich denselben Fehler. Und während des Spielstarts bekam ich folgende Log-Anwendung - Creating Pool für die Datenquelle 'abc' [info] - play.api.db.DefaultDBApi - Datenbank [srp] verbunden bei jdbc: mysql: // localhost: 3306/datenbankname? UseSSL = false – visingh

    +0

    Das bedeutet, bereits erstellte DB-Verbindung abspielen. Wenn ja, warum wirft es Ausnahme von Cron-Job – visingh

    +0

    Wenn es nicht config ist, dann bemerkte ich ein anderes Problem in der ersten Code-Liste: 'AlertActor' erstellt ein neues ActorSystem, das scheint falsch. Das ActorSystem wird in 'JobOneImpl' erstellt und kann von jedem Akteur mit' context(). System() 'erreicht werden. Vielleicht hängt das mit dem Problem zusammen? – WeaponsGrade