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

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

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

Ответ 1

В @ApplicationScoped bean вы можете просто реализовать @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");