2009-02-10 49 views
12

Tôi có một chương trình/chuỗi Java mà tôi muốn triển khai vào Máy chủ ứng dụng (GlassFish). Chuỗi này sẽ chạy dưới dạng "dịch vụ" bắt đầu khi Máy chủ ứng dụng khởi động và dừng khi Máy chủ ứng dụng đóng.Luồng trong Máy chủ ứng dụng

Tôi làm cách nào để thực hiện việc này? Nó không thực sự là Session Bean hay MDB. Nó chỉ là một sợi chỉ.

+0

Sự tò mò: tại sao bạn cần phải bắt đầu một chuỗi? Nó luôn luôn cảm thấy xấu với tôi khi bạn phải bắt đầu chủ đề trong một AppServer ... – Guillaume

+0

Chủ đề là để chạy một thể hiện của HSQL DB Server – systemoutprintln

Trả lời

1

Tạo một servlet có phương thức init bắt đầu một chuỗi là chương trình chính.

public void init() throws ServletException { 
    mailThread = new MailSendThread(); 
    mailThread.start(); 
} 

Trong tệp web.xml của ứng dụng, hãy thêm một servlet bao gồm yếu tố tải khởi động khi số là thứ tự bắt đầu.

<servlet> 
    <servlet-name>Mail Sending Servlet</servlet-name> 
    <servlet-class>MailServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 
3

Đây không phải là một cái gì đó mà bạn nên làm trong bất kỳ máy chủ ứng dụng, trừ khi bạn có quyền truy cập vào chủ đề quản lý được cung cấp bởi các máy chủ ứng dụng. Tôi không quen thuộc với Glassfish, nhưng bạn có thể làm điều này trong Websphere hoặc Weblogic bằng cách sử dụng một WorkManager commonj.

Rõ ràng, điều tương tự có thể được thực hiện trong Glassfish và JBOSS thông qua một JCA WorkManager (mà tôi không quen thuộc).

7

Tôi chỉ làm điều này với Tomcat, nhưng nó sẽ hoạt động trong Glassfish.

Tạo lớp Listener thực hiện javax.servlet.ServletContextListener, sau đó đặt nó trong web.xml. Nó sẽ được thông báo khi ứng dụng web của bạn bắt đầu và bị hủy.

Một lớp Listener đơn giản:

public class Listener implements javax.servlet.ServletContextListener { 

    MyThread myThread; 

    public void contextInitialized(ServletContextEvent sce) { 
     myThread = new MyThread(); 
     myThread.start(); 
    } 

    public void contextDestroyed(ServletContextEvent sce) { 
     if (myThread != null) { 
      myThread.setStop(true); 
      myThread.interrupt(); 
     } 
    } 

} 

này đi trong web.xml sau khi cuối cùng 'ngữ cảnh param' và trước khi lần đầu tiên 'servlet' của bạn:

<listener> 
    <listener-class>atis.Listener</listener-class> 
</listener> 

Không biết liệu loại điều này được khuyến khích hay không, nhưng nó đã làm việc tốt cho tôi trong quá khứ.

+0

Điều này dường như tôi sạch hơn nhiều so với tấn công một servlet.init() phương pháp. Tuy nhiên, tôi cảm thấy hơi khó chịu khi bắt đầu chuỗi trong AppServer. – Guillaume

+0

+1 đây là đã làm điều đó. nếu bạn không hài lòng về việc quản lý chủ đề của riêng bạn .. hãy khởi động thạch anh bên trong máy chủ ứng dụng. nhưng làm điều đó bên trong SCL như được mô tả ở đây .. –

+0

Tốt. Hoạt động trên Glassfish 3 ở đây. –

0

Tôi cũng cần phải tạo ra nhiều chủ đề trong đó mỗi chủ đề sẽ mở một ổ cắm khác quá trình từ xa chạy trong Glassfish App của tôi. Máy chủ. Tôi nhìn vào hạt LifecycleListener được cung cấp bởi Glassfish mà bạn cần phải thực hiện.

Tôi đã tạo một mẫu thử nghiệm để thực hiện công việc luồng và ổ cắm trong quá trình triển khai LifecycleListener và nó thực sự không giúp quản lý các tài nguyên này. Để có được quyền truy cập vào LifecycleListener, tôi đã phải đặt một phương thức tĩnh công khai tĩnh sẽ thực hiện các hành động mong muốn.

Tôi không thấy giá trị nào trong LifecycleListener vì tôi có thể thực hiện chính xác công việc tương tự bên trong EJB của tôi, đó là ứng dụng khách gọi là LifecycleListener. Bởi vì thực sự không có sự quản lý thích hợp của Thread và Socket trong bean.

Tôi được thông báo rằng JCA có thể là cách tốt nhất để đi. Tôi đã không thử điều này.

0

Tôi bắt đầu một đối tượng theo thời gian với dịch vụ hẹn giờ và chỉ một lần hết hạn. Sau đó, trong thời gian chờ, tôi làm những gì tôi muốn làm với chủ đề.

http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html

Đối với tôi nó làm việc kể từ khi nó sử dụng các thành phần J2EE và là một chủ đề khác nhau.

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