redis緩存:
引入:
org.springframework.boot
spring-boot-starter-data-redis
並在此引用下排除:
g:io.lettuce
a:lettuce-core
不使用異步客戶端lettuce,自己在引用一個jedis客戶端
redis.clients
jedis
配置:
spring.redis.jedis.pool
.min-idle=5
.max-active=10
.max-idle=10
.max-wait=2000
spring.redis
.port=6379
.host=192.168.1.1
.password=123
spring.cache
.type=REDIS
.cache-names=redisCache
.redis.time-to-live=600000 (毫秒)
使用:StringSerializer 解析key
@PostConstruct
public void initRedisTemplate() {
RedisSerializer<String> strSerializer = redisTemplate.getStringSerializer();
redisTemplate.setKeySerializer(strSerializer);
redisTemplate.setHashKeySerializer(strSerializer);
}
使用:
@Cacheable(value = "redisCache", key = "'redis_user_'+#userName")
@Transactional
public DatabaseUser getUserByName(String userName) {}
@Cacheable(value = "redisCache", key = "'redis_user_role_'+#userName")
public List<DatabaseRole> findRolesByUserName(String userName) {
StringRedisTemplate 這個類 繼承 RedisTemplate
rt.opsForValue().set("key1","我的測試ke1");
rt.opsForHash().put("hash","field","hvalue");
異步線程池:
@Configuration
@EnableAsync(1,開啓)
public class AsyncConfig implements AsyncConfigurer {
// 定義線程池
@Override
public Executor getAsyncExecutor() {
// 定義線程池 (ThreadPoolTaskExecutor)
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
// A:核心線程數
taskExecutor.setCorePoolSize(10);
// B:線程池最大線程數
taskExecutor.setMaxPoolSize(30);
// C:線程隊列最大線程數
taskExecutor.setQueueCapacity(2000);
// 初始化
taskExecutor.initialize();
return taskExecutor;
}
}
2,在方法上用: @Async // 聲明使用異步調用
active MQ
引用:
org.apache.activemq
activemq-pool
org.springframework.boot
spring-boot-starter-activemq
# ActiveMQ地址
spring.activemq.broker-url=tcp://localhost:61616
# 配置用戶名和密碼
spring.activemq.user=
.password=
# 是否使用發佈訂閱模式,默認是爲false,即是用的是點對點的模式
spring.jms.pub-sub-domain=true
# 是否啓用連接池
spring.activemq.pool.enabled=true
# 連接池最大連接數配置
spring.activemq.pool.max-connections=50
#信任所有類(把類轉用ActiveMQ傳遞)
spring.activemq.packages.trust-all=true
# 默認發送目的地址(用默認也監控它)
spring.jms.template.default-destination=activemq.default.destination
使用(發送):
@Autowired
private JmsTemplate jmsTemplate = null;
jmsTemplate.convertAndSend(message);
使用(監聽):
@JmsListener(destination = "${spring.jms.template.default-destination}")
public void receiveMsg(String message) {
}
默認用的是:SimpleMessageConverter 如需要:Jackson2JsonMessageConverter,SerializerMessageConverter 需配置:JmsTemplate
發送接收實體類:
實體類:implements Serializable
// 使用自定義地址發送對象
jmsTemplate.convertAndSend("我的目的地", user);
@JmsListener(destination = "我的地址")
public void receiveUser(User user) {}
RabbitMQ
docker啓動:
docker pull rabbitmq:management
docker run -d -p 5672:5672 -p 15672:15672
--name rabbitmq rabbitmq:management
--name:指定容器名稱
賬號密碼guest,guest
AMQP常用的消息協議
引用:
org.springframework.boot
spring-boot-starter-amqp
配置:
spring.rabbitmq
.host=localhost
.port=5672
.username=admin
.password=123
#是否確認發送的消息已經被消費。 發送消息方可監聽 發送消息到消費端是否成功。
成功 則會 根據設置 進行回調。
.publisher-confirms=true
創建隊列:
@Bean
public Queue createQueueMsg() {
// 創建字符串消息隊列,boolean值代表是否持久化消息
return new Queue(msgQueueName, true);
}
@Bean
public Queue createQueueUser() {
// 創建用戶消息隊列,boolean值代表是否持久化消息
return new Queue(userQueueName, true);
}
使用(發送者和回調):
implements ConfirmCallback, RabbitMqService
@Autowired
private RabbitTemplate rabbitTemplate = null;
// 設置回調
rabbitTemplate.setConfirmCallback(this);
// 發送消息,通過msgRouting確定隊列
rabbitTemplate.convertAndSend("字符串routing", msg);
rabbitTemplate.convertAndSend("對象routing", user);
// 回調確認方法
@Override
public void confirm(CorrelationData correlationData,
boolean ack, String cause) {
if (ack) {
消息成功
} else {
消費失敗: + cause
}
}
使用(監聽者):
@Component
public class Receiver {
// 定義監聽字符串隊列名稱
@RabbitListener(queues = { "字符串routing" })
public void receiveMsg(String msg) {
收到消息: + msg
}
// 定義監聽用戶隊列名稱
@RabbitListener(queues = { "對象routing" })
public void receiveUser(User user) {
收到用戶 + user
}
}
、
=========================================================
定時任務。
1.@EnableScheduling
2.@Scheduled 去配置如何定時
// 每隔1秒執行一次
@Scheduled(fixedRate = 1000)
@Async //異步執行
public void job1() {}
//IoC容器初始化後,第一次延遲3秒,每隔1秒執行一次
@Scheduled(initialDelay = 3000, fixedRate = 1000)
@Scheduled(cron = "0 * 11 * * ?") 秒0 分(任意) 時11 天(任意) 月(任意) 星期(不指定)。即:11:00到11:59點每一分鐘執行一次
Scheduled 屬性:
@Scheduled(cron = "", zone = "",
fixedDelay = 0L, fixedDelayString = "",
initialDelay = 300L,initialDelayString = "",
fixedRate = 1L, fixedRateString = ""
)
cron 表達式
zone 設定區域時間
fixedDelay 上個任務完成,到下個任務開始的間隔
+String ,同上,並且支持SpEL
fixedRate 從上個任務開始(並不是完成)到下一個任務開始的間隔
initialDelay ioc容器初始化後,首次任務執行延遲時間,單位毫秒
cron學習 (秒 分 時 天 月 星期 年)
* 任意值
?不指定,用來處理天 和 星期 衝突
- 指定時間區域
/ 指定時間間隔執行
L 最後的
# 第幾個
, 列舉多個項
- 秒 分 時 天 月 星期 年
- 0 0 0 * * ? 每天 00:00 觸發。
- 0 15 23 ? * * 23點15分0秒
- 0 15 0 * * ? 0:15觸發
- 0 15 10 * * ? * 10:15觸發
- 0 30 10 * * ?2018 2018年10:30分每天執行
-
- 0 * 23 * * ? 每天23點0秒 任意執行=23:00——23:59 1分鐘觸發一次
- 0 0/3 23 * * ? 23:00——23:59分, 每3分鐘執行一次。3分鐘1間隔 23點
- 0 0/3 20,23 * * ? 比上面又多了一個 20點--21點
- 0 0-5 21 * * ? 21點 0 — 5 分鐘的 0秒執行
- 0 10,44 14 ? 3 WED 3月的每週3 14:10或14點44觸發
- 0 0 23 ? * MON-FRI 週一到週五23點執行 (國人認爲的週一到週四)
- 0 30 23 ? * 6L 17到20年 任意月的 最後一個周5 23點30分
- 0 15 22 ? * 6#3 6數字,肯定代表周5了。每月第三週週五的22:15觸發 ()
定時任務
-
月末,季末,年末,統計 表
-
main 主類上加入: @EnableScheduling
-
@Scheduled 去配置如何定時
簡單測試定時任務
@Service
public class ScheduleServiceImpl {
// 計數器
int count1 = 1;
int count2 = 1;
// 每隔1秒執行一次
@Scheduled(fixedRate = 1000)
// 使用異步執行
@Async
public void job1() {
System.out.println("【" +Thread.currentThread().getName()+"】"
+ "【job1】每秒鐘執行一次,執行第【" + count1 + "】次");
count1 ++;
}
// 每隔1秒執行一次
@Scheduled(fixedRate = 1000)
// 使用異步執行
@Async
public void job2() {
System.out.println("【" +Thread.currentThread().getName()+"】"
+ "【job2】每秒鐘執行一次,執行第【" + count2 + "】次");
count2 ++;
}
int count3 = 1;
int count4 = 1;
// Spring IoC容器初始化後,第一次延遲3秒,每隔1秒執行一次
@Scheduled(initialDelay = 3000, fixedRate = 1000)
@Async
public void job3() {
System.out.println("【" + Thread.currentThread().getName() + "】"
+ "【job3】每秒鐘執行一次,執行第【" + count3 + "】次");
count3++;
}
// 11:00到11:59點每一分鐘執行一次
@Scheduled(cron = "0 * 11 * * ?") 秒0 分(任意) 時11 天(任意) 月(任意) 星期(不指定)
@Async
public void job4() {
System.out.println("【" + Thread.currentThread().getName()
+ "】【job4】每分鐘執行一次,執行第【" + count4 + "】次");
count4 ++;
}
}
Scheduled 屬性說明
@Scheduled(cron = "", zone = "",
fixedDelay = 0L, fixedDelayString = "",
initialDelay = 300L,initialDelayString = "",
fixedRate = 1L, fixedRateString = ""
)
-
cron 表達式
-
zone 設定區域時間
-
fixedDelay 上個任務完成,到下個任務開始的間隔
-
fixedDelayString 同上,使用的是字符串,可以使用SpEL來引入配置文件的配置
-
initialDelay ioc容器初始化後,首次任務執行延遲時間,單位毫秒
-
initialDelayString 同上,使用SpEL來引入配置文件的配置
-
fixedRate 從上個任務開始(並不是完成)到下一個任務開始的間隔,單位爲毫秒
-
fixedRateString 同上,可以使用SpEL來引入配置文件的配置
cron學習 (秒 分 時 天 月 星期 年)
-
可以通過表達式,更加靈活地配置運行的方式。
-
秒 分 時 天 月 星期 年 (年可以不配置)
-
0 0 0 ?* WED
- 秒分時 天 月 星期
- wednesday星期3
- 每個星期3 中午 0點整
- ? 和 * ,天 和 星期 會產生定義上的衝突,會以 ? 表示
- *表示 任意的月
通配符 | 描述 |
---|---|
* | 任意值 |
? | 不指定,用來處理天 和 星期 衝突 |
- | 指定時間區域 |
/ | 指定時間間隔執行 |
L | 最後的 |
# | 第幾個 |
, | 列舉多個項 |
cron表達式 舉例
-
秒 分 時 天 月 星期 年
-
0 0 0 * * ? 每天 00:00 觸發。 0秒 0分 0時 任意天 任意月 星期不指定
-
0 15 23 ? * * 23點15分0秒 天不指定,月星期任意
-
0 15 0 * * ? 0秒15分0小時 任意天任意月 星期不指定 0:15觸發
-
0 15 10 * * ? * 0秒15分10小時 任意天任意月 星期不指定 任意年 10:15觸發
-
0 30 10 * * ?2018 0秒30分10小時 天月任意星期不指定 2018年。2018年10:30分每天執行
-
0 * 23 * * ? 0秒 分鐘任意 23小時 天月任意 星期不指定。 每天23點0秒 分鐘任意執行=23:00——23:59 1分鐘觸發一次
-
0 0/3 23 * * ? 23:00——23:59分, 每3分鐘執行一次。0秒 3分鐘1間隔 23點
-
0 0/3 20,23 * * ? 比上面又多了一個 8點–9點
-
0 0-5 21 * * ? 21點 0 — 5 分鐘的 0秒執行
-
0 10,44 14 ? 3 WED 0秒10或44分鐘 14點 天不指定 3 月 周3 。3月的每週3 14:10或14點44觸發
-
0 0 23 ? * MON-FRI 週一到週五 0秒0分鐘23點 天不指定,年任意。週一到週五23點執行
-
0 30 23 ? * 6L 2017-2020 17到20年 任意月的 最後一個周5 23點30分
-
0 15 22 ? * 6#3 0秒15分鐘22點 天不指定 月任意 ,星期是第三週周5 。每月第三週週五的22:15觸發