ActiveMQ 传送字符串与传送对象

在项目开始导包时 导入ActiveMQ

先来介绍一次下ActiveMQ(消息队列)

*消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现

处理高并发/应用解耦

队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
如果没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
如果消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现

处理高并发/应用解耦

队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
如果没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
如果消息队列
JMS ,Java定义的一系列接口, ActiveMQ是JMS的实现

处理高并发/应用解耦

队列有两个类型:
1.Queue
网Queue中放的消息,同时只能由一个客户端消费
如果没哟客户端,那么这个消息会一直存放在Queue
直到某个客户端进行消费.
2,Topic
往Topic中放的消息,同时会被对多个客户端消费(1对多)
如果没有客户端,那么这个消息就会丢失.

使用的是被人配置好的ActiveMQ镜像

在配置文件中配置好 端口映射 与用户名 密码

spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin

#spring.activemq.packages.trust-all=false
# 他的默认值是false 只支持Queue
#改为true 支持 topic
#所以不能再配置文件中设置
#需要配置bean

创建 JmsConfig 实体类 在这个实体类下写所有关于消息队列的配置


@Configuration
public class JmsConfig {

    //    编辑字符串Queue 消息对列的名字
    public static final String Quene_SEND_EMAIL = "com.lanou.QUEUE_SEND_EMAIL";
    //   编辑字符串Topic 消息对列的名字
    public static final String TOPIC_USER = "com.lanou.TOPIC_USER";
    //    编辑对象Queue 消息对列的名字
    public static final String QUEUE_EMAIL = "com.lanou.QUEUE_EMAIL";


    //    设置字符串Queue 形式的方法
    @Bean
    public Queue emailQueue() {
        return new ActiveMQQueue(Quene_SEND_EMAIL);
    }

    //  发送字符串Topic 形式的方法
    @Bean
    public Topic userTopic() {
        return new ActiveMQTopic(TOPIC_USER);
    }

    //    发送对象Queue 形式的方法
    @Bean
    public Queue messageQueue() {
        return new ActiveMQQueue(QUEUE_EMAIL);
    }


    @Bean
    //    创建工厂(Queue 对列形式)
    public DefaultJmsListenerContainerFactory queueFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory
                = new DefaultJmsListenerContainerFactory();

        factory.setPubSubDomain(false);
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }

    @Bean
    //    创建工厂(Topic 队列形式)
    public DefaultJmsListenerContainerFactory topicFactory(ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory
                = new DefaultJmsListenerContainerFactory();

        factory.setPubSubDomain(true);
        factory.setConnectionFactory(connectionFactory);
        return factory;
    }

在service 层 引入 配置好的 Bean 发送信息到消息队列


@Service
public class UserService {

    //    引入Queue 形式发送字符串的方法
    @Resource
    private Queue emailQueue;
    //    引入Topic 形式发送字符串的方法
    @Resource
    private Topic userTopic;
    //    引入Queue 形式发送对象的方法
    @Resource
    private Queue messageQueue;
    //    引入实体类JmsMessagingTemplate
    @Resource
    private JmsMessagingTemplate jmsMessagingTemplate;


    //    发送字符串到Queue 形式的消息队列
    public void register(String username) {
        //1.把用户信息插入到数据库
        System.out.println("插入数据库" + username);
        //2.把用户信息放到消息队列中
        // 第一个参数 消息对例的名字 ,  GenericMessage<> 形式的字符串
        Message<String> message = new GenericMessage<>(username);
        this.jmsMessagingTemplate.send(emailQueue, message);

    }

    //    发送字符串到Topic 形式的消息队列
    public void login(String username) {
        // 第一个参数 消息对例的名字 ,  GenericMessage<> 形式的字符串
        Message<String> message = new GenericMessage<>(username);
        this.jmsMessagingTemplate.send(userTopic, message);
    }


    //    发送对象到Queue 形式的消息对列
    public void send(User user) {
        this.jmsMessagingTemplate.convertAndSend(messageQueue, user);

    }
}

创建实体类EmailConsumer 来消费里面的信息


@Component
public class EmailConsumer {

    //  @JmsListener(  参数一 对列的格式  ,   参数二  与配置文件方法名相对应)

    //    用来消费Queue 消息
    @JmsListener(destination = JmsConfig.Quene_SEND_EMAIL, containerFactory = "queueFactory")
    public void receive(String message) {
        //执行真正发送邮件的功能
        System.out.println(message);
    }

    //    用来消费Topic1 消息
    @JmsListener(destination = JmsConfig.TOPIC_USER, containerFactory = "topicFactory")
    public void receiveTopic1(String message) {
        //执行真正发送邮件的功能
        System.out.println("客户端1" + message);
    }

    @JmsListener(destination = JmsConfig.TOPIC_USER, containerFactory = "topicFactory")
    public void receiveTopic2(String message) {
        //执行真正发送邮件的功能
        System.out.println("客户端2" + message);
    }

    @JmsListener(destination = JmsConfig.TOPIC_USER, containerFactory = "topicFactory")
    public void receiveTopic3(String message) {
        //执行真正发送邮件的功能
        System.out.println("客户端3" + message);
    }

    //    接收消费对象
    @JmsListener(destination = JmsConfig.QUEUE_EMAIL, containerFactory = "queueFactory")
    public void sends(User message) {
        System.out.println("回掉成功了");
        System.out.println("收件人" + message.getTo());
        System.out.println("标题" + message.getTitle());
        System.out.println("内容" + message.getText());
     }
}

猜你喜欢

转载自www.cnblogs.com/lxx-1843693653/p/11130613.html