前回、RabbitMQの実装をしていて気づいたのですが、
@SpringBootApplicationアノテーションを付与したmainメソッドを持つクラスを1つのProjectに2つ用意した場合に同時に動くという事がわかりました。
知らないで利用しているとちゃんと動いているのか不安になるのですが、知っていればフロントエンドとバックエンドを一つのインスタンスでまかなえるという事に気づいたりします。
STSではメインメソッドが複数ある場合に下記のように選択でき、build.gradleでも起動時のメインメソッドを指定できるので、サンプル用に1つのプロジェクト内に沢山のメインメソッドを入れていました。
こっちがもともとあるフロント用のクラスです。
@SpringBootApplicationが
@Configuration,@EnableAutoConfiguration,@ComponentScanを呼び出します。
@ComponentScanで@Componentを全部使えるようにしてくれるので、@Componentを含む@Controllerが有効になります。
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class SpringDemoApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(SpringDemoApplication.class);
ApplicationContext context = application.run(args);
}
}
あとから、バックグラウンド用の処理に追加したクラス。
タイマーなどを組み合わせるとより正確に定期実行のタスクを簡単にプロジェクト内に組み込む事ができます。
ウェブの機能が入っているのと同じJARファイル内で動いています。
package demo;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class BackgroundTasks implements CommandLineRunner {
@Autowired
ApplicationContext context;
public static void main(String[] args) throws InterruptedException {
SpringApplication.run(RabbitMQApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
System.out.println("Waiting five seconds...");
while(0 < 1){
for(int i = 0 ; i < 5 ; i++){
System.out.println(new Date().toGMTString() + ": " + String.valueOf(i));
}
Thread.sleep(10000);
}
}
}
訂正
@SpringBootApplicationではなく、
@ComponentとCommandLineRunnerが実装されている場合に、同じインスタンス内で起動してるみたいです。