消息队列,用来处理开发中的高并发问题,通过线程池、多线程高效的处理并发任务。
首先,需要下载一个ActiveMQ的管理端:我本地的版本是 activemq5.15.8,打开activemq5.15.8\bin\win64\wrapper.exe客户端,可以根据localhost:端口号,访问ActiveMQ的管理界面。默认的用户名、密码都是admin。
(一)pom 文件中添加 ActiveMq 依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
<version>5.7.0</version>
</dependency>
(二)创建线程池,通过线程池创建、管理线程,这样有利于线程的使用,避免了每次都要创建、关闭线程,浪费资源。
需要注意这里需要把当前类、函数添加到 IOC 容器中,后面将会用到。
1.@Configuration 在项目启动的时候,会加载当前类,构造bean。也可以使用@Component
2.@Bean("taskExecutor"),定义了当前 bean 的名称,默认不添加名称的话,后面如果调用,则会根据对象的类型进行类型匹配。
package com.common.utils.threadPool; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.RejectedExecutionHandler; import java.util.concurrent.ThreadPoolExecutor; /** * 线程:在执行并发任务的时候,为提高效率,所以启用线程,但是需要创建、销毁 * java 线程池,使用线程池,避免了每次使用都要创建一个线程从而影响了效率。而是在完成任务后,并不被销毁,还可以继续执行其他任务 * @since 21:28 2019/4/9 * @author hanyf */ @Configuration public class ThreadPoolConfig { @Bean("taskExecutor") public ThreadPoolTaskExecutor taskExecutor(){ ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); //线程池核心池的大小,默认线程池为0,需要等待任务去创建线程,如线程数量大于了核心池大小,就会将到达的线程放到【缓存队列中】 taskExecutor.setCorePoolSize(50); //设置线程池能创建的最大线程数量 taskExecutor.setMaxPoolSize(60); //线程没有执行任务时保存多长时间后终止 //默认情况,只有线程数量>coreThreadNum 才会起作用,直到线程数量<coreThreadNum时结束 taskExecutor.setKeepAliveSeconds(6*60); //缓存队列 taskExecutor.setQueueCapacity(20); taskExecutor.setRejectedExecutionHandler(new RejectedExecutionHandler() { @Override public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { System.err.println("线程池拒绝策略,正在执行..."); } }); return taskExecutor; } }