2015-11-09 10 views
5

私のプロジェクトでは、SpringBootによって作成されました。複数の@SpringBootApplicationプロジェクトの注釈

@SpringBootApplicationで2つのメインクラスを追加しました。

STSを使用すると、デバッグを開始するときに1つのメインアプリケーションを選択できるためです。

しかし、SpringDemoApplicationは起動していますが、RabbitMQApplicationも実行されています。

この仕様は?適切に働く?

ここでは、これが https://github.com/MariMurotani/SpringDemo/tree/6_rabbitMQ

enter image description here

SpringDemoApplication

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); 

    } 
} 

RabbitMQApplication

package demo; 

import java.util.Date; 

import org.codehaus.jackson.map.ObjectMapper; 
import org.springframework.amqp.core.Binding; 
import org.springframework.amqp.core.BindingBuilder; 
import org.springframework.amqp.core.Queue; 
import org.springframework.amqp.core.TopicExchange; 
import org.springframework.amqp.rabbit.connection.ConnectionFactory; 
import org.springframework.amqp.rabbit.core.RabbitTemplate; 
import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; 
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; 
import org.springframework.context.annotation.Bean; 

import demo.configs.Const; 
import demo.dto.Mail; 

@SpringBootApplication 
public class RabbitMQApplication implements CommandLineRunner { 

@Autowired 
ApplicationContext context; 


@Autowired 
RabbitTemplate rabbitTemplate; 

@Bean 
Queue queue() { 
    return new Queue(Const.RabbitMQMessageQue, false); 
} 

@Bean 
TopicExchange exchange() { 
    return new TopicExchange("spring-boot-exchange"); 
} 

@Bean 
Binding binding(Queue queue, TopicExchange exchange) { 
    return BindingBuilder.bind(queue).to(exchange).with(Const.RabbitMQMessageQue); 
} 

@Bean 
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory) { 
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); 
    container.setConnectionFactory(connectionFactory); 
    container.setQueueNames(Const.RabbitMQMessageQue); 
    //container.setMessageListener(listenerAdapter); 
    return container; 
} 

/* 
For asyncronized receiving 

@Bean 
Receiver receiver() { 
    return new Receiver(); 
} 

@Bean 
MessageListenerAdapter listenerAdapter(Receiver receiver) { 
    return new MessageListenerAdapter(receiver, "receiveMessage"); 
}*/ 

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++){ 
      String object = (String)rabbitTemplate.receiveAndConvert(Const.RabbitMQMessageQue); 
      if(object != null){ 
       try{ 
        System.out.println(new Date().toGMTString() + ": " + object); 
        ObjectMapper mapper = new ObjectMapper(); 
        Mail mail = mapper.readValue(object, Mail.class); 
        System.out.println(mail.getToAddress() + " , " + mail.getStrContent()); 
       }catch(Exception e){ 
        System.out.println(e.getMessage()); 
       } 
      } 
     } 
     Thread.sleep(10000); 
    } 
} 
} 
を再現するサンプルです

答えて

9

@SpringBootApplication注釈は、@Configuration@EnableAutoConfiguration、および@ComponentScanのショートカット注釈です。

http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

@ComponentScanのデフォルトの動作は@Configuration@Component同じパッケージ内のクラスと注釈付きクラスのすべてのサブパッケージを探すことです。すべてのクラスは同じパッケージになっているので、いずれかのクラスを起動すると、他のクラスを見つけて@Configurationクラスのように扱い、豆などを登録します。

そう、セットアップ。ローカルテストのためにこれを行わない場合は、それぞれの@SpringBootApplicationクラスを別々のサブパッケージに入れてください。これがある時点でデモを越える場合は、おそらくより良い設定を考え出すことになります(おそらくそれぞれ@SpringBootApplicationのサブプロジェクト)。

関連する問題