我試圖在澤西島編寫一個RESTful web應用程序時管理爭用資源(如:數據庫會話)。通常我會這樣寫代碼:澤西島JAX-RS中的異常處理/資源管理
Session session = getSession();
try {
doWork();
session.commit();
} finally {
session.rollback(); // doesn't hurt after commit
session.release(); // or whatever
}
與新澤西
現在,我有一個這樣的資源:
@Path("/")
class MyResource {
@Path("{child}") public Child getChild(...) {
// how do I manage my session here ???
return child;
}
}
的問題是,我需要獲得在getChild()會議,但我無法確定在完成工作後我能夠正確地釋放它,因爲我已經將控制權交給了Web應用程序。
孩子需要訪問會話一樣,所以我不能封裝在一個方法中的所有工作:
class Child {
@Path("{subchild}") public Subchild getSubchild(...) {
return new Subchild(session.get(...));
}
}
我不能包裝在一個Servlet過濾器的整個應用程序,因爲我從新澤西州級需要的信息構建我的會議。現在我可以在MyResource中打開它,使用常規的servlet過濾器來確保我總是關閉它,但是我不知道何時回滾以及何時提交會話。我可以使用ExceptionMapper來通知所有的異常,但這需要是一個ExceptionMapper,這看起來非常難看,概念上的try/finally分佈在三個不同生命期的類上,等等。
澤西島有沒有一種「正確的方式」來進行這種資源管理?我如何確保我能夠正確關閉一個資源後的FileInputStream,它的子位置已經使用了它?
的問題是,兒童可有可能需要訪問會話,過於武斷子定位器。我會更新這個問題。 – 2009-06-10 09:51:45