编程语言
首页 > 编程语言> > 在嵌入式Jetty的GWT前端上运行Java守护程序

在嵌入式Jetty的GWT前端上运行Java守护程序

作者:互联网

问候,编码员,

背景信息和代码

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

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

首先,EmbJetTest像这样创建一个嵌入式Jetty服务器,使用ServletContextListener将守护程序对象注入到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();

目前,守护程序是一个非常简单的对象,具有几个属性. 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表示这是因为两个类使用不同的类加载器加载.

我的问题是双重的.

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

提前致谢.

解决方法:

为什么不只在GWT Web应用程序的单独线程中运行守护程序的功能?这样,您将避免所有的类加载麻烦(如您所知,不同.war文件中的应用程序在其自己的类加载器中运行).

只需为守护程序和现有servlet(在同一.war中)创建一个servlet,然后在servlet初始化和销毁​​上启动/停止线程.

标签:daemon,java,gwt,classloader
来源: https://codeday.me/bug/20191210/2099717.html