2013-03-02 53 views
3

我正在使用ServletContextListener創建一個新線程。從線程讀取數據(在Servlet中)

import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import java.util.concurrent.*; 

    public class Port implements ServletContextListener { 
     private ExecutorService executor; 

     public void contextDestroyed(ServletContextEvent event) { 
      executor.shutdown(); 

     } 

     public void contextInitialized(ServletContextEvent event) { 
      // start task 
      executor = Executors.newSingleThreadExecutor(); 
      executor.submit(new Task()); //task should implement Runnable! 

     } 
    } 

在這個線程裏我正在讀取串口(SerialPortEventListener)的數據。 task.class應該在整個服務器活動期間從串口讀取信息。我已經把它放在一個線程中,因爲只能有一個從串口讀取的實例;數據應該分享給所有客戶。

現在我想訪問這個線程從串口讀取的數據。

可以這樣做嗎?如果是,那麼如何?

回答

2

例如,您可以將讀取的數據存儲在servlet上下文屬性中。然後,從其他類,你會得到從servlet上下文屬性:

public void contextInitialized(final ServletContextEvent event) { 
     // start task 
     executor = Executors.newSingleThreadExecutor(); 
     executor.submit(new Runnable() { 
      @Override 
      public void run() { 
       String data = readFromPort(); 
       event.getServletContext().setAttribute("serialPortData", data); 
      } 
     }); 
    } 
} 
+0

你的意思是servlet上下文屬性? – Thomas 2013-03-02 18:03:06

+0

當然可以。感謝您注意到錯字。現在修復。 – 2013-03-02 18:14:01

+0

我真的有很多傳感器數據;你認爲與其他解決方案(回調)相比,這將是有效的嗎? – Thomas 2013-03-02 18:44:05

2

是的,這是可以做到的,你有幾種選擇:

1-使用共享concurrent.BlockingQueue在線程內從SerialPort和你的servlet從隊列中讀取添加新的數據

2-在你的servlet中有一個事件監聽器對象,並將它傳遞給你的構造函數task。偵聽器對象應該有一個回調函數,當SerialEvent發生時調用。

總的來說,這是一個典型的生產者/消費者模式

+0

我想在servlet裏面使用一個串口事件監聽器聽起來像是個好主意。不過,我對java有點新鮮。實現串行事件偵聽器可能會工作,但是如何將這些信息傳遞給servlet?只是通過回調參數? – Thomas 2013-03-02 18:07:36