我们要求用户以各种格式生成搜索结果导出。问题是导出的大小可能会有所不同,需要几秒到几分钟才能完成。我希望允许用户能够在运行时触发请求并继续执行其他操作,但我不希望在必要时使用后台线程来削弱Web应用程序服务器的性能。
我最初的想法是将Web应用程序和生成过程分离。我可以将JMS与消息驱动bean(MDB)一起使用,该bean处理与Web应用程序分开部署的文件生成;允许根据未来需求单独扩展。
从技术上讲,我看到Web应用程序维护了一个已启动并发送JMS消息的请求列表。当MDB完成时,它会将更新发送回Web应用程序侦听的队列,并相应地使用状态和文件URI信息更新请求列表。当用户想要下载他们请求的生成文件时,该文件将流式传输到浏览器然后被删除。
作为一项额外的预防措施,MDB还会将延迟消息发送到清理队列,在延迟过期后,MDB会检查生成的文件的URI,如果它继续存在,则删除该文件并通知Web应用程序因此可能会相应地更新它的内部列表,方法是删除它或将其标记为已自动删除。
这里的美妙之处在于,如果我需要增加并发导出作业的数量,我可以轻松生成另一个JMS客户端进程或调整现有进程以运行更多并发MDB处理程序,而无需触及Web应用程序本身。
我很好奇是否还有其他我可以忽略的选择,我应该考虑的问题,或者这是否是一个过去曾为其他人工作的可靠解耦解决方案。
答案 0 :(得分:1)
根据您的情况,我会使用会话bean。
或者JMX设置为工作,但它们是传统方式。我不喜欢jmx。
但是,只是为了让你知道这些是有限的报告和每天需要一次,简单的形式是使用石英工作,但我认为你不能同时运行多个工作。
有石英作业设置,可以轻松设置,你可以从你的应用程序中触发它,如果你想要一些清理,你可以创建多个工作和智能,你可以让他们依赖。 你可以参考here进行石英设置。