异步消息AcitveMq

异步消息

  MQ 全称为 MessageQueue ,中文名 为消 息队列, 是一个消息的接收和转发的容器可用于消息推送 ActiveMQ是Apache提供的一个开源消息系统 完全采用 Java 来实现,因此能够很好地支持 J2EE提出的几JMS(Java Message Service)规范

账号admin 密码admin 需要去打开服务先
双击activemq.bat进入,启动时默认8161端口

image

加入依赖包



    org.springframework.boot
    spring-boot-starter-activemq

添加ActiveMQ配置

### activemq配置
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
spring.activemq.pool.enabled=false
spring.activemq.packages.trust-all=true #信任所有包

drop table if exists 'ay_mood';
create table 'ay_mood'(
'id' varchar(32) NOT NULL,
'content' varchar(256) default null,
'user_id' varchar(32) default null,
'praise_time' datetime default null,
primary key ('id'),
key 'mood_user_id_index' ('user_id') using btree) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

并做对应的添加数据操作,服务处操作

编写消费者和生成者类

然后在mq包下创建MoodProducer类--消费者

@Resource
    private JmsMessagingTemplate jmsMessagingTemplate;  //发消息工具类

    /**
     * 发送消息
     * @param destination 把消息放到队列
     * @param messages 待发送的消息
     */
    public void sendMessages(Destination destination, final String messages){
        jmsMessagingTemplate.convertAndSend(destination,messages);
    }

再创建AyMoodConsumer类--消费者

@JmsListener(destination = "ay.queue") //配置消费者的监听配置
    public void receiveQueue(String text) { //text为发送的消息
        System.out.println("用户发表说说【" + text + "】成功");
}

也可以使用到service层,message可以改为POJO类
MoodProducer类中

public void sendMessages(Destination destination, final AyMood messages){
        jmsMessagingTemplate.convertAndSend(destination,messages);
    }

AyMoodConsumer类中

@Resource
    private AyMoodService ayMoodService;
/**
     * 接收方法
     * @param ayMood 消息类
     */
    @JmsListener(destination = "ay.queue.asyn.save")
    public void receiveQueue(AyMood ayMood){
        ayMoodService.save(ayMood);
    }

AyMoodProducer 类中

//消息队列
    private static Destination destination = new ActiveMQQueue("ay.queue.asyn.save");
    @Resource
    private AyMoodProducer ayMoodProducer;
    @Override
    public String ActiveMQSave(AyMood ayMood) {
        ayMoodProducer.sendMessages(destination,ayMood);
        return "success";
    }

test方法

@Resource
    private AyMoodProducer ayMoodProducer;//生成者
 @Test
    void testActiveMQ3(){
        var ayMood = new AyMood();
        ayMood.setUserId("2");
        ayMood.setId("2");
        ayMood.setPublishTime(new Date());
        ayMood.setContent("这是使用ActiveMQ来发送的消息!");
        ayMood.setPraiseNum(12);
        var msg = ayMoodService.save(ayMood);
        logger.info("这是异步消息:"+msg);
    }

日志打印:

testActiveMQ3(MySpringBootApplicationTests.java:171) - 这是异步消息:AyMood(id=2, content=这是使用ActiveMQ来发送的消息!, userId=2, praiseNum=12, publishTime=Mon Oct 28 15:23:58 CST 2019)

Spring Boot 异步调用

异步调用介绍

异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,
每一步必须等到上一步执行完成之后才能执行,而异步调用则无须等待上一步程序执
行完成即可执行 。在日常开发的项目中,当访问的接口 较慢或者做耗时任务时,不想
程序一直卡在耗时任务上,想让程序能够并行执行,我们除了可以使用多线程来并行
地处理任务 ,也可以使用 Spring Boot 提供的异步处理方式 @Async 来处理。在 Spring
Boot框架中,只要提过 @Async 注解就能将普通的同步任务改为异步调用任务

开始使用

在主接口XXXApplication主接口类中上加注解

@EnableAsync//启动异步调用

在需要的方法内添加@Async
使用Future做放回值(java.util.concurrent.Future)T为实际返回的值如List
如:

/**
     * 异步查询
     * @return 异步存储
     */
    @Override
    public Future> findAllByAsy() {
        System.out.println("开始异步任务!");
        var start = System.currentTimeMillis();
        var all = ayUserRepository.findAll();
        var end = System.currentTimeMillis();
        System.out.println("结束异步任务!耗时:"+(end-start)+"ms");
        return new AsyncResult>(all);
    }

异步查询可以比同步快非常多!

你可能感兴趣的:(异步消息AcitveMq)