在嵌入式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