我有一个Web应用程序从数据库中检索(大)结果列表,然后需要通过查看每个结果削减列表,并抛出“无效”的结果.使结果“无效”的参数是动态的,我们无法将工作传递给数据库.
因此,一个想法是创建一个线程池和ExecutorService并同时检查这些结果.但我一直看到人们说“哦,规范禁止在servlet中产生线程”或“这只是一个坏主意”.
所以,我的问题是:我该怎么办?我在一个servlet 2.5容器中,所以作为3.0规范的一部分的所有异步的好东西都无法使用.编写一个我通过JMS与之通信的单独服务似乎有点矫枉过正.
在这里寻找专家意见.
贾森
JEE规范有很多“不应该”和“你不要”.另一方面,Servlet规范没有. Servlet规范更加狂野.它实际上并没有像JEE规范那样深入到实际操作方面.
我还没有看到一个JEE容器(一个纯粹的servlet容器,一个Tomcat / Jetty,或者全船ala Glassfish / JBoss)实际上阻止了我自己开出一个线程. WebSphere可能,它应该是相当臭名昭着的,但我没有使用过WebSphere.
如果创建不守规矩,自我管理的线程的概念让你发痒,那么完整的JEE容器内部有一个正式的“WorkManager”,可以用来剥离线程.他们只是以不同的方式揭露它们.这是获取线程的“通过书籍 – 机制”的更多机制.
但是,坦率地说,我不会打扰.使用标准类库中的Executors可能会获得更多成功.如果你的系统太多线程使你的系统饱和,一切都失控了,好吧,那就在你身上.不要那样做(tm).
至于异步解决方案是否合适,我会对此进行讨论.从你的帖子中不清楚它是否存在.但你的问题是线程和Servlet.
去做就对了.请注意它“可能不便携”,做得对(使用执行程序),对此负责,容器不会更明智,也不关心.