java - 如何从 java servlet 控制类(运行/停止)

标签 java multithreading servlets

我有一个充当简单爬虫的类,我想在 servlet 中调用该类。

我的想法是从用户那里获取一个url,然后url请求将传递给servlet,servlet将url传递给类,类将开始爬行。我希望我的 servlet 只创建该类的一个实例。从爬虫检索到的数据将由该类直接添加到数据库中。 我想控制类的行为,例如从 servlet 运行/停止/停止 (对于这个问题,我认为我能够创建一个简单的 xml 文件,该文件将在 servlet 和类之间共享,并且如果 servlet 更改状态代码类应该响应状态更改)

但是我对如何控制类的行为有一些疑问,例如命令它运行/停止/停止,并且由于我的类不是多线程的,我不知道调用它后调用的类会发生什么来自 servlet,并且由于此类需要从网络读取,显然我在运行它期间会遇到一些间隙/卡住阶段。

这种情况下我该如何解决并发问题?或者说我是否有并发问题?

问候。

最佳答案

这取决于您使用的 Servlet 容器。有些容器根据用户请求生成一个新线程(几乎总是这是所需的行为),因此您绝对应该针对并发进行设计。

可以让Servlet类实现SingleThreadModel,那么在service方法中就可以直接调用爬虫类代码,因为一次只有一个线程进入service

这意味着在给定时间只能处理一个 URL,这可能不是您想要的,因此,不要实现 SingleThreadModel 并在 init 方法中创建单例执行程序服务:

ExecutorService ex = Executors.newFixedThreadPool(20); //Only 20 tasks at a given time

然后,在service方法中使用请求中指定的URL创建一个新的CrawlingTask(Runnable),然后将任务提交给执行器。

这样你也可以关闭它:

ex.shutdown();

由于 ExecutorService 是线程安全的,因此您在排队任务时不必担心并发问题。

关于java - 如何从 java servlet 控制类(运行/停止),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533956/

相关文章:

java - 对 ArrayList<String> 元素执行字符串追加和算术运算

java - 如何在java中正确指定一个列表

perl - 使用 thread::queue 在 perl 中对数组进行出队

java - 如何在等待回调中保存对象?

java - 我应该在 Web 应用程序中的什么地方放置清理代码?

java - 如何在 Hibernate 中配置 StatementInspector?

Android:Java线程如何对应原生线程?

java servlet :response. sendRedirect() 如果在提交响应后调用则不会给出非法状态异常。为什么?

java - Servlet 重定向

java - 编辑器行号之间的空格 intellij