深入淺出boot2.0 第13章3 定時任務 包含我的整理(非socket)


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
@EnableAsync1,開啓)
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:0011: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* * 	23150- 0 15 0 * *0:15觸發
- 0 15 10 * * ? *    10:15觸發
- 0 30 10 * *2018     201810:30分每天執行
- 
- 0 * 23 * * ? 每天230秒 任意執行=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 * *2105 分鐘的 0秒執行
- 0 10,44 143 WED     3月的每週3 14:101444觸發
- 0 0 23* MON-FRI     週一到週五23點執行 (國人認爲的週一到週四)
- 0 30 23 ? * 6L    1720年 任意月的 最後一個周5 2330- 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觸發

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章