spring boot 整 jms

摘要:我们这里用我们本地自己的activemq服务器,spring boot自带了

1.添加 maven jar
其他基本配置可以参考我那篇spring boot环境搭建

         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-activemq</artifactId>
        </dependency>
    <!--本地activemq依赖-->
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-pool</artifactId>
       </dependency>

2.application.properties配置

spring.activemq.broker-url = tcp://0.0.0.0:61616
spring.activemq.user = username
spring.activemq.password = pwd
spring.activemq.in-memory = false
spring.activemq.pool.enabled = true

3.生产者 Producer

@Component
@EnableScheduling
public class Producer {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Scheduled(fixedDelay=3000)
    public void send() {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        String format = simpleDateFormat.format(date);
        this.jmsMessagingTemplate.convertAndSend(test.queue, format);
    }

}

@EnableScheduling 注解的作用是发现注解@Scheduled
@Scheduled 是启动后定时执行某个任务 例如 上面是 3s 执行一次send()

4.Consumer 消费者

@Component
public class Consumer {

  @JmsListener(destination = "test.queue")
  public void receiveQueue(String text) {
        System.out.println("收到queue的消息:"+text);
  }
}

注意,默认是发送queue消息,如想把消息发到topic里去

5.消息发送至 topic

只需把 spring.jms.pub-sub-domain=true 加入到 application.properties文件中,其他都不变
但是要共存呢,queue 和 topic 都有需求,看底下

6.queue和topic共存

这时候我们改一下代码,可以直接把前面加的 spring.jms.pub-sub-domain=true注释掉
我们先新建一个jms配置类 JmsConfig

@Configuration  //beans
@EnableJms  // JMS注解的支持
public class JmsConfig {

    private DefaultJmsListenerContainerFactory factory;

    @Bean  //bean
    public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) {
        factory = new DefaultJmsListenerContainerFactory();
        factory.setPubSubDomain(true);
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }

    @Bean
    public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) {
        factory = new DefaultJmsListenerContainerFactory();
        factory.setPubSubDomain(false);
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }
}

再是 生产者

@Component
@EnableScheduling
public class Producer2 {

    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;

    @Scheduled(fixedDelay=3000)
    public void send() {
         DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime date = LocalDateTime.now();
        String str = date.format(format);
        Destination queue = new ActiveMQQueue("test.queue");
        Destination topic_one = new ActiveMQTopic("test.topic_one");
        Destination topic_two = new ActiveMQTopic("test.topic_two");
        this.jmsMessagingTemplate.convertAndSend(queue, str);
        this.jmsMessagingTemplate.convertAndSend(topic_one, str);
        this.jmsMessagingTemplate.convertAndSend(topic_two,"test topic_two");
    }

}

最后是消费者 containerFactory 对应是的是 JmsConfig类的方法名

@Component
public class Consumer2 {

    @JmsListener(destination = "test.topic_one,test.topic_two",containerFactory="topicListenerFactory")
    public void topic(String msg) {
        System.out.println("topic:"+msg);
    }

    @JmsListener(destination = "test.queue",containerFactory="queueListenerFactory")
    public void queue(String msg) {
        System.out.println("queue:"+msg);
    }
}

这里注意的是,订阅多个topic,直接往后面添加即可

开启启动类,控制台打印如下

这里写图片描述

如图所示,queue和topic的消息都接收到了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值