JINI を使用して Two-Phase Lock を実装しています。私はアルゴリズム定義に従ってそれを行いました。私の実装では、どの参加者がトランザクションをコミットまたは中止したかを追跡するために、いくつかの ArrayLists と HashMap があります。
参加/コミット/中止操作を行うたびに、ArrayLists と HashMap は空 (以前の参加者なし) であり、TransactionManager の HashCode は常に異なります。問題を探すのに2日間費やしましたが、なぜこれが起こっているのかまだ理解できません。
// here is the implementation of join method of my TransactionManager
private HashMap<Long, ArrayList<TransactionParticipant>> _transactions = new HashMap<Long, ArrayList<TransactionParticipant>>();
private ArrayList<TransactionParticipant> _participantTest = new ArrayList<TransactionParticipant>();
@Override
public synchronized void join(long trxId, TransactionParticipant tp, long crashCount) throws UnknownTransactionException, CannotJoinException, CrashCountException, RemoteException {
// add new participant to list of participants that belong to current trxId
List<TransactionParticipant> participants = _transactions.get(trxId);
_participantTest.add(tp);
participants.add(tp);
System.out.println("Test hash code " + this.hashCode());
System.out.println("Number of participants is " + participants.size() + "for Trxid " + trxId);
System.out.println("Number of participants in other is " + _participantTest.size() + "for Trxid " + trxId);
}
次のコードは、私の TransactionManager を「公開」するために使用されます
String[] groups = { "group" };
ServiceInfo serviceInfo = new ServiceInfo(
"twoPhaseTrxManager",
"a",
"b",
"1.0",
"Join Manager",
"c");
Entry[] entries = new Entry[] { serviceInfo };
LookupDiscoveryManager lookupDiscoveryManager = new LookupDiscoveryManager(groups, null, null);
// "this" (first argument) refers to Current instance of transaction manager (object being published)
new JoinManager(this, entries, (ServiceIDListener)null, lookupDiscoveryManager, new LeaseRenewalManager() );
どんな助けでも本当に感謝しています。