Tidak dapat memuat application.conf dari tugas cron di play framework 2.4

Saya telah membuat pekerjaan cron yang dimulai saat aplikasi dimulai ulang tetapi ketika saya mencoba membuat koneksi db saya mendapatkan pengecualian penunjuk nol. Saya dapat membuat dan menggunakan db dari modul lain menggunakan konfigurasi yang sama.

Di bawah ini adalah Application.conf saya

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

Dan kode yang mencoba mengakses db adalah

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

Saat saya memanggil metode getAllRow() dari kelas RequestDAO, metode itu muncul

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)

Tetapi kode yang sama berfungsi tanpa tugas cron. Apa yang harus saya lakukan untuk menghilangkan kesalahan ini


person visingh    schedule 19.03.2016    source sumber
comment
Saya pikir ini terkait dengan perintah eksekusi. Cron Anda telah dibuat sebagai singleton yang bersemangat dan segera mengirimkan peringatan ke aktor peringatan. Saat Anda mendapatkan pengecualian, aplikasi belum selesai membuat injektor untuk DB. Silakan coba atur penundaan awal menjadi 1000 milidetik, hanya untuk melihat apakah berhasil.   -  person Jonas Anso    schedule 21.03.2016


Jawaban (1)


Play menggunakan library konfigurasi Typesafe untuk konfigurasi.

Saya menduga direktori kerja Anda saat ini dari skrip cron tidak disetel, jadi mungkin file application.conf (application.properties) Anda tidak dapat ditemukan.

Namun, Config bagus karena memungkinkan Anda menentukan di mana mencari file, baik berdasarkan nama dasarnya (untuk memilih di antara ekstensi .conf | .properties | .json) atau nama file termasuk ekstensi pada baris perintah java:

  • Untuk menentukan nama dasar, gunakan -Dconfig.resource=/path/to/application
  • Untuk menentukan nama lengkap, gunakan -Dconfig.file=/path/to/application.properties
person WeaponsGrade    schedule 19.03.2016
comment
ketika saya mencoba menjalankan aplikasi menggunakan aktivator -Dconfig.file=conf/application.conf dijalankan masih saya mendapatkan kesalahan yang sama. Dan selama permulaan permainan saya mendapat aplikasi log berikut - Membuat Kumpulan untuk sumber data 'abc' [info] - play.api.db.DefaultDBApi - Basis data [srp] terhubung di jdbc:mysql://localhost:3306/database_name?useSSL=false - person visingh; 20.03.2016
comment
Itu berarti play sudah membuat koneksi DB. Jika ya, mengapa ia mengeluarkan pengecualian dari pekerjaan cron - person visingh; 20.03.2016
comment
Jika ini tidak terkait dengan konfigurasi, maka saya melihat masalah lain dalam daftar kode pertama: AlertActor membuat ActorSystem baru, yang sepertinya salah. ActorSystem dibuat di JobOneImpl, dan dari aktor mana pun dapat dijangkau menggunakan context().system(). Mungkin itu terkait dengan masalahnya? - person WeaponsGrade; 20.03.2016
comment
Masih saya mendapatkan pengecualian yang sama setelah mengomentari dua baris di dalam AlertActor final ActorSystem actorSystem = ActorSystem.create("name"); final ActorRef messageActor = actorSystem.actorOf(MessageActor.props()); - person visingh; 20.03.2016