resourcemanager.java
来自「OpenJMS是一个开源的Java Message Service API 1.」· Java 代码 · 共 1,362 行 · 第 1/4 页
JAVA
1,362 行
private void addTridLogEntry(ExternalXid trid, TransactionLog log) { synchronized (_cacheLock) { // one to one relationship _tridToLogCache.put(trid, log); // one to many relationship Vector trids = (Vector) _logToTridCache.get(log); if (trids == null) { trids = new Vector(); _logToTridCache.put(log, trids); } trids.addElement(trid); } } /** * Check whether the specified log is also the current log * * @param log - the log to check * @return boolean - true if it is */ private boolean isCurrentTransactionLog(TransactionLog log) { boolean result = false; if (_logs.size() > 0) { result = log.equals(_logs.last()); } return result; } /** * Remove an entry to the trid log cache table for the specified trid and * transaction log mapping. * * @param trid - the transaction identifier * @param log - the transaction log */ private void removeTridLogEntry(ExternalXid trid, TransactionLog log) { synchronized (_cacheLock) { // one to one relationship _tridToLogCache.remove(trid); // one to many relationship Vector trids = (Vector) _logToTridCache.get(log); if (trids != null) { trids.remove(trid); if (trids.size() == 0) { _logToTridCache.remove(log); } } } } /** * Return an arrya of records, both state and date, for the specified global * transaction * * @param xid - the global transaction id * @param rid - the resource id * @return Object[] - array of records */ protected Object[] getTransactionRecords(ExternalXid xid, String rid) { Object[] records; // we also want to add this to the transaction data for that // txid LinkedList list = (LinkedList) _activeTransactions.get(xid); if (list != null) { records = list.toArray(); } else { records = new Object[0]; } return records; } /** * Return the sequence number of the file files are associated with a unique * number * * @param name - the file name to investigate * @return long - the transaction log number * @throws ResourceManagerException */ protected long getSequenceNumber(String name) throws ResourceManagerException { int start = name.indexOf(RM_LOGFILE_PREFIX) + RM_LOGFILE_PREFIX.length(); int end = name.indexOf(RM_LOGFILE_EXTENSION); // the number must be between the start and end positions try { return Long.parseLong(name.substring(start, end)); } catch (NumberFormatException exception) { throw new ResourceManagerException( "Invalid name assigned to resource manager file " + name); } } /** * Return true if the specified transaction is active * * @param xid - the gobal transaction identifier */ private synchronized boolean isTransactionActive(ExternalXid xid) { return _activeTransactions.containsKey(xid); } /** * Dump the specified records to the screen */ private void dumpRecovered(HashMap records) { Iterator iter = records.keySet().iterator(); while (iter.hasNext()) { ExternalXid txid = (ExternalXid) iter.next(); LinkedList list = (LinkedList) records.get(txid); Iterator oiter = list.iterator(); while (oiter.hasNext()) { Object object = oiter.next(); if (object instanceof StateTransactionLogEntry) { System.err.println( "Recovered [" + txid + "] Class " + object.getClass().getName() + " [" + ((StateTransactionLogEntry) object).getState() .toString() + "]"); } else { System.err.println("Recovered [" + txid + "] Class " + object.getClass().getName()); } } } } /** * Helper and type-safe method for creating a wrapper object for published * messages * * @param message - the message published * @return PublishedMessageWrapper */ private PublishedMessageWrapper createPublishedMessageWrapper( MessageImpl message) { return new PublishedMessageWrapper(message); } /** * Helper and type-safe method for creating a wrapper object for received * messages * * @param id - the identity of the consumer receiving the message * @param handle - the handle of the message received * @return ReceivedMessageWrapper */ private ReceivedMessageWrapper createReceivedMessageWrapper(long id, MessageHandle handle) { return new ReceivedMessageWrapper(id, handle); } /** * This functor is used by various collections to order the transaction log * files created by this resource manager. The resource manager will create * log files with sequentially increasing numbers (i.e xxx01.log, xxx2.log */ private class TranLogFileComparator implements Comparator { // implementation of Comparator.comapre public int compare(Object o1, Object o2) { int result = -1; try { if ((o1 instanceof TransactionLog) && (o2 instanceof TransactionLog)) { long seq1 = getSequenceNumber( ((TransactionLog) o1).getName()); long seq2 = getSequenceNumber( ((TransactionLog) o2).getName()); if (seq1 > seq2) { result = 1; } else if (seq1 < seq2) { result = -1; } else { result = 0; } } else { throw new ClassCastException("o1 = " + o1.getClass().getName() + " and o2 = " + o2.getClass().getName()); } } catch (Exception exception) { throw new RuntimeException("Error in ResourceManager.compare " + exception.toString()); } return result; } // implementation of Comparator.equals public boolean equals(Object obj) { if (obj instanceof TranLogFileComparator) { return true; } return false; } } /** * This private member class is used to wrap the transactional object, which * for this particular resource manager is a published message or a received * message handle. */ abstract private class TransactionalObjectWrapper { /** * The transactional object instance */ private Object _object; /** * Create an instance of the wrapper using the type and the object * * @param object - the associated object */ public TransactionalObjectWrapper(Object object) { _object = object; } /** * Check whether the wrapper contains a published message. Note that a * published message has a {@link MessageImpl} a the transactional * object. * * @return boolean - true if it is */ public boolean isPublishedMessage() { return this instanceof PublishedMessageWrapper; } /** * Check whether the wrapper contains a received message handle. Note * that a received message contains a {@link MessageHandle} as the * transactional object. * * @return boolean - true if it does */ public boolean isReceivedMessage() { return this instanceof ReceivedMessageWrapper; } /** * Return the transaction object * * @return Object */ public Object getObject() { return _object; } } /** * This private member class is used to wrap a published message */ private class PublishedMessageWrapper extends TransactionalObjectWrapper { /** * Create an instance of the wrapper using the specified message * * @param message - the message to wrap */ public PublishedMessageWrapper(MessageImpl message) { super(message); } /** * Return an instance of the message object * * @return MessageImpl */ public MessageImpl getMessage() { return (MessageImpl) super.getObject(); } } /** * This private member class is used to wrap a received message */ private class ReceivedMessageWrapper extends TransactionalObjectWrapper { /** * Caches the id of the {@link ConsumerEndpoint} that is processed this * handle */ private long _consumerId; /** * Create an instance of the wrapper using the specified message * * @param id - the identity of the consumer endpoint * @param handle - the handle to the message */ public ReceivedMessageWrapper(long id, MessageHandle handle) { super(handle); _consumerId = id; } /** * Return a reference to the consumer identity * * @return String */ public long getConsumerId() { return _consumerId; } /** * Return an instance of the message handle * * @return MessageHandle */ public MessageHandle getMessageHandle() { return (MessageHandle) super.getObject(); } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?