3

分散ロックの実装をテストしようとしていますが、それを機能させる方法がまだ見つかりません。次のような2つの簡単な方法でRESTサービスをデプロイしました。

@GET
@Path("/lock")
@Produces("text/*")
public String lock() throws InterruptedException {
    Lock lock = distributedService.getDistributedLock("test");
    boolean result = lock.tryLock(5, TimeUnit.SECONDS);
    return result ? "locked" : "timeout";
}

@GET
@Path("/unlock")
@Produces("text/*")
public String unlock() {
    Lock lock = distributedService.getDistributedLock("test");
    lock.unlock();
    return "unlocked";
}

DistributedServiceオブジェクトは、getDistributedLock()メソッドを実装します。

@Override
public Lock getDistributedLock(String lockName) {
    return Hazelcast.getDefaultInstance().getLock(lockName);
}

hazelcast.xmlファイルで、TCP-IP接続を有効にし、その他すべてを無効にしました。

<network>
<port auto-increment="true">5701</port>
<join>
  <multicast enabled="false" />
  <tcp-ip enabled="true">
    <interface>192.168.0.01</interface>
    <interface>192.168.0.02</interface>
  </tcp-ip>
</join>
<interfaces enabled="false" />
<symmetric-encryption enabled="false" />
<asymmetric-encryption enabled="false" />

アプリケーションを2台のマシンにデプロイしました。IPアドレスは.xmlファイル(192.168.0.01と192.168.0.02)に対応しており、ブラウザーからサービスを呼び出すと、初めて機能します(ロックされて「ロックされた」状態に戻ります)。 )そしてunlock()メソッドを呼び出すたびに正しく返されます(文字列「unlocked」を取得します)が、最初の後で、lock()メソッドを呼び出すたびにタイムアウトが発生します。unlock()メソッドがロックを解除しているようには見えません。

誰かがヘーゼルキャストで分散ロックを使用する正しい方法を教えてもらえますか?

4

1 に答える 1

7

ロックしたスレッドのみがロックを解除できます。ロックとロック解除のためにRESTを実装したと言っています。そして、ロックとロック解除のスレッドは違うと思います。それが機能していない理由です。スレッド名を印刷して、自分自身を確認してください。

于 2012-05-02T20:04:37.720 に答える