0

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

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

我有两个选择。

  1. 返回的 $token 可以被不同的客户端共享。那么我怎样才能持久化这个 $token 呢?
  2. 我有 10 个许可证,所以可以创建 10 个用户。如何为所有客户端创建基于文件的持久堆栈以共享这些用户 ID?

我用谷歌搜索了一下,发现:一个简单的文件和一个锁似乎就是你所需要的。你按锁,追加,解锁。您通过锁定、搜索、读取、截断、解锁来弹出。

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

4

2 回答 2

1

我将使用用户信息维护十个文件(比如 1.conf 到 10.conf)。

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

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

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

于 2012-12-21T23:08:09.093 回答
0
  1. Why we need the extra .pid file? Isn't lock on the .conf file enough?
  2. Using the following code, if I start two instance of this program at the same time, the 2nd one wait for the 1st to unlock, then lock the first file id01.txt. It's waiting to read. How can I ask it go to the next one if a file is locked?

    use FileHandle; use Fcntl qw(:flock);

    for ($count = 1; $count <= 8; $count++) {
    if (open SELF, "< id0$count.txt"); if (flock(SELF, LOCK_EX)) { # Exclusive lock print "Locked id0$count.txt...\n"; sleep(10); close SELF; } else { next }

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

于 2012-12-31T16:39:28.087 回答