Не удалось загрузить application.conf из задания cron в play framework 2.4

Я создал задание cron, которое запускается во время перезапуска приложения, но когда я пытался создать соединение с базой данных, я получаю исключение с нулевым указателем. Я могу создавать и использовать БД из другого модуля, используя ту же конфигурацию.

Ниже мой 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; 
    }

Когда я вызываю метод getAllRow() класса RequestDAO, он бросает

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. Что мне сделать, чтобы убрать эту ошибку


person visingh    schedule 19.03.2016    source источник
comment
Думаю, это связано с исполнительным порядком. Ваш cron был создан как нетерпеливый синглтон и немедленно отправляет предупреждение актору предупреждений. Когда вы получаете исключение, приложение не закончило создание инжектора для БД. Пожалуйста, попробуйте установить начальную задержку на 1000 миллисекунд, просто чтобы посмотреть, работает ли она.   -  person Jonas Anso    schedule 21.03.2016


Ответы (1)


Play использует для настройки библиотеку конфигурации Typesafe.

Я подозреваю, что ваш текущий рабочий каталог из сценария cron не установлен, поэтому, вероятно, он не находит ваш файл application.conf (application.properties).

Тем не менее, Config удобен тем, что позволяет вам указать, где искать файл, либо по его базовому имени (чтобы выбрать одно из расширений .conf | .properties | .json), либо по имени файла, включая расширение, в командной строке java:

  • Чтобы указать базовое имя, используйте -Dconfig.resource=/path/to/application
  • Чтобы указать полное имя, используйте -Dconfig.file=/path/to/application.properties
person WeaponsGrade    schedule 19.03.2016
comment
когда я пытался запустить приложение с помощью активатора -Dconfig.file=conf/application.conf run, я все равно получаю ту же ошибку. И во время запуска игры я получил следующее приложение журнала: Создание пула для источника данных 'abc' [info] - play.api.db.DefaultDBApi - База данных [srp], подключенная к jdbc:mysql://localhost:3306/database_name?useSSL=false - person visingh; 20.03.2016
comment
Это означает воспроизведение уже созданного соединения с БД. Если да, то почему он выдает исключение из задания cron - person visingh; 20.03.2016
comment
Если это не связано с конфигурацией, то я заметил еще одну проблему в первом листинге кода: AlertActor создает новую ActorSystem, что кажется неправильным. ActorSystem создается в JobOneImpl, и к ней можно получить доступ из любого актора с помощью context().system(). Возможно, это связано с проблемой? - person WeaponsGrade; 20.03.2016
comment
Тем не менее я получаю такое же исключение после комментирования двух строк внутри AlertActor final ActorSystem actorSystem = ActorSystem.create("name"); final ActorRef messageActor = actorSystem.actorOf(MessageActor.props()); - person visingh; 20.03.2016