2012-12-21 35 views
0

我有一個API登錄到系統。它不支持使用相同的用戶ID進行併發登錄(我猜是由於許可證)。然而,這個代碼可以由不同用戶從另一個系統啓動的不同進程/客戶端調用,在我的情況下,這是一個ClearCase觸發器。如何實現基於文件的持久堆棧?

my $conn = new BuildForge::Services::Connection('ccbuildforged01', 3966); 
my $token = $conn->authUser('bldforge', 'password'); 

我有兩種選擇。

  1. 返回的$ token可以被不同的客戶端共享。那麼我怎麼能持久這個$標記?
  2. 我有10個許可證,所以可以創建10個用戶。如何爲所有客戶端創建基於文件的持久堆棧來共享這些用戶ID?

我google了一下,發現這個: 一個單一的,簡單的文件和鎖似乎你所需要的。你推鎖,追加,解鎖。您通過鎖定,查找,讀取,截斷,解鎖來彈出。

有人可以給我一個代碼示例嗎?

+0

您是否使用堆棧來管理用戶標識:從堆棧中彈出一個可用的標識,並將已釋放的標識推回到堆棧上? – Rob

回答

1

我會用用戶信息維護十個文件(比如說1.conf,但是10.conf)。

要獲取可用的用戶標識,請查找沒有對應的.pid文件(例如1.pid)的.conf文件。如果找到一個,請嘗試獲取該文件的排他鎖,然後創建一個對應的.pid文件並使用排它鎖。 (如果其中任何一個失敗,尋找另一個文件。)

當你完成後,鬆開.conf文件鎖,然後解除鎖定,刪除.pid文件。

如果要避免可能的競爭條件,可以在查找可用用戶標識之前嘗試鎖定queue.lock文件。如果它已經被鎖定,等待鎖定被釋放。

0
  1. 爲什麼我們需要額外的.pid文件?沒有足夠的鎖定在.conf文件上?
  2. 使用下面的代碼,如果我在同一時間啓動這個程序的兩個實例,第二屆一個等待第一次解鎖,然後鎖定的第一個文件id01.txt。它正在等待閱讀。如果文件被鎖定,我怎麼能要求它進入下一個?

    使用FileHandle; 使用Fcntl qw(:flock);

    爲($計數= 1; $計數< = 8; $計數++){
    如果(開放SELF 「< ID0 $ count.txt」); 如果(羣(SELF,LOCK_EX)){ #獨佔鎖 打印 「鎖定ID0 $ count.txt ... \ n」; sleep(10); 關閉SELF; } else { next }

    } else { next; } print「Unlocked id0 $ count.txt ... \ n」; }