Springboot2(42)集成activemq

版权声明:转载请注明出处 https://blog.csdn.net/cowbin2012/article/details/89318005

源码地址

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


}

猜你喜欢

转载自blog.csdn.net/cowbin2012/article/details/89318005