gpt4 book ai didi

java - 使用嵌入式 Jetty 提供的 GWT 前端运行 Java 守护进程

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:04:09 25 4
gpt4 key购买 nike

问候,编码员,

背景信息和代码

我正在尝试创建一个由 GWT 应用程序(WAR 中的 servlet)管理的守护程序类型的程序(例如,它不断运行,轮询要做的事情),而 GWT 应用程序又由嵌入式 Jetty 服务器提供服务(使用 WebAppContext)。我在让 GWT 应用程序识别守护进程对象时遇到问题。

为了测试,我目前有两个项目:一个是守护进程和嵌入式 Jetty 服务器 (EmbJetTest),另一个是 GWT 应用程序 (DefaultApp)。这是代码的当前状态:

首先,EmbJetTest 创建一个嵌入式 Jetty 服务器,使用 ServletContextListener 将守护进程对象注入(inject)到 Web 应用程序上下文中:

    EmbJetTest.server = new Server(8080);

// Create and start the daemon
Daemon daemon = new Daemon();
Thread thread = new Thread(daemon);
thread.start();

// war handler
WebAppContext waContext = new WebAppContext();
waContext.setContextPath("/webapp");
waContext.setWar("./apps/DefaultApp.war");
waContext.addEventListener(new DaemonLoader(daemon));

// Add it to the server
EmbJetTest.server.setHandler(waContext);

EmbJetTest.server.setThreadPool(new QueuedThreadPool(10));

// Start the server; join() blocks until we shut down
EmbJetTest.server.start();
EmbJetTest.server.join();

// Stop the daemon thread
daemon.stopLoop();

Daemon 目前是一个非常简单的对象,具有几个属性。 DaemonLoader 是下面的ServletContextListener 实现:

private Daemon daemon;

public DaemonLoader(Daemon daemon)
{
this.daemon = daemon;
}

@Override
public void contextDestroyed(ServletContextEvent arg0) {

}

@Override
public void contextInitialized(ServletContextEvent arg0) {
arg0.getServletContext().setAttribute("daemon", this.daemon);
}

然后,在 GWT 应用程序的一个 servlet 中,我有以下代码:

Daemon daemon = (Daemon) this.getServletContext().getAttribute("daemon");

但是,当我访问 localhost:8080/webapp/* 并调用 servlet 时,此代码会抛出 ClassCastException,即使这些类属于同一类型。 This StackOverflow answer表明这是因为这两个类加载了不同的类加载器。

问题

我的问题是双重的。

  1. 我走在正确的轨道上了吗?我会以完全错误的方式解决这个问题吗?有些东西告诉我我是,但我想不出另一种方法让守护进程对两个应用程序都可用。有没有更好的方法从 GWT 应用程序与守护进程通信? GWT 应用程序是否应该拥有守护程序并以某种方式启动守护程序本身?即使没有人访问 GWT 应用程序的 servlet 之一,守护进程也需要运行——我该怎么做?
  2. 如果我走在正确的轨道上,我该如何解决类加载器问题?

提前致谢。

最佳答案

为什么不在 GWT Web 应用程序 的单独线程中运行守护进程的功能?这样你就可以避免所有的类加载问题(正如你所发现的,不同 .war 文件中的应用程序在它们自己的类加载器中运行)。

只需在现有的 servlet 旁边为您的守护程序创建一个 servlet(在相同的 .war 中),并在 servlet 初始化和销毁​​时启动/停止线程。

关于java - 使用嵌入式 Jetty 提供的 GWT 前端运行 Java 守护进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2533892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com