001 /** 002 * 003 * Copyright 2004 Protique Ltd 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.vm; 019 020 import java.util.Collections; 021 import java.util.Iterator; 022 import java.util.LinkedHashMap; 023 import java.util.Map; 024 025 import javax.jms.JMSException; 026 027 import org.activemq.message.ActiveMQMessage; 028 import org.activemq.message.MessageAck; 029 import org.activemq.service.MessageIdentity; 030 import org.activemq.store.MessageStore; 031 import org.activemq.store.RecoveryListener; 032 033 /** 034 * An implementation of {@link org.activemq.store.MessageStore} which uses a 035 * 036 * @version $Revision: 1.1.1.1 $ 037 */ 038 public class VMMessageStore implements MessageStore { 039 040 protected Map messageTable; 041 protected MessageIdentity lastMessageIdentity; 042 043 public VMMessageStore() { 044 this(new LinkedHashMap()); 045 } 046 047 public VMMessageStore(LinkedHashMap messageTable) { 048 this.messageTable = Collections.synchronizedMap(messageTable); 049 } 050 051 public synchronized void addMessage(ActiveMQMessage message) throws JMSException { 052 messageTable.put(message.getJMSMessageID(), message); 053 lastMessageIdentity = message.getJMSMessageIdentity(); 054 } 055 056 public ActiveMQMessage getMessage(MessageIdentity identity) throws JMSException { 057 String messageID = identity.getMessageID(); 058 return (ActiveMQMessage) messageTable.get(messageID); 059 } 060 061 public void removeMessage(MessageAck ack) throws JMSException { 062 messageTable.remove(ack.getMessageID()); 063 } 064 065 public void removeMessage(MessageIdentity msgId) throws JMSException { 066 messageTable.remove(msgId.getMessageID()); 067 } 068 069 public void recover(RecoveryListener listener) throws JMSException { 070 for (Iterator iter = messageTable.values().iterator(); iter.hasNext();) { 071 ActiveMQMessage msg = (ActiveMQMessage) iter.next(); 072 listener.recoverMessage(msg.getJMSMessageIdentity()); 073 } 074 } 075 076 public void start() throws JMSException { 077 } 078 079 public void stop() throws JMSException { 080 } 081 082 public void removeAllMessages() throws JMSException { 083 messageTable.clear(); 084 } 085 086 }