Springboot2(42)集成activemq

源碼地址

springboot2教程系列

activemq安裝

引入依賴

<!-- activemq自動配置依賴 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-activemq</artifactId>
 </dependency>

<!-- 連接池依賴 -->
 <dependency>
     <groupId>org.apache.activemq</groupId>
     <artifactId>activemq-pool</artifactId>
 </dependency>

 <!-- 如果springboot是2.x.x的版本如果啓用連接池(spring.activemq.pool.enabled=true),就必須引入這個依賴,否則啓動時會報錯,提示找不到JmsMessagingTemplate
      springboot是1.5.x的版本就不需要引入,
      這是因爲springboot1.5.x使用的是org.apache.activemq.pool.PooledConnectionFactory,
      而springboot2.x.x時候用的org.messaginghub.pooled.jms.JmsPoolConnectionFactory,
      可以通過源碼查看:
      org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionFactoryConfiguration : 負責初始化ConnectionFactory
      org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration  : 負責初始化JmsMessagingTemplate -->
 <dependency>
     <groupId>org.messaginghub</groupId>
     <artifactId>pooled-jms</artifactId>
     <version>1.0.3</version>
 </dependency>

配置文件

#spring.activemq.broker-url: tcp://localhost:61616
spring.activemq.broker-url: failover:(tcp://10.10.2.137:61616,tcp://10.10.2.138:61616,tcp://10.10.2.139:61616)
spring.activemq.user: admin
spring.activemq.password: admin
#啓用連接池
spring.activemq.pool.enabled: true
#最大連接數
spring.activemq.pool.max-connections: 100

配置類

@Configuration
@EnableJms //啓用jms功能
public class ActiveMqConfig {

    //如果要使用topic類型的消息,則需要配置該bean
    @Bean("jmsTopicListenerContainerFactory")
    public JmsListenerContainerFactory jmsTopicListenerContainerFactory(
            ConnectionFactory connectionFactory){
        DefaultJmsListenerContainerFactory factory
                = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory);
        factory.setPubSubDomain(true); //這裏必須設置爲true,false則表示是queue類型
        return factory;
    }


    @Bean
    public Queue queue() {
        return new ActiveMQQueue("springboot.queue") ;
    }

    @Bean
    public Topic topic() {
        return new ActiveMQTopic("springboot.topic") ;
    }

    @Bean("queuereply")
    public Queue queuereply() {
        return new ActiveMQQueue("springboot.queuereply") ;
    }


}

消費者類

@Component
public class Consumer {
    //監聽隊列,queue類型
    @JmsListener(destination="springboot.queue")
    public void receiveQueue(String text){
        System.out.println(this.getClass().getName()+ "收到的報文爲:"+text);
    }

    //監聽隊列,topic類型,這裏containerFactory要配置爲jmsTopicListenerContainerFactory
    @JmsListener(destination = "springboot.topic",
            containerFactory = "jmsTopicListenerContainerFactory"
    )
    public void receiveTopic(String text) {
        System.out.println(this.getClass().getName()+" 收到的報文爲:"+text);
    }


    @JmsListener(destination="springboot.queuereply")
    @SendTo("out.replyTo.queue") //消費者應答後通知生產者
    public String receiveQueueReply(String text){
        System.out.println(this.getClass().getName()+ "收到的報文爲:"+text);
        return "out.replyTo.queue receiveQueueReply";
    }
}

生產者類

@Component
public class Producer {

    @Autowired
    private Queue queue;

    @Autowired
    private Topic topic;

    @Autowired
    private Queue queuereply;

    @Autowired
    private JmsMessagingTemplate jmsTemplate;

    // 發送消息,destination是發送到的隊列,message是待發送的消息
    public void sendMessage(Destination destination, final String message){
        jmsTemplate.convertAndSend(destination, message);
    }

    public void sendQueueMessage(final String message){
        sendMessage(queue, message);
    }

    public void sendTopicMessage(final String message){
        sendMessage(topic, message);
    }

    public void sendQueueMessageReply(final String message){
        sendMessage(queuereply, message);
    }

    //生產者監聽消費者的應答
    @JmsListener(destination = "out.replyTo.queue")
    public void consumerMessage(String text){
        System.out.println("從out.replyTo.queue收到報文"+text);
    }

}

controller層(測試)

@RestController
public class ActivemqController{

    @Autowired
    Producer producer;

    @RequestMapping("/send/{msg}")
    public String  send(@PathVariable String msg){
        Destination destination = new ActiveMQQueue("springboot.queuereply");
        producer.sendMessage(destination, msg);

        //按隊列發送消息
        producer.sendQueueMessage("queue:"+msg);
        //按topic發送消息
        producer.sendTopicMessage("topic:"+msg);
        //發送應答消息
        producer.sendQueueMessageReply("reply:"+msg);

        return msg;
    }


}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章