Простые способы хранения данных о повторном развертывании веб-приложения Java EE 7

Моя веб-служба Java EE 7 генерирует статистику один раз в день, и поскольку данные хранятся только в компоненте ApplicationScoped, они не сохраняют повторное развертывание, поэтому клиенты не могут получить статистику до завершения следующего запуска.

Предоставляет ли Java EE 7 простой способ сохранять состояние приложения, чтобы оно было доступно после повторного развертывания, подобно базе данных в памяти? Поскольку это только один большой объект (список), я бы предпочел что-то более простое (и, возможно, более эффективное выполнение), чем база данных.

1 ответ

Решение

В @ApplicationScoped боб, вы можете просто реализовать @PreDestroy чтобы сохранить его во временном хранилище, которое вы затем проверяете и читаете в @PostConstruct, Вы можете получить управляемое контейнером временное хранилище в качестве атрибута контекста сервлета с ключом ServletContext.TEMPDIR,

Вот пример использования JAXB, чтобы данные сохранялись в формате XML для повторного использования.

private Data data;
private File file;
private JAXBContext jaxb;

@Inject
private ServletContext servletContext;

@PostConstruct
public void init() {
    File tempdir = (File) servletContext.getAttribute(ServletContext.TEMPDIR);
    file = new File(tempdir, "data.xml");
    jaxb = JAXBContext.newInstance(Data.class);

    if (file.exists()) {
        data = (Data) jaxb.createUnmarshaller().unmarshal(file);
    }
}

@PreDestroy
public void destroy() {
    jaxb.createMarshaller().marshal(data, file);
}

Если вам случится выполнить развертывание в JBoss (WildFly), то вы также можете использовать папку данных, управляемую JBoss, которая немного более постоянна, чем местоположение, представленное ServletContext.TEMPDIR,

String datadir = System.getProperty("jboss.server.data.dir");
file = new File(datadir, "data.xml");
Другие вопросы по тегам