2016-03-19 12 views
0

アプリケーションの再起動時に起動するcronジョブを作成しましたが、db接続を作成しようとしたときにnullポインタ例外を検出しています。同じ構成を使用して他のモジュールからdbを作成して使用することができます。以下は再生フレームワークのcronジョブからapplication.confを読み込めません。2.4

私はRequestDAOの方法getAllRow()を呼び出していた場合、DBにアクセスしようとした私の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 

とコードが

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

ですそれが投げているクラス

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) 

しかし、同じコードがcronジョブなしで動作しています。このエラーを取り除くにはどうすればよいですか?

+0

を使用し、完全な名前を指定するには-Dconfig.resource=/path/to/application

  • を使用し、ベース名を指定します。あなたのcronは熱心なシングルトンとして作成され、すぐに警戒俳優に "警戒"を送ります。例外が発生すると、アプリケーションはDBのインジェクタの作成を完了していません。最初の遅延を1000ミリ秒に設定してみてください。 –

  • 答えて

    0

    Playは設定にTypesafe config libraryを使用します。

    あなたの現在の作業ディレクトリがcronスクリプトから設定されていないと思われますので、application.confapplication.properties)ファイルが見つかりません。

    それはどちらかそのベース名で、どこのファイルを検索する場所を指定することができますようにしかし、コンフィグがいいです(.confの中から選択する| .properties | .json拡張子)またはjavaコマンドラインの拡張子を含むファイル名:

    • 私は実行順序に関係していると思う-Dconfig.file=/path/to/application.properties
    +0

    私はアクチベータを使ってアプリケーションを実行しようとしました-Dconfig.file = conf/application.confまだ同じエラーが発生しています。そして再生スタートアップ中に私はログアプリケーションを取得しました - データソース 'abc'のプールを作成 [情報] - play.api.db.DefaultDBApi - データベース[srp] jdbcで接続:mysql:// localhost:3306/database_name?useSSL = false – visingh

    +0

    これは、既に作成されたDB接続を再生することを意味します。もしそうなら、なぜそれがcronジョブから例外をスローしているのですか? – visingh

    +0

    設定に関連していない場合、最初のコードリストに別の問題があります: 'AlertActor'が新しいActorSystemを作成します。 ActorSystemは 'JobOneImpl'で作成され、' context()。system() 'を使って任意のアクターからアクセスできます。多分それは問題に関連しているでしょうか? – WeaponsGrade

    関連する問題