001 /** 002 * 003 * Copyright 2004 Hiram Chirino 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 * 017 **/ 018 package org.activemq.store.cache; 019 020 import java.io.IOException; 021 import java.util.Map; 022 023 import javax.jms.JMSException; 024 025 import org.activemq.store.MessageStore; 026 import org.activemq.store.PersistenceAdapter; 027 import org.activemq.store.TopicMessageStore; 028 import org.activemq.store.TransactionStore; 029 030 /** 031 * Implements a {@link PersistenceAdapter} designed to 032 * to speed up access to recently added messages by using 033 * a MessageCache . 034 * 035 * @version $Revision: 1.1.1.1 $ 036 */ 037 public abstract class CachePersistenceAdapter implements PersistenceAdapter { 038 039 private PersistenceAdapter longTermPersistence; 040 041 public CachePersistenceAdapter() { 042 } 043 044 public CachePersistenceAdapter(PersistenceAdapter longTermPersistence) throws IOException { 045 this.longTermPersistence = longTermPersistence; 046 } 047 048 public Map getInitialDestinations() { 049 return longTermPersistence.getInitialDestinations(); 050 } 051 052 public MessageStore createQueueMessageStore(String destinationName) throws JMSException { 053 MessageStore longtermStore = longTermPersistence.createQueueMessageStore(destinationName); 054 CacheMessageStore store = new CacheMessageStore(this, longtermStore, createMessageCache(destinationName)); 055 return store; 056 } 057 058 public TopicMessageStore createTopicMessageStore(String destinationName) throws JMSException { 059 TopicMessageStore longtermStore = longTermPersistence.createTopicMessageStore(destinationName); 060 CacheTopicMessageStore store = new CacheTopicMessageStore(this, longtermStore, new SimpleMessageCache()); 061 return store; 062 } 063 064 public TransactionStore createTransactionStore() throws JMSException { 065 return longTermPersistence.createTransactionStore(); 066 } 067 068 public void beginTransaction() throws JMSException { 069 longTermPersistence.beginTransaction(); 070 } 071 072 public void commitTransaction() throws JMSException { 073 longTermPersistence.commitTransaction(); 074 } 075 076 public void rollbackTransaction() { 077 longTermPersistence.rollbackTransaction(); 078 } 079 080 public void start() throws JMSException { 081 longTermPersistence.start(); 082 } 083 084 public void stop() throws JMSException { 085 longTermPersistence.stop(); 086 } 087 088 /** 089 * Verifies if a dead letter has already been sent for a message 090 * @param seq 091 * @param useLocking to prevent concurrency/dups 092 * @return 093 */ 094 public boolean deadLetterAlreadySent(long seq, boolean useLocking) { 095 return longTermPersistence.deadLetterAlreadySent(seq, useLocking); 096 } 097 098 // Properties 099 //------------------------------------------------------------------------- 100 public PersistenceAdapter getLongTermPersistence() { 101 return longTermPersistence; 102 } 103 104 public void setLongTermPersistence(PersistenceAdapter longTermPersistence) { 105 this.longTermPersistence = longTermPersistence; 106 } 107 108 /** 109 * Subclasses should override this method to change the type 110 * of MessageCache that is used to cache messages. 111 * 112 * @param destinationName 113 * @return 114 */ 115 abstract protected MessageCache createMessageCache(String destinationName); 116 117 }