2015-03-20 19 views
5

tôi đang học cho việc xác nhận Lõi mùa xuân và tôi có một số dount về về câu hỏi này finded vào tài liệu học tập được cung cấp:Cách đóng ApplicationContext một cách chính xác vào mùa xuân?

cách ưa thích để đóng một bối cảnh ứng dụng là gì?

Tôi biết rằng nếu tôi có một cái gì đó như thế này:

ConfigurableApplicationContext context = … 
// Destroy the application 
context.close(); 

bởi việc sử dụng các close() phương pháp trên bối cảnh Objet các ApplicationContext được đóng lại và các ứng dụng bị phá hủy.

Nhưng tôi nghĩ rằng đây không phải là cách tốt nhất mà tôi phải làm.

Đọc tài liệu chính thức tôi thấy rằng tôi cũng có thể làm một cái gì đó như thế này:

context.registerShutdownHook(); 

rằng đăng ký một Hook Shutdown với JVM vì vậy nó là JVM sẽ kích hoạt giai đoạn gần Spring trước khi thoát JVM . Vì vậy, trên lối ra JVM, giai đoạn gần của Spring sẽ thực hiện.

Trên tài liệu tôi có thể đọc: thường không thể gọi context.close() vì nhiều ứng dụng (ứng dụng web) chạy vô thời hạn Nhưng xác nhận cuối cùng này có ý nghĩa gì? tại sao ứng dụng web chạy vô thời hạn?

Vì vậy, câu hỏi của tôi là:

  • Tôi có thể sử dụng cách thứ hai này để đóng một bối cảnh ứng dụng cũng có không ứng dụng web?
  • Được ưu tiên là context.close()?

Tnx

+1

'nhiều ứng dụng (ứng dụng web) chạy vô thời hạn' .. Nó thường đề cập đến những điều xảy ra trong vòng lặp vô hạn trừ khi bạn ngừng quá trình, giống như SocketServer của bạn đang nghe yêu cầu gửi đến. Tại sao bạn muốn đóng WebApplicationContext theo cách thủ công ngay từ đầu? Nó thường được tạo ra tại máy chủ khởi động và bị phá hủy trong khi máy chủ tắt máy – Arkantos

+1

Một ứng dụng web không bao giờ dừng lại bởi vì nếu bạn làm điều đó, trang web sẽ ngừng hoạt động. Nếu bạn muốn ngừng chạy ứng dụng web, bạn sẽ tắt nó (bằng cách dừng máy chủ web chẳng hạn). Khi bạn làm điều đó, JVM cũng sẽ bị dừng lại để "Shutdown Hook with the JVM" là cách để đóng ngữ cảnh với JVM. Tại sao bạn muốn dừng ngữ cảnh? – rlm

+0

đóng được sử dụng trong các ứng dụng web và shutDownHook được sử dụng trong các ứng dụng độc lập. Chỉ cần đăng câu trả lời của tôi với vài chi tiết hơn :) – Arkantos

Trả lời

10

Như bạn biết rằng ContextLoaderListener là một trong số đó đảm nhiệm việc khởi tạo và hủy bỏ ApplicationContext của bạn, khi bạn tắt máy chủ của mình, phương thức contextDestroyed của ContextLoaderListener được gọi.

public void contextDestroyed(ServletContextEvent event){ 
    closeWebApplicationContext(event.getServletContext()); 
    ContextCleanupListener.cleanupAttributes(event.getServletContext()); 
    } 

Trong closeWebApplicationContext rằng, họ thực sự gọi phương thức close trên ApplicationContext như thế này

if ((this.context instanceof ConfigurableWebApplicationContext)) { 
    ((ConfigurableWebApplicationContext)this.context).close(); 
    } 

Đây là trực tiếp từ spring-web-4.1.5.jar. Vì nó là hiển nhiên từ đây, họ sử dụng close để tiêu diệt ApplicationContext trong các ứng dụng web.

Nhưng registerShutdownHook được sử dụng để tắt container IoC một cách rõ ràng trong ứng dụng không phải web như ứng dụng máy tính để bàn độc lập, đặc biệt khi bạn tạo ApplicationContext theo cách thủ công từ ClassPathXmlApplicationContext (hoặc) FileSystemXmlApplicationContext (hoặc) một số loại khác.

Việc này được thực hiện để giải phóng tất cả các tài nguyên được ứng dụng mùa xuân của bạn sử dụng và gọi phương thức hủy trên đậu mùa xuân của bạn nếu có.

+0

trong ứng dụng StandAlone ví dụ: Dịch vụ nền hoặc ứng dụng máy tính để bàn, Khi bạn nhập phương thức chính, bạn tạo bối cảnh ứng dụng, Bây giờ câu hỏi của tôi là, Nếu bạn đăng ký JVM Hook và bạn thoát khỏi phương thức chính, Điều này có phá hủy ngữ cảnh không? – Mubasher

7

Trên tài liệu tôi có thể đọc rằng: thường không thể gọi context.close() vì nhiều ứng dụng (ứng dụng web) chạy vô thời hạn Nhưng chính xác những gì có nghĩa là khẳng định cuối cùng này? tại sao ứng dụng web chạy vô thời hạn?

Ứng dụng web sẽ chạy miễn là máy chủ ứng dụng triển khai nó chạy. Nó tùy thuộc vào máy chủ ứng dụng (và không phải cho bạn) để bắt đầu và dừng ứng dụng của bạn một cách chính xác. Điều này có nghĩa là khi máy chủ ứng dụng bị dừng, ngữ cảnh servlet bị hủy. Trong một ứng dụng Spring, lớp ContextLoaderListener được đăng ký trong web.xml lắng nghe sự kiện này (bối cảnh bị phá hủy) để đóng đúng ngữ cảnh Mùa xuân.

Khi sử dụng Spring bên ngoài máy chủ ứng dụng (như một ứng dụng độc lập), bạn có thể dừng hoàn toàn ngữ cảnh Spring. Như bạn đã nói, điều này có thể được thực hiện bằng cách gọi một cách rõ ràng context.close() hoặc đăng ký một cái móc tắt máy (context.registerShutdownHook()) mà thực hiện cuộc gọi này cho bạn.

+0

ok nhưng là nó context.registerShutdownHook() tốt hơn để làm context.close()? – AndreaNobili

+0

Cả ['registerShutdownHook()'] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-context/3.2.3.RELEASE/org/springframework/context/support/ AbstractApplicationContext.java # AbstractApplicationContext.registerShutdownHook% 28% 29) và ['close()'] (http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-context/3.2.3 Phương thức .RELEASE/org/springframework/context/ConfigurableApplicationContext.java # ConfigurableApplicationContext.close% 28% 29) gọi cùng một mã để đóng ngữ cảnh Spring. Bạn có thể thấy điều đó trong 'AbstractApplicationContext'. – Tunaki

Các vấn đề liên quan