2015-01-06 1 views
2

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

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

ответ

4

В фасоле @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");