2016-11-18 2 views
2

У меня есть ресурс singleton, который создает объекты в его конструкторе, и когда приложение завершается, и сервер завершается, мне нужно освободить эти объекты. Как это делается в Джерси 2?Ресурс нуждается в очистке для Джерси 2

@Path("/") 
@Singleton 
public class MyResource { 
    private Map<String, MyObject> cache; 

    public MyResource() { 
     cache = new ConcurrentHashMap<>(); 
     // at some point I need to remove all entries 
     // from the map and close all MyObject objects there 
     // 
     // the reason is because MyObject might have files open 
     // and I need to close the files 
     // 
     // where can I do that? 
    } 
    ... 
} 
+0

Вы должны быть более конкретными, что «в какой-то момент». В точке /, которая/точка? Весь жизненный цикл, управляемый контейнером, состоит в том, что эти точки определены и становятся элементами конфигурации. Вызов метода «release/очистить сейчас» вручную полностью нарушает всю идею. – BadZen

+0

Спасибо. Я отредактирую вопрос. – akonsu

+0

(Также, как правило, вы, вероятно, не хотите, чтобы жизненные циклы, управляемые контейнерами, были открытыми/закрывающими файлами. Это не то, для чего нужен CDI.) – BadZen

ответ

3

Джерси поддерживает крюк жизненного цикла @PreDestroy. Так что аннотирования метод в классе с @PreDestroy и Джерси будем называть его, прежде чем ресурс расположен

import javax.annotation.PreDestroy; 

@Path("/") 
@Singleton 
public class MyResource { 
    private Map<String, MyObject> cache; 

    public MyResource() { 
    } 

    @PreDestroy 
    public void preDestroy() { 
     // do cleanup 
    } 
} 
Смежные вопросы