2013-03-02 54 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