SpringBoot整合activeMq消息中间件

消息中间件常用的两个是activeMq以及rabbitmq,这里介绍的只是springBoot整合activeMq实现邮件发送的一个方式
activeMq的项目主要有两个部分,一个是消费者另一个就是消息的生成者,生成者也就是项目中的消费者部分进行的业务逻辑处理的部分,通过将这部分数据发送到activeMq中进行队列或者主题排队,依次分发队列或者统一分发给每一个队列,进行数据消费,实现业务处理功能
安装好activeMq之后,只需要在SpringBoot中进行配置好连接信息,对于发送邮件的其他使用规则,可以参考本人的邮件发送使用(springMVC整合的)虽然是springMVC的,但是使用规则与在SpringBoot中也是差不多的,我这里也会附上代码,供大家参考
activeMq的消费者端代码(consumer)

package com.active.consumer;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.stereotype.Component;

import javax.jms.*;

/**
 * @description:  队列消息消费端   (点对点消费端)
 * @author: liuhui
 * @createDate: 2020/3/27
 * @version: 1.0
 */
@Component
public class Consumer {
//    @JmsListener(destination = "${my_queue}")
//    public void receive(String msg){
//        System.out.println("点对点模式成功获取消息  msg:"+msg);
//    }
//    @Autowired
//    JavaMailSender javaMailSender;      /*邮件发送类*/
//    @JmsListener(destination = "${my_topic}")
//    public void receive(String msg){
//        if(StringUtils.isEmpty(msg)) return;
////        转json
//        JSONObject jsonObject = new JSONObject().parseObject(msg);
////        获取json数据
//        String userName = jsonObject.getString("userName");
//        String email = jsonObject.getString("email");
//        sendEmail(userName,email);
//        System.out.println("发布订阅模式成功获取消息  msg:"+msg);
//    }
//    /*邮件发送工具类*/
//    public void sendEmail(String userName,String email){
//        /*邮件内容*/
//        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
//        simpleMailMessage.setFrom("[email protected]");   /*邮件发送者*/
//        simpleMailMessage.setTo(email);  /*邮件接受者*/
//        simpleMailMessage.setSubject("晖哥测试邮件发送,不要迷恋哥哥");    /*邮件标题*/
//        simpleMailMessage.setText("恭喜你,"+userName+"!你见证了我的学习成果!");  /*邮件内容*/
//        /*邮件发送*/
//        javaMailSender.send(simpleMailMessage);
//        System.out.println("邮件发送成功");
//    }


    /*
     *  activeMq默认是自动签收的
     * 现在改为手动签收模式和事务模式(这里用的是点对点,发布订阅是一样的书写规范)
     * 这是测试代码,开发情况可在配置文件中配置)
     * 生成者以事务进行生成消息,消费者也需使用事务消费消息
     * 生成者以手动签收发送消息,消费者就需要通过手动签收回应生产者消息消费成功
     * 签收方式是在消费者中进行设置,生成者中无需改变
     * 消费者无需关闭队列连接
     */
    //    连接地址
    private static String url = "tcp://192.168.42.123:61617";
    //    队列名称
    private static String queueName = "text_queue";

    public static void main(String[] args) {
//        1.建立连接工厂  密码默认是admin admin  这里可以设置密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("admin","123456",url);
        Connection connection = null;
        try {
            //              2.创建连接
            connection = activeMQConnectionFactory.createConnection();
            connection.start(); /*启动连接*/
            //             3.创建会话,参数1 设置事务提交是否开启、参数2 消息方式是否采用自动签收
            //Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); /*事务签收*/
            Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE); /*手动签收*/
            //            4.创建队列
            Queue queue = session.createQueue(queueName);
            //            5.创建消费者
            MessageConsumer consumer = session.createConsumer(queue);
            //              6.监听消息
            consumer.setMessageListener(new MessageListener() {
                @Override
                public void onMessage(Message message) {
                    //      7.获取消息
                    TextMessage textMessage = (TextMessage) message;
                    System.out.println("消费者获取内容:"+textMessage);
                    try {
                        /*手动签收消息回应生成者*/
                        textMessage.acknowledge();
//                        8.事务提交
//                        session.commit();

                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

这里分别提供了activeMq的4中方式,有点对点的发送方式,有发布订阅的发送方式,有手动签收的接收方式同时也有事务的接收方式,代码中都有具体的注释,可以参考使用在activeMq中默认的方式是自动签收的,所有对于自动签收的方式就不需要设置了
activeMq的提供端(Producer )

package com.activemq.activemq.producer;

import com.alibaba.fastjson.JSONObject;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;

import javax.jms.*;

/**
 * @description:    消息生成者  向activemq中发送消息
 * @author: liuhui
 * @createDate: 2020/3/26
 * @version: 1.0
 */

@Configuration
public class Producer {
    /**
     * 点对点模式
     */
    @Autowired
    private JmsMessagingTemplate jmsMessagingTemplate;      /*队列模板*/
    @Autowired
    private Queue queue;
    /*通过定时任务,每隔5s钟向activemq中发送一个消息*/
    @Scheduled(fixedDelay = 5000)   /*定时任务,每隔5s发送一个消息  单位是ms   5000ms = 5s */
    public void send(){
        String msg = System.currentTimeMillis()+"";
        jmsMessagingTemplate.convertAndSend(queue,msg);
        System.out.println("采用点对点模式+msg:"+msg);
    }


    /**
     * 发布订阅模式
     */
//    @Autowired
//    private Topic topic;
//    通过定时任务,每隔5s钟向activemq中发送一个消息
//    @Scheduled(fixedDelay = 5000)   //定时任务,每隔5s发送一个消息  单位是ms   5000ms = 5s
//    public void send(){
//        String userName = "郭鹏丽";
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("userName",userName);
//        jsonObject.put("email","[email protected]");
//        String msg = jsonObject.toJSONString();
//        jmsMessagingTemplate.convertAndSend(topic,msg);
//        System.out.println("采用发布订阅模式+msg:"+msg);
//    }


    /*
     *  activeMq默认是自动签收的
     * 现在改为手动签收模式和事务模式(这里用的是点对点,发布订阅是一样的书写规范)
     * 这是测试代码,开发情况可在配置文件中配置)
     * 生成者以事务进行生成消息,消费者也需使用事务消费消息
     * 生成者以手动签收发送消息,消费者就需要通过手动签收回应生产者消息消费成功
     */
//    连接地址
    private static String url = "tcp://192.168.42.123:61617";
//    队列名称
    private static String queueName = "text_queue";
    public static void main(String[] args) throws JMSException {
        //                  1.建立连接工厂  密码默认是admin admin  这里可以设置密码
        ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("admin","123456",url);
        Connection connection = null;
        try {
            //              2.创建连接
            connection = activeMQConnectionFactory.createConnection();
            connection.start(); /*启动连接*/
            //             3.创建会话,参数1 设置事务提交是否开启、参数2 消息方式是否采用自动签收
//            Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); /*事务签收*/
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); /*手动签收*/
            //            4.创建队列
            Queue queue = session.createQueue(queueName);
            //            5.创建生成者
            MessageProducer producer = session.createProducer(queue);
            //           6.设置消息持久化
            producer.setDeliveryMode(DeliveryMode.PERSISTENT);
            for (int i = 0; i < 10 ; i++) {
                //          7.生成消息
                TextMessage textMessage = session.createTextMessage("发送消息:"+i);
                //          8.发送消息
                producer.send(textMessage);
                //          9.事务提交      (手动签收模式,无需开启事务提交)
//                session.commit();
                System.out.println("消息发送成功!"+textMessage);
            }
        } catch (JMSException e) {
            e.printStackTrace();
        }finally {
//            关闭连接
            connection.close();
        }
    }
}

在使用activeMq的时候,我们也需要进行书写一个bean,通过bean注入到spring的容器中,通过容器进行使用对activeMq的队列发送消息,这里还采用一个定时任务进行数据的发送,用来模拟消息不断生成的环境,在项目实践中,可以不用使用这个定时任务,开启定时任务还需要在SpringBoot中的启动类中进行配置

package com.activemq.activemq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling       /*开启定时任务*/
public class ActivemqApplication {

    public static void main(String[] args) {
        SpringApplication.run(ActivemqApplication.class, args);
    }

}

activeMq的配置类(config)

package com.activemq.activemq.utils;

import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.jms.Queue;
/**
 * 队列消息提供者
 */

/**
 * @description:        activemq 配置类  这里配置队列信息
 * @author: liuhui
 * @createDate: 2020/3/26
 * @version: 1.0
 */
@Configuration  /*标注为配置类*/
public class ConfigQueue {
    /*点对点模式*/
    @Value("${my_queue}")
    private String myQueue;
    /*1.将队列注入到SpringBoot容器中*/
    @Bean
    public Queue queue(){
        return new ActiveMQQueue(myQueue);
    }

//    /*发布订阅模式*/
//    @Value("${my_topic}")
//    private String myTopic;
//    /*1.将队列注入到SpringBoot容器中*/
//    @Bean
//    public Topic queue(){
//        return new ActiveMQTopic(myTopic);
//    }
}

配置类也主要是进行配置activeMq的两种队列发送发送方式,点对点模式,发布订阅模式
到这里,activeMq代码就已经书写完成,下面贴上配置文件,和email发送用的配置文件,就可将代码复制下来启动试验了
provide端的yml文件配置

server:
  port: 9896
spring:
  activemq:
    broker-url: tcp://192.168.42.123:61617?jms.optimizeAcknowledge=true&jms.optimizeAcknowledgeTimeOut=30000&jms.redeliveryPolicy.maximumRedeliveries=10
    user: admin
    password: 123456
#    点对点模式
my_queue: springBoot1.5.9_my_queue
#发布订阅模式
#my_topic: springBoot1.5.9_my_topic



consumer端的yml文件配置

server:
  port: 9895
spring:
  activemq:
    broker-url: tcp://192.168.42.123:61617?jms.optimizeAcknowledge=true&jms.optimizeAcknowledgeTimeOut=30000&jms.redeliveryPolicy.maximumRedeliveries=10
    user: admin
    password: 123456
  #    SpringBoot在整合activemq的发布订阅模式默认没有开启,需要手动开启
  jms:
    pub-sub-domain: true
  mail:
#    163邮件服务
    host: smtp.163.com
#    发送邮件账号
    username: *****
#    邮箱授权码
    password: ***********
#    编码格式
    default-encoding: utf-8
#    点对点
#my_queue: springBoot1.5.9_my_queue
#发布订阅
my_topic: springBoot1.5.9_my_topic



password是邮箱的授权吗,具体使用,可以看上面推荐的博客进行配置

最后贴上pom文件,进行jar包管理下载

 <!--email jar start-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <!--email end-->
         <!--json格式转换包 start-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
        <!--json格式转换包 end-->
         <!--json格式转换包 start-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>
        <!--json格式转换包 end-->

那个email的jar包只需要在consumer中进行配置

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