我正在使用JavaEE 5应用程序,我需要创建一个任务,定期查询数据库中的某些信息,然后将结果提供给jsp页面。
所有页面请求的结果都相同,只需要定期更新。在下一次更新准备好之前,Web组件应该可以使用给定的结果。如果在请求页面时没有可用的结果,则只是赢得不显示它(页面不等待结果)。所以我有一个查询数据库和多个消费者的生产者,只检查结果是否可用,如果不可用则继续。
在Java SE环境中,我只是创建一个新线程并将结果放在一个共享的线程安全对象中,但我读到在Java EE容器中手动生成线程不是一个好主意。
所以我的问题是:
如何安排bean每隔x分钟进行一次数据库查询?定时服务是JavaEE 5的一个很好的解决方案吗?
与Web组件共享查询结果的最佳方法是什么?我应该将它们放在servlet上下文中吗?企业bean甚至可以写信吗?
答案 0 :(得分:0)
我不太了解你的要求,但定期查询是一个非常糟糕的主意,只是用新信息刷新网页,这会扼杀你的应用程序性能,并将其存储在servlet上下文中甚至是最糟糕的。 您可以做的是调度事件,当一个实体被创建/更新,并且您更改查询时,您可以使用websockets在页面中添加此信息,甚至不刷新页面,并且具有数千个性能因素,这可以完成与所有客户端连接,甚至由同一主题的客户端进行过滤。
或者您可以使用ajax定期检查信息是否发生变化,并且仅在需要时获取该信息,这不会扩展为websocket,但如果您不能使用它,则是更好的选择。
但是我有使用Java EE 6的经验,5我不认为你有CDI事件和拦截器,但你可以使用观察者模式,只是实现。在这种情况下,CDI拦截器非常有用,因为您可以以中心方式拦截事件,然后处理该信息并使用任何技术发送给客户端,在这种情况下,websocket最适合。
答案 1 :(得分:0)
您可以使用像Quartz http://quartz-scheduler.org/这样的作业调度程序,并将其嵌入到您的jsp或servlet中。
http://www.easywayserver.com/blog/java-job-scheduling-in-web-application-with-quartz-api/