从线程中读取数据(在Servlet中)

3

我正在使用ServletContextListener来创建一个新线程。

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 应在服务器活动期间一直从串口读取信息。我将其放入线程中,因为只能有一个实例从串口读取;然后应该将数据共享给所有客户端。

现在我想访问此线程正在从串口读取的数据。

这可以吗?如果可以,那么如何操作?

3个回答

2
可以做到,并且您有几个选项:
1- 使用共享的concurrent.BlockingQueue,在线程中从SerialPort添加新数据,在您的servlet中从该队列读取。
2- 在您的servlet中有一个事件监听器对象,并将其传递到您的task构造函数中。监听器对象应具有回调函数,在SerialEvent发生时调用该函数。
总的来说,这是一种典型的生产者/消费者模式。

我猜在servlet中使用串行事件监听器似乎是更好的想法。然而,我对Java还有点陌生。实现串行事件监听器可能会起作用,但是我该如何将此信息传递给servlet呢?只需要通过回调函数传递参数吗? - Thomas

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); 
            }
        });
    }
}

你是指 Servlet 上下文属性吗? - Thomas
我有很多传感器数据,你认为与其他提出的解决方案(回调)相比,这是否是一种有效的做法? - Thomas
在servlet中,我将需要使用计时器来读取上下文属性吗?谢谢,这听起来像个好主意。显然Java没有回调函数,所以这似乎是更好的想法。 - Thomas
谢谢;为什么Servlet上下文属性不再是一个好主意了? - Thomas
这仍然是一个好主意。您可以将BlockingQueue放入servlet上下文属性中。 - JB Nizet
显示剩余4条评论

0

你需要在即将创建的新Runnable中共享数据,可以向其中添加并发集合


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接