如何实现基于文件的持久堆栈?

时间:2012-12-21 15:29:52

标签: perl stack persistent

我有一个登录系统的API。它不支持使用相同的用户ID进行并发登录(我猜是由于许可证)。但是,这个代码可以由不同用户从另一个系统启动的不同进程/客户端调用,在我的例子中是一个ClearCase触发器。

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

我有两个选择。

  1. 返回的$令牌可以由不同的客户共享。那么我怎么能坚持这个$令牌呢?
  2. 我有10个许可证,因此可以创建10个用户。如何为所有客户端创建基于文件的持久堆栈以共享这些用户ID?
  3. 我google了一下,发现了这个: 您需要一个简单的单个文件和一个锁。你按锁,追加,解锁。你通过锁定,搜索,阅读,截断,解锁来弹出。

    有人可以给我一个代码示例吗?

2 个答案:

答案 0 :(得分:1)

我会用用户信息维护十个文件(比如1.conf,尽管10.conf)。

要获取可用的用户ID,请查找没有相应.pid文件的.conf文件(例如1.pid)。如果找到一个,请尝试获取该文件的独占锁,然后创建一个带有独占锁的相应.pid文件。 (如果其中任何一个失败,请查找另一个文件。)

完成后,释放.conf文件上的锁,然后释放锁并删除.pid文件。

如果您想避免可能的竞争条件,您可以拥有一个您尝试在查找可用用户ID之前独占锁定的queue.lock文件。如果它已被锁定,请等待锁定被释放。

答案 1 :(得分:0)

  1. 为什么我们需要额外的.pid文件?是不是已经足够锁定.conf文件了?
  2. 使用以下代码,如果我同时启动该程序的两个实例,则第二个等待第一个解锁,然后锁定第一个文件id01.txt。它正在等待阅读。如果文件被锁定,如何让它转到下一个?

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

    for($ count = 1; $ count< = 8; $ count ++){
    if(打开SELF,“< id0 $ count.txt”);     if(flock(SELF,LOCK_EX)){     #独家锁定         print“Locked id0 $ count.txt ... \ n”;         睡眠(10);         关闭SELF;     } else {         下一个     }

    } else {     下一个; } print“Unlocked id0 $ count.txt ... \ n”; }