1. Django配置Celery執行非同步和同步任務(tasks))
celery是一個基於python開發的簡單、靈活且可靠的分布式任務隊列框架,支持清弊使用任務隊列的方式在分布式的機器/進程/線程上執行任務調度。採用典型的生產者-消費者模型,主要由三部分組成:
比如系統上線前後台批量導入歷史數據,發送簡訊、發送郵件等耗時的任務
1.安裝RabbitMQ,這里我們使用RabbitMQ作為broker,安裝完成後默認啟動了,也不需要其他任何配置
Ubuntu linux安裝
CentOS Linux 安裝
蘋果mac 安裝需要配置
配置環境變數 (蘋果用戶)
啟動rabbitmq-server
2.安裝celery
3.celery用在django項目中,django項目目錄結構(簡化)如下
4.創建 oa/celery.py 主文件
5.在 oa/__init__.py 文件中增加如下內容,確保django啟動的時候這個app能夠被載入到
6.各應用創建tasks.py文件,這里為 users/tasks.py
7.views.py中引用使用這個tasks非同步處理
8.啟動celery
9.這樣在調用post這個方法時,里邊的add就可以非同步處理了
定時任務的使用場景就很普遍了,比如我需要定時發送報告給老祥談板~
1. oa/celery.py 文件添加謹正碰如下配置以支持定時任務crontab
3.啟動celery beat,celery啟動了一個beat進程一直在不斷的判斷是否有任務需要執行
2. ASP.NET如何後台定時執行任務
你可以在前台定一個計時器,定時去執行後台呀。用ajax+json可以。如果你非要在後台定時執行任務。你在後台茄沖伺服器上寫個服務也行呀。這個是前台的ajax調用後台處理程序,返回json
$(document).ready(
function(){
setTimeout(function(){
$.ajax({
type:"post",
url:"Handler1.ashx",
dataType: "json",
success: function(data) { //執明備行OK,就把消息返回到前台
$("#msg").css("color", "#0000FF").html(data.MSG);
},
error: function(err) { //失敗
$("顫槐殲#msg").css("color", "#FF0000").html("access faield:" + err);
}
});
}, 1000)
});
3. Nacos動態配置原理淺談
SpringBoot環境引入配置中心依賴
查看spring-cloud-starter-alibaba-nacos-config的spring.factories文件
首先載入初始化:org.springframework.cloud.alibaba.nacos.的NacosPropertySourceLocator對象
ps:何時載入 請參考: https://blog.csdn.net/m0_37607945/article/details/107762760 )
重點關注NacosPropertySourceLocator.locate方法
那locate方法具體什麼時候執行呢?
spring容器在初始化,准備上下文時,會調用所有實現ApplicationContextInitializer介面的類然後遍歷執行其initialize()方法
而nacos則正是利用了spring的這種自定義PropertySourceLoader載入機制與spring完美結合,說明一個好的框架的擴展性設計是多麼重要,同樣如果從事自研中間件的小夥伴也必須對spring的各種機制,功能點必須非常熟悉才能寫出優秀的框架。
接下來就回到了:NacosPropertySourceLocate的locate方法
利用反射創建NacosConfigService實例
接下來我們看看其構造函數都做了什麼操作
依次初始化命名空間,以及http的包裝類,實際執行的是serverHttpAgent,以及ClientWorker(長輪詢),重點看一下ClientWorker
可以看到ClientWorker裡面初始化了兩個線程池,一個是定時執行任務線程池,一個是不定長線程池,同時啟動了定時任務線程池,設定每10毫秒執行一次:checkConfigInfo()方法。(先記得有這么回事)
繼續看locate 載入方法:
先載入共享配置類文件,即配置:spring.cloud.nacos.config. shared-dataids的文件
再載入配置為:spring.cloud.nacos.config.ext-config 的列表文件,
再去載入系統默認配置
內部方法調用邏輯大同小異,都是調用loadNacosDataIfPresent方法
繼續跟,走到loadNacosData方法
走到NacosConfigService的getConfig方法,getConfig方法會先去查詢本地文件(降級策略),本地文件存在則返回,本地文件不存在則調用http介面獲取,至此,配置中心初始化拉取數據完畢。
我們在nacos控制台修改了數據,客戶端又是如何快速感知到的呢?
入口在:NacosConfigAutoConfiguration的nacosContextRefresher方法
nacosContextRefresher實現了ApplicationListener<ApplicationReadyEvent>,會在spring容器發布ApplicationReadyEvent事件時,觸發監聽操作
針對每個配置文件注冊監聽
首先聲明一個Lister邏輯,然後放到listerMap中,key為dataId,lister內部邏輯主要是收到更新配置後,更新md5值,然後利用spring applicaiton發布RefreshEvent事件。
緊接著調用
configService.addListener(dataId, group, listener);
看下其內部處理邏輯
簡單概括就是將配置信息封裝成了一個cacheData對象,然後放到hashmap中
再次回到上文中的,ClientWorker的定時任務線程池中checkConfigInfo方法,每隔10s會去執行一次,
此處的longintTaskCount 自己理解應該一直是0,因為listenerSize 為配置文件數目不會超過3000,然後ParamUtil.getPerTaskConfigSize()也是固定值為3000,因此longingTaskCount為0,currentLongingTaskCount也為0,也就是if條件會永遠不滿足,但debug發現longingTaskCount會變為1,但是不知道為啥(希望大神解惑)
繼續看LongPollingRunnable的run方法
如果沒有用到本地配置,並且本地配置文件確實存在,則採用本地配置
如果是採用的本地配置。並且本地文件刪除了 ,則設置setUseLocalConfigInfo(false)
檢查md5值是否有變更,如有通知發送監聽
執行lister的receiveConfigInfo()方法
總結:客戶端通過定時任務線程池來監聽配置,當服務端配置發生變更時,客戶端會通過拉(長輪詢)方式得到最新的值並保存在cacheData中,然後於cacheData的listener的md5值做對比,如果有更新則通知,觸發lister的reveiveConfig方法;
來看下服務端的長輪詢處理:
發起長輪詢請求,對應http介面:post請求,/v1/cs/configs/listener,並設置超時時間30s,邏輯是如果30s內配置發生了變更,則會立馬返回,否則等待29s後執行檢查判斷配置是否發生變更返回。然後繼續發起輪詢請求,循環往復
服務端長輪詢介面處理邏輯:
將請求設為非同步,並封裝成ClientLongPolling
ClientLongPolling 的run邏輯:
1.創建一個調度的任務,調度的延時時間為 29.5s,(29.5由客戶端默認傳遞超時時間30s-服務端設置的500ms得來)
2.將該 ClientLongPolling 自身的實例添加到一個 allSubs 中去
3.延時時間到了之後,首先將該 ClientLongPolling 自身的實例從 allSubs 中移除
4.獲取服務端中保存的對應客戶端請求的 groupKeys 是否發生變更,將結果寫入 response 返回給客戶端
allSubs則必然和客戶端配置變更有必然聯系,查看服務端修改配置方法:post /v1/cs/configs/
先持久化,再去發布configDataChangeEvent事件
而我們的LongPollService 監聽的則是LocalDataChangeEvent事件,似乎和ConfigDataChangeEvent沒關系,其實不然
繼續跟進ConfigController的ConfigChangePublisher
.notifyConfigChange(new ConfigDataChangeEvent(....)))方法
AsyncNotifyService中注冊監聽邏輯
會執行一個AsyncTask任務,從而觸發一個http get介面:
也就是:
mpService是負責將配置保存到磁碟的服務類
看到確實發布了LocalDataChangeEvent事件,
然後又回到了上圖:LongPollingService 的onEvent方法,接著看DataChangeTask的邏輯,
首先遍歷allStubs隊列,然後找出當前的ClientLongPolling,
從隊列中移除,然後response寫入變更的groupKey
總結:可以看到nacos實際上是利用了推+拉 結合的方式來獲取配置,當沒有配置發生變更時,會hang住請求,默認等待(30-0.5)29.5秒後返回,而一旦發生數據變更,又會立刻推送變更數據寫入到response,然後客戶端更新配置;
以上則是動態配置原理,如果有不對的地方請指出;
參考: https://www.jianshu.com/p/acb9b1093a54
4. crontab定時任務 和linux請求介面
我能看懂的我感覺所有人都可以看懂
1. crontab文件格式:
* * * * * command
minute hour day month week command
分 時 知做瞎 天 月 星期 命令
minute: 表示分鍾,可以是從0到59之間的任何整數。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,胡納可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這里的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的腳本文件
2. 特殊字元:
星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,「1,2,5,7,8,9」。
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如「2-6」表示「2,3,4,5,6」。
正斜線(/):可以用正斜線指定時間的間隔頻率,例如「0-23/2」表示每兩小時執行一次。同時正斜線可以和星號一起使用,例搭空如*/10,如果用在minute欄位,表示每十分鍾執行一次。
3.運行crontab –e 編寫一條定時任務 */5 * * * * /home/test.sh 在每5分鍾執行一次test.sh腳本。
4.查詢當前用戶定時任務或刪除當前用戶定時任務
chkconfig --list crond 查看是否開機自動啟動
chkconfig --level 35 crond on 設置cond開機自動啟動
測試get請求
$ curl http://www.linuxidc.com/login.cgi?user=test001&password=123456
2、測試post請求
$ curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi
我長用到的就這倆。
5. sae中使用 spring Scheled 定時任務 怎麼弄
首先要配置我們的spring.xml
xmlns 多加下面的內容、
然後xsi:schemaLocation多加下面的內容、
最後是我們的task任務掃描註解
[html] view plain
<task:annotation-driven/>
我的配置掃描位置是:
[html] view plain
<context:annotation-config/>
<bean class="org.springframework.beans.factory.annotation."/>
<context:component-scan base-package="com.test"/>
掃描的是com.test這樣的包下的穗州頌內容、
下面需要介面和實現(我的這幾個java文件都是com.test的包下的、)
[java] view plain
public interface IMyTestService {
public void myTest();
}
[java] view plain
@Component //import org.springframework.stereotype.Component;
public class MyTestServiceImpl implements IMyTestService {
@Scheled(cron="0/5 * * * * ? ") //每5秒執行一次
@Override
public void myTest(){
System.out.println("進入測試");
}
}
執行猜鄭後控制台就會列印出 進入測試 了
需要注意的幾點:
1、spring的@Scheled註解 需要寫在實現上跡鄭、
2、 定時器的任務方法不能有返回值(如果有返回值,spring初始化的時候會告訴你有個錯誤、需要設定一個proxytargetclass的某個值為true、具體就去網路google吧)
3、實現類上要有組件的註解@Component
6. 用ASP實現一個定時任務。怎麼實現
把下面的存為。ASP文件,運行,就可以可以了,可以自己提交
<html>
<head>耐明衫
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>新建網頁 1</title>
<script language="javascript">
function tijiao(){
setTimeout("tijiao1()",2000);//2秒以後提交。
}
function tijiao1(){
form1.submit();
}
</script>
</head>
<body onLoad="javascript:tijiao();">
<%if request("T1")<>"" then
response.write request("T1")
end if%>
<form method="POST" name="form1" action="index.asp">
<p>要提交的內容:<input type="text" name="T1" size="20" value="DFGDFGDFG"><昌腔/p>
<p><input type="submit" value="提交" name="B1"><input type="reset" value="重置" name="B2">槐猛</p>
</form>
</body>
</html>
7. js定時器發post請求行嗎
定時器可以定時發出警報或其他信號,它是一種電子設備,能夠讓你在某個指定的時間內發出警告或完成任務。定時器可以定歷檔蠢時發肢陪出警報或其他信號,蠢粗它是一種電子設備,能夠讓你在某個指定的時間內發出警告或完成任務。