2016-08-30 23 views
2

Java8とSpring4.3.1を使用しています。SpringスタートアップからJavaクラスを実行します。

ブラウザとモバイルアプリケーションクライアントがアクセスするRESTfultサービスをホストするJava/Springアプリケーションがあります。次に、クライアントからのイベント(socket.io)を受信するチャットサーバーを作成しました。このチャットサーバーはクラスmainメソッドから実行されています。

チャットサーバークラスは、私が実行したい、そしてSpringアプリケーションの起動時にイベントを待ち受けることができるmainメソッドを持っています。これは可能ですか?

自分でmainを実行すると動作しますが、SpringアプリケーションをロードするWildflyサーバーを起動するときに起動します。

さらに良い方法がありますか? Chatサーバーは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上で実行されるのですか?そうでない場合、なぜサーブレットですか?もしそうなら、明らかに「側にある」ソケットには何がありますか? – chrylis

+0

チャットサーバーは、イベントを受信するために実行する必要があります。私は、socket.ioを使ってメッセージを送るIonic Mobile Appを持っています。私がcmdの行からチャットサーバーを実行すると、それは完全に動作しますが、RESTfulなサービスでSpringを実行する別のJavaアプリケーションがあります。このJavaアプリケーションが起動すると、チャットサーバーも起動します。 RESTfulなサービスとチャットサーバーの両方は、ブラウザとモバイルアプリからアクセスする必要があります。 – Richard

+0

おそらく私はこれに間違って近づいていますが、私はアドバイスのためにここにいます。 – Richard

答えて

0

をあなたはSpringBootServletInitializerを拡張することにより、Wildflyにチャットサーバーを展開することができ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> 

春はwildflyためpom.xmlの春のブート例を提供する:あなたは、ここでは異なるランチャーパターンの全体の束を混合しているようspring-boot-deployment-test-wildfly

+0

ありがとう、私はそれを試してみましょう。 – Richard

+0

アレックス、これは私の終了Javaアプリとは別の戦争ですか?私は、同じアプリケーションからチャットサーバーを実行することをお勧めします。私は既存のSpringアプリケーションで 'SpringBootApp'クラスを作成しようとしますが、SpringBootは起動しますが、次のエラーが発生します:' StartException in service jboss.undertow.deployment.default-server.default-host./jbosswildfly:java.lang。 RuntimeException:java.lang.ClassCastException:org.apache.tomcat.websocket.server。WsServerContainerをio.undertow.websockets.jsr.ServerWebSocketContainer'にキャストすることはできません。新しい不足している/依存しない依存関係: – Richard

+0

は答えを更新しました – alexbt

関連する問題