异步消息
MQ 全称为 MessageQueue ,中文名 为消 息队列, 是一个消息的接收和转发的容器可用于消息推送 ActiveMQ是Apache提供的一个开源消息系统 完全采用 Java 来实现,因此能够很好地支持 J2EE提出的几JMS(Java Message Service)规范
账号admin 密码admin 需要去打开服务先
双击activemq.bat进入,启动时默认8161端口
加入依赖包
<!-- spring-boot-starter-activemq -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
添加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<T>
做放回值(java.util.concurrent.Future
)T为实际返回的值如List<AyUser>
如:
/**
* 异步查询
* @return 异步存储
*/
@Override
public Future<List<AyUser>> 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<List<AyUser>>(all);
}
异步查询可以比同步快非常多!