我有一个充当简单爬虫的类,我想在 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/