TX その18 スレッドとTransaction Contextの関係
TxManager.associateThreadメソッド
public void associateThread(Transaction transaction) { if (transaction != null && !(transaction instanceof TransactionImpl)) throw new RuntimeException("Not a TransactionImpl, but a " + transaction.getClass().getName()); // Associate with the thread TransactionImpl transactionImpl = (TransactionImpl) transaction; ThreadInfo ti = getThreadInfo(); ti.tx = transactionImpl; transactionImpl.associateCurrentThread(); } private void associateThread(ThreadInfo ti, TransactionImpl transaction) { // Associate with the thread ti.tx = transaction; transaction.associateCurrentThread(); }
TxManager.disassociateThreadメソッド
public Transaction disassociateThread() { return disassociateThread(getThreadInfo()); } private Transaction disassociateThread(ThreadInfo ti) { TransactionImpl current = ti.tx; ti.tx=null; current.disassociateCurrentThread(); return current; }
単純にThreadInfoオブジェクトに貼り付けたりはがしたりしているだけ.
ThreadInfo自身は
private ThreadInfo getThreadInfo() { ThreadInfo ret = (ThreadInfo) threadTx.get(); if (ret == null) { ret = new ThreadInfo(); ret.timeout = timeOut; threadTx.set(ret); } return ret; } static class ThreadInfo { long timeout; TransactionImpl tx; }
ほんとうにただのTransactionImplの入れ物という感じ.再利用のためだけの仕組み.