繁体   English   中英

Java中从Java进行异步处理

[英]Asynchronous processing in Java from a servlet

我目前有一个tomcat容器 - 在其上运行的servlet监听请求。 我需要HTTP请求的结果是作业队列的提交,然后将异步处理。 我希望每个“作业”在数据库中连续保存,以便在发生故障时进行跟踪和恢复。 我一直在做很多阅读。 这是我的选择(注意我必须使用开源的东西)。

1)JMS - 使用ActiveMQ(但是在这种情况下谁是该作业的消费者另一个servlet?)

2)让我的请求在数据库中创建一行。 在我的Tomcat容器中有一个始终运行的独立servlet - 它使用Quartz Scheduler或java.util.concurrent中提供的实用程序来连续处理作为作业的行(使用线程池)。

我倾向于后者,因为查看JMS文档让我头疼,虽然我知道它是一个更强大的解决方案,但我需要相对快速地实现它。 在任何情况下,在部署此服务器的早期我都没有预料到会产生巨大的负载。

很多人都认为Spring可能对1或2都有好处。但是我从未使用过Spring,我甚至不知道如何开始使用它来解决这个问题。 任何有关如何潜入而无需重新编写整个项目的指针都会很有用。

否则,如果您可以权衡选项1或2,这也是有用的。

澄清:异步过程是屏幕抓取第三方网站,并向原始请求者发送消息通知。 第三方网站有点不稳定和缓慢,这就是为什么它将作为异步进程处理(内置几次重试尝试)。 我还将从该站点提取文件并将其存储在S3中。

您的Quartz作业不需要是Servlet! 您可以在数据库中保留传入的作业,并在主Servlet启动时启动Quartz。 Quartz Job可以是一个简单的POJO,并定期检查DB是否有任何作业。

但是,我建议你看一下Spring。 在Tomcat中学习并轻松设置并不难。 您可以在Spring参考文档中找到许多有用的信息。 它具有Quartz集成,比手动操作容易得多。

一个不需要你进行大量设计和编程的合适解决方案是创建稍后在servlet中需要的对象,并将其序列化为字节数组。 然后将它放在数据库的BLOB字段中并完成它。

然后你的处理线程可以只读取内容,反序列化它并使用ressurrected对象。

但是,您可以通过描述您的系统实际需要的内容来获得更好的答案:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM