2016-08-30 75 views
2

我正在使用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 
+0

这种感觉就像你在这里混了一大堆不同的启动模式。此服务器的目的是通过Web运行吗?如果没有,为什么servlet?如果是这样,明显的“侧面”插座有什么用? – chrylis

+0

聊天服务器需要运行才能听取事件。我有一个使用sockets.io发送消息的Ionic移动应用程序。如果我从cmd行运行聊天服务器,它可以很好地工作,但我有另一个Java应用程序运行带有RESTful服务的Spring。当这个Java应用程序启动时,我也想启动聊天服务器。 RESTful服务和聊天服务器都需要通过浏览器和移动应用程序进行访问。 – Richard

+0

也许我正在接近这个错误,但我在这里提供建议。 – Richard

回答

0

你可以在Wildfly部署聊天服务器,通过扩展SpringBootServletInitializer ,而不是从main启动它。

文档:howto-create-a-deployable-war-file

@SpringBootApplication 
public class SpringBootApp extends SpringBootServletInitializer{ 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 
     return builder.sources(SpringBootApp.class); 
    } 

    //public static void main(String[] args){ 
    // new SpringApplicationBuilder() 
    // .sources(SpringBootApp.class) 
    // .run(args); 
    //} 
} 

变化神器产生的war,并在wildfly通常部署:

<project> 
    <packaging>war</packaging> 
    ... 
<project> 

您可能需要排除的Tomcat,这是自动进口spring-boot-starter-web

<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
    <exclusions> 
     <exclusion> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-tomcat</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Spring为wildfly提供pom.xml的弹簧引导例如:spring-boot-deployment-test-wildfly

+0

谢谢,我会试试看。 – Richard

+0

亚历克斯,这是一个从我的退出Java应用程序单独的战争?最好我想从同一个应用程序运行聊天服务器。我尝试在我现有的Spring应用程序中创建'SpringBootApp'类,并且Spring Boot启动,但是接着出现以下错误:'服务jboss.undertow.deployment.default-server.default-host./jbosswildfly:java.lang中的StartException。 RuntimeException:java.lang.ClassCastException:org.apache.tomcat.websocket.server。WsServerContainer无法转换为io.undertow.websockets.jsr.ServerWebSocketContainer'和'New missing/unsatisfied dependencies:' – Richard

+0

更新了答案 – alexbt