Простые способы хранения данных о повторном развертывании веб-приложения 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");