【问题标题】:Tomcat Cluster 6 and ContextListenerTomcat 集群 6 和 ContextListener
【发布时间】:2012-06-29 07:53:42
【问题描述】:


在 Tomcat 的单个实例上,我有一个在初始化上下文时启动的线程。像这样:

public class MyContextListener implements ServletContextListener {
private MyThread thread = null;

@Override
public void contextInitialized(ServletContextEvent sce) {
    //Start thread...
}

@Override
public void contextDestroyed(ServletContextEvent sce) {
    //Stop thread...
}
}

该线程每 10 分钟执行一次系统中的一些重要工作,并且运行良好。

现在我已切换到 tomcat 实例的集群,并且该线程在两个实例上运行。我正在尝试实现不同的行为。

我想要达到的目标:

  • 该线程当时应该只在一个实例上运行。
  • 如果第一个实例失败(在哪个线程上运行),则应在第二个实例上启动线程。

如有任何提示,我将不胜感激。

我的应用程序逻辑是什么?
线程执行的应用逻辑如下:

  1. 从 DB 中读取。
  2. 分析数据库信息。
  3. 如果需要,向外部系统发出 HTTP 请求。
  4. 让线程再休眠 10 分钟。

关键是:如果我有 2 个 tomcat 实例,那么只有一个应该执行这个逻辑

【问题讨论】:

  • 我猜你实际上在做的是纯粹的应用程序逻辑,我假设(你没有提到)你没有使用任何底层基础设施组件(如会话等)由 Tomcat 本身管理以实现您想要做的事情。因此,集群本质上支持这一点的可能性最小。
  • 感谢您的回答。我不使用会话。线程执行的应用程序逻辑如下: 1. 从数据库中读取某事。 2.分析DB信息。 3. 如果需要,向外部系统发出 HTTP 请求。 4. 再休眠线程 10 分钟。关键是:如果我有 2 个 tomcat 实例,那么只有一个应该执行这个逻辑。

标签: java tomcat replication cluster-computing


【解决方案1】:

如果我理解正确,您在使用 web-application-server 时实际上是不允许在应用程序中启动新线程的。所有线程都必须由应用服务器管理。

【讨论】:

    猜你喜欢
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多