我正在使用Java8和Spring4.3.1。从Spring启动运行Java类
我有一个Java/Spring应用程序托管浏览器和移动应用程序客户端访问的RESTfult服务。其次,我写了一个聊天服务器来监听来自客户端的事件(socket.io
)。此聊天服务器正在从类main
方法运行。
聊天服务器类有一个main
方法,我想运行,并允许在我的Spring应用程序启动时监听事件。这可能吗?
如果我自己运行main
,它可以正常工作,但我希望它在启动加载Spring应用程序的Wildfly服务器时启动。
还是有更好的方法?聊天服务器是否不能从main
方法运行?
我有以下代码:
package com.jobs.spring.configuration;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;
public class WebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(AppConfig.class);
ctx.setServletContext(servletContext);
Dynamic dynamic = servletContext.addServlet("rest", new DispatcherServlet(ctx));
dynamic.addMapping("/*");
dynamic.setLoadOnStartup(1);
try {
com.jobs.spring.chat.Server chatServer = new com.jobs.spring.chat.Server();
chatServer.run(null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
和
public class Server implements CommandLineRunner {
private static final String SERVER = "localhost";
private static final Integer PORT = 3700;
@Override
public void run(String... args) throws Exception {
main(args);
}
public static void main(String[] args) {
...
,并出现以下错误:
18:47:08,142 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 66) MSC000001: Failed to start service jboss.undertow.deployment.default-server.default-host./jbosswildfly: org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./jbosswildfly: java.lang.NoClassDefFoundError: Failed to link com/jobs/spring/chat/Server (Module "deployment.jbosswildfly.war:main" from Service Module Loader): org/springframework/boot/CommandLineRunner
Caused by: java.lang.NoClassDefFoundError: Failed to link com/jobs/spring/chat/Server (Module "deployment.jbosswildfly.war:main" from Service Module Loader): org/springframework/boot/CommandLineRunner
这种感觉就像你在这里混了一大堆不同的启动模式。此服务器的目的是通过Web运行吗?如果没有,为什么servlet?如果是这样,明显的“侧面”插座有什么用? – chrylis
聊天服务器需要运行才能听取事件。我有一个使用sockets.io发送消息的Ionic移动应用程序。如果我从cmd行运行聊天服务器,它可以很好地工作,但我有另一个Java应用程序运行带有RESTful服务的Spring。当这个Java应用程序启动时,我也想启动聊天服务器。 RESTful服务和聊天服务器都需要通过浏览器和移动应用程序进行访问。 – Richard
也许我正在接近这个错误,但我在这里提供建议。 – Richard