簡體   English   中英

控制Java和Lotusscript代理

[英]Controlling Java and Lotusscript agents

我創建了兩個代理,一個由Java構成,另一個由Lotusscript構成。 java代理程序計划每5分鍾運行一次,而lotusscript代理程序計划每15分鍾運行一次。 因此,有一段時間他們將同時運行。 當發生這種情況時,java代理必須暫停/等待,直到lotusscript代理完成。 我嘗試使用Profile DOcuments和Environment Variables來模擬鎖定,但無濟於事。 有沒有辦法可以模擬這兩種不同代理之間的鎖定? 請幫忙。 非常感謝!

編輯:我忘了說2個代理商駐留在兩個不同的數據庫中,使事情復雜化:(

為什么不編寫第三個代理(可能在額外的數據庫中),每隔五分鍾運行一次,啟動另外兩個代理:

  1. 每次Lotus Script Agent
  2. Java代理每三次運行一次

...然后你也可以控制運行順序,沒有任何復雜的鎖機制。

這是一種近乎萬無一失的方式,我發現它可用於控制獨立代理的執行順序。 我使用真正的筆記文檔作為偽鎖文檔。

之前我這樣做的方法是保留一個代表“鎖定”的Notes文檔。 不要使用數據庫配置文件,因為它容易出現復制/保存沖突問題,並且您無法在視圖中查看它。

“lock”文檔上可以有一個標志,告訴java代理是否允許它現在運行。 java代理只是在其中包含類似於此的代碼

Session s = NotesFactory.createSession();
Database db = s.getDatabase("This Server", "This database");
View vw = db.getView("(lockView)");
Document docControl = vw.getFirstDocument();
String sRunStatus = docControl.getItemValueString("runStatus");
boolean bContinue = false;
if (sRunStatus =="Go"){
    bContinue = true;
}
if(bContinue){
    //do agent code here....

    // reset the status to "wait". The lotusscript agent should then set it to "Go"
    // the other agent will execute on "wait" and then update the status to "Go" on 
    // completion to prevent simulatenous execution. Can also use different state names
    // instead of go/wait, like run0, run1, run2 etc
    docControl.replaceItemValue("runStatus", "wait");
    docControl.save(true);
}

請注意,您使用代理在控制文檔的“runStatus”字段中設置“Go”/“wait”值。 您只需要1個文檔,因此您只需要從視圖中獲取第一個文檔。

在LotusScript代理中添加等效邏輯應該更簡單。 我能找到的唯一不足之處是java代理可能無法執行代碼,因為控制文檔尚未設置為“go”而“IF”測試在沒有運行邏輯的情況下失敗,因此它不是暫停,而是阻止Java代理使用lotusscript代理執行它所需的順序。 但是如果LotusScript代理已經發布它,它將在下一個計划實例上觸發。

您還可以通過使用特定值(如“RunAgent1”,“RunAgent2”)來擴展此想法以管理一組代理甚至鏈接多個代理,另一個好處是您還可以捕獲執行開始時間,錯誤或任何內容你需要....

在數據庫中啟用文檔鎖定可能會起作用。 如果您可以在數據庫本身中啟用文檔鎖定,則可以讓代理程序鎖定特定文檔,並在運行代碼之前/期間檢查文檔是否已鎖定。

如果在該數據庫中啟用文檔鎖定不是一個選項,您可以考慮創建一個單獨的數據庫來存儲該文檔。

為什么這些代理不能同時運行? 也許可以在允許代理同時運行的同時實現相同的結果。 試圖以這種方式控制代理通常會導致其他問題。 如果數據庫具有副本,則解決方案可能會中斷。

你說這是兩個數據庫,但到目前為止,阻止代理同時運行的最簡單方法是將它們放在同一個數據庫中。 我經常會創建一個特殊的數據庫,它只包含代理生成的代理和日志文檔。 代理可以打開任何數據庫,因此無論它們在哪里都無關緊要。

我還領導了一個項目,我們為代理構建了自己的控制機制,這是giulio和spookycoder的想法的結合。 只安排了一個“主”代理,它讀取控制文檔以決定下一個應運行的代理。 假設我們有代理A,B和C.主服務器運行A,它立即更新控制文檔以說“我正在運行”,然后它隨着進程信息更新字段,最后完成時使用“B”更新控制文檔。下次主控運行時,它會查看控制文檔。 如果進度信息顯示A已完成,則主人將看到輪到B運行。 當然,A可能會意識到B沒有工作要做,所以它可能會寫“C”,在這種情況下,主機將運行C.如果進度信息顯示,主機也可以選擇重新運行A.它沒有完成這項工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM