Написание журнала базы данных из Play - как обрабатывать ошибки? - PullRequest
1 голос
/ 31 декабря 2011

Я пишу приложение базы данных log4j в Play.

В своем методе append() он создает новый экземпляр сущности модели Log4jLine, а saves() - через JPA.

Это прекрасно работает в журналах отладки / информации.Однако исключения не регистрируются.К этому приложению поступил вызов из кода платформы, но я подозреваю, что он не работает, поскольку в данный момент сеанс JPA недопустим.

Как мне адаптировать код для поддержки этого варианта использования?

public class DBAppender extends AppenderSkeleton {
    @Override
    protected void append(LoggingEvent loggingEvent) {
        Log4jLine logLine = new Log4jLine(...);
        logLine.save();
    }
}

1 Ответ

2 голосов
/ 31 декабря 2011

Согласно нашему разговору выше, мне было любопытно, как это сделать, и я смог заставить это работать.По сути, вам нужно создать новый EntityManager и полностью управлять им самостоятельно.Вызов любой из встроенных функций Play (.save (), .merge () и т. Д.) Заставит их использовать EntityManager, который Play настраивает для вас.Однако, если вы вернетесь к стандартным вызовам JPA, это сработает.

// Mapped in routes file as GET /exception        
public static void exceptionTest() {
    RuntimeException e = new RuntimeException("This is a test");
    logException(e);
    renderText("You are here");

}

private static void logException(RuntimeException e) {
    EntityManager em = JPA.newEntityManager();
    Notification n = new Notification();
    n.setMessage(e.getMessage());

    em.getTransaction().begin();
    em.persist(n);
    em.getTransaction().commit();
    throw e;
}

Это всего лишь быстрый и грязный эксперимент, чтобы доказать свою точку зрения.Вы, очевидно, должны обрабатывать исключения и случаи сбоев в logException (), которые я не обрабатываю.И просто для ясности, Уведомление - это основной объект в моем проекте, который я смог быстро использовать для этого.

Надеюсь, это поможет!

...