Servlet容器中的起始脉冲流动

我有一个servlet S, 从第三方网站处理回调。

回调以一定的顺序发生。 所以,我需要把它们放在队列中。

例如,我建议使用内存中的队列


java.util.ConcurrentLinkedQueue


所以逻辑看起来像这样:

servlet. S 获得回调 & 将生成的元素放在队列中 Q.

到这个时候,servlet实例所在的流 S, 应该完成。

消费者流读取数据 Q 它一直处理它们中的每一个。

据我所知,Servlet的每一个例子 S 在自己的流中进行。

如何为整个Web应用程序创建一个消费者流 /war/, 这将用于队列 ? 我基本需要 singleton 实例:

班级 ThreadPool

ConcurrentLinkedQueue
已邀请:

郭文康

赞同来自:

这不是Servlet容器的意图。 您真的需要一个更完整的应用程序服务器 J2EE, 如果您要使用基于标准的方法。 否则,您将拥有哈卡,但他们可以足够的任务。

我可能会尝试做什么 - 这是为了创造 DaemonServlet. 它只是一个与之相关的普通servlet URL /除了可能是盲目的 URL 为了监测目的,虽然对于这样的事情是优选的 JMX/. 方法
init//

加载servlet时调用。 您可以在此启动线程。 您可能必须创建两个:执行此工作的两个: 另一个确保第一个有效,并在调用时立即透明地完成它
destroy//

.

或者,如果你使用
http://www.springsource.org/
/让我们来看看真相,什么样的精神病学不使用 Spring?/, 您可以简单地在应用程序的上下文中创建一个bob,这几乎相同,除了生命周期事件 Spring /例如, afterPropertiesSet// 在 InitializingBean/.

事实上,我有另一个最好的交易。 使用
http://static.springframework. ... ption
, 这将是更清洁和可扩展的,但它是基于解决的 JMS, 而且不仅仅是
LinkedBlockingQueue

/和 JMS, 可能在任何情况下都更好/. 但是,根据您的限制,您可能没有 JMS 作为一种选择。

卫东

赞同来自:

记住这一点 servlets 在单独的流中,它们是一份副本 VM, 因此,他们生活在整体记忆空间中。 如果您创建一个实例 Singleton, 它将自动变得普遍 servlets. 您还可以创建一个单独的servlet来用作常见数据,这具有您可以使用容器服务来保存它们的优势。

有一种彻底的研究在技术上被称为这样做的方法 "servlet collaboration"-在书里 OReilly 根据互联网上可用的Servlets编程
http://books.huihoo.org/oreill ... 3.htm
.

石油百科

赞同来自:

哦,另一个想法:唯一的事情

不想做

, 它是尝试在servlet容器内控制自己的流池; 他可以比你更好地制作流池 UNLESS 你带他。

喜特乐

赞同来自:

我支持一个评论,它说管理自己的子弹流障碍。

Servlets 专为处理而设计 HTTP 要求。 HTTP是同步查询协议 / 回答。 如何联系它们的逻辑,位于其他地方。 此处理程序可以是同步或异步的,但它应该取决于处理程序的实现。 servlet必须决定应为此响应推迟哪个处理程序,这是它。

即使你使用 Tomcat 或servlet引擎/JSP, 你仍然可以使用 Spring, JMS 和 MDPs, 添加 ActiveMQ 到它的实施 Tomcat.

风见雨下

赞同来自:

我创建了听众 ThreadPool, 我可以与过时的应用集成 Tomcat, 使用 ServletContext 用于存储 ThreadPool 并允许侦听器管理生命周期,使其不会延迟。


@WebListener
public class MyThreadPool implements ServletContextListener {

private static final String CONTEXT_ATTRIBUTE = "MyThreadPool";
private ExecutorService myThreadPool;

@Override
public void contextInitialized/ServletContextEvent sce/ {
myThreadPool = Executors.newFixedThreadPool/10/;
sce.getServletContext//.setAttribute/CONTEXT_ATTRIBUTE, myThreadPool/;
}

public static ExecutorService getPool/Servlet servlet/ {
return /ExecutorService/ servlet.getServletConfig//
.getServletContext//.getAttribute/CONTEXT_ATTRIBUTE/;
}

@Override
public void contextDestroyed/ServletContextEvent sce/ {
myThreadPool.shutdown//;
sce.getServletContext//.removeAttribute/CONTEXT_ATTRIBUTE/;
}
}

要回复问题请先登录注册