1 21 package com.presumo.jms.message; 22 23 import com.presumo.jms.plugin.MessageQueue; 24 import com.presumo.jms.resources.Resources; 25 import com.presumo.util.log.Logger; 26 import com.presumo.util.log.LoggerFactory; 27 28 import java.util.ArrayList ; 29 import java.util.BitSet ; 30 31 36 public class AckHelper 37 { 38 private MessageStateListener originator; 39 40 43 private ArrayList deletionListeners = new ArrayList (); 44 private BitSet safeAcks = new BitSet (); 45 private BitSet routedAcks = new BitSet (); 46 private boolean deletedRemotely = true; 47 48 private final JmsMessage msg; 49 50 51 private MessageQueue storedIn; 52 53 57 AckHelper(JmsMessage msg) 58 { 59 this.msg = msg; 60 } 61 62 63 64 68 public synchronized void setMessageQueue(MessageQueue queue) 69 { 70 this.storedIn = queue; 71 } 72 73 77 public synchronized void addDeletionListener(MessageStateListener listener) 78 { 79 logger.entry("addDeletionListener", listener); 80 81 safeAcks.set(deletionListeners.size()); 82 routedAcks.set(deletionListeners.size()); 83 deletionListeners.add(listener); 84 85 logger.exit("addDeletionListener"); 86 } 87 88 89 94 public synchronized void safeAck(MessageStateListener listener) 95 { 96 logger.entry("safeAck", listener); 97 98 int loc = deletionListeners.indexOf(listener); 99 100 if (loc != -1) { 101 safeAcks.clear(loc); 102 if (safeAcks.length() == 0 && originator != null) 103 originator.messageRouted(msg); 104 } 105 106 logger.exit("safeAck"); 107 } 108 109 110 120 public synchronized void routedAck(MessageStateListener listener) 121 { 122 logger.entry("routedAck", listener); 123 124 int loc = deletionListeners.indexOf(listener); 125 126 if (loc != -1) { 127 128 if (safeAcks.get(loc)) { 129 safeAck(listener); 133 } 134 135 routedAcks.clear(loc); 136 if (routedAcks.length() == 0 && deletedRemotely) { 137 try { 139 if (storedIn != null) { 140 storedIn.delete(msg.getJMSMessageID()); 141 } 142 } catch (java.io.IOException ioe) { 143 logger.exception(ioe); 144 } 145 146 for (int i=0; i < deletionListeners.size(); ++i) { 147 MessageStateListener destListener = 148 (MessageStateListener) deletionListeners.get(i); 149 destListener.messageDeleted(msg); 150 } 151 } 152 } 153 154 logger.exit("routedAck"); 155 } 156 157 168 public synchronized void deleteAck(MessageStateListener listener) 169 { 170 logger.entry("deleteAck", listener); 171 172 deletedRemotely = true; 173 if (routedAcks.length() == 0 && deletedRemotely) { 174 175 try { 177 if (storedIn != null) { 178 storedIn.delete(msg.getJMSMessageID()); 179 } 180 } catch (java.io.IOException ioe) { 181 logger.exception(ioe); 182 } 183 184 for (int i=0; i < deletionListeners.size(); ++i) { 185 MessageStateListener destListener = 186 (MessageStateListener) deletionListeners.get(i); 187 destListener.messageDeleted(msg); 188 } 189 } 190 191 logger.exit("deleteAck"); 192 } 193 194 195 200 public synchronized void setOriginator(MessageStateListener originator) 201 { 202 logger.entry("setOriginator", originator); 203 204 this.originator = originator; 205 deletedRemotely = false; 206 207 logger.exit("setOriginator"); 208 } 209 210 211 213 private static Logger logger = 214 LoggerFactory.getLogger(AckHelper.class, Resources.getBundle()); 215 216 218 } 219 | Popular Tags |