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 019 package org.activemq.message; 020 021 import org.activemq.service.MessageIdentity; 022 023 import java.io.DataInput; 024 import java.io.IOException; 025 import java.io.DataOutput; 026 027 /** 028 * Denotes an object that can be serialized/deserailized using a PacketReader/PacketWriter 029 */ 030 031 public class MessageAck extends AbstractPacket implements BodyPacket{ 032 033 public static final int MESSAGE_READ_INDEX = 2; 034 public static final int XA_TRANS_INDEX = 3; 035 public static final int PERSISTENT_INDEX = 4; 036 public static final int EXPIRED_INDEX = 5; 037 public static final int TRANSACTION_ID_INDEX = 6; 038 public static final int EXTERNAL_MESSAGE_ID_INDEX = 7; 039 public static final int CACHED_VALUES_INDEX = 8; 040 public static final int LONG_SEQUENCE_INDEX = 9; 041 042 private String consumerId; 043 private String messageID; 044 private ActiveMQDestination destination; 045 private Object transactionId; 046 private boolean messageRead; 047 private boolean xaTransacted; 048 private boolean persistent; 049 private boolean expired; 050 private short sessionId; 051 private long sequenceNumber; 052 private String producerKey; 053 private boolean externalMessageId; 054 private transient MessageIdentity messageIdentity; 055 056 057 /** 058 * Return the type of Packet 059 * 060 * @return integer representation of the type of Packet 061 */ 062 063 public int getPacketType() { 064 return ACTIVEMQ_MSG_ACK; 065 } 066 067 /** 068 * @return pretty print of this Packet 069 */ 070 public String toString() { 071 return super.toString() + " MessageAck{ " + 072 "consumerId = '" + consumerId + "' " + 073 ", messageID = '" + messageID + "' " + 074 ", destination = " + destination + 075 ", transactionId = '" + transactionId + "' " + 076 ", messageRead = " + messageRead + 077 ", xaTransacted = " + xaTransacted + 078 ", persistent = " + persistent + 079 ", expired = " + expired + 080 ", messageIdentity = " + messageIdentity + 081 " }"; 082 } 083 084 085 /** 086 * @return Returns the transactionId. 087 * 088 * @Transient 089 */ 090 public Object getTransactionId() { 091 return this.transactionId; 092 } 093 094 /** 095 * @param newTransactionId The transactionId to set. 096 * 097 * @Transient 098 */ 099 public void setTransactionId(Object newTransactionId) { 100 this.transactionId = newTransactionId; 101 this.xaTransacted = newTransactionId!=null && newTransactionId.getClass()==ActiveMQXid.class; 102 } 103 104 105 public void readBody(DataInput dataIn) throws IOException { 106 setTransactionIDString(dataIn.readUTF()); 107 } 108 109 public void writeBody(DataOutput dataOut) throws IOException { 110 dataOut.writeUTF(getTransactionIDString()); 111 } 112 113 /** 114 * @return Returns true if this message is part of a transaction 115 */ 116 117 public boolean isPartOfTransaction() { 118 return this.transactionId != null; 119 } 120 121 122 /** 123 * @return the messageId 124 */ 125 126 public String getMessageID() { 127 if (messageID == null && producerKey != null){ 128 messageID = producerKey + sequenceNumber; 129 } 130 return messageID; 131 } 132 133 /** 134 * @param messageID The messageID to set. 135 */ 136 public void setMessageID(String messageID) { 137 this.messageID = messageID; 138 this.messageIdentity=null; 139 } 140 141 /** 142 * @return Returns the messageRead. 143 */ 144 public boolean isMessageRead() { 145 return messageRead; 146 } 147 148 /** 149 * @param messageRead The messageRead to set. 150 */ 151 public void setMessageRead(boolean messageRead) { 152 this.messageRead = messageRead; 153 } 154 155 /** 156 * @return Returns the consumerId. 157 */ 158 public String getConsumerId() { 159 return consumerId; 160 } 161 162 /** 163 * @param consumerId The consumerId to set. 164 */ 165 public void setConsumerId(String consumerId) { 166 this.consumerId = consumerId; 167 } 168 169 /** 170 * @return Returns the xaTransacted. 171 */ 172 public boolean isXaTransacted() { 173 return xaTransacted; 174 } 175 176 public MessageIdentity getMessageIdentity() { 177 if (messageIdentity == null) { 178 messageIdentity = new MessageIdentity(getMessageID()); 179 } 180 return messageIdentity; 181 } 182 /** 183 * @return Returns the destination. 184 */ 185 public ActiveMQDestination getDestination() { 186 return destination; 187 } 188 /** 189 * @param destination The destination to set. 190 */ 191 public void setDestination(ActiveMQDestination destination) { 192 this.destination = destination; 193 } 194 /** 195 * @return Returns the persistent. 196 */ 197 public boolean isPersistent() { 198 return persistent; 199 } 200 /** 201 * @param persistent The persistent to set. 202 */ 203 public void setPersistent(boolean persistent) { 204 this.persistent = persistent; 205 } 206 207 /** 208 * @return true the delivered message was to a non-persistent destination 209 */ 210 public boolean isTemporary(){ 211 return persistent == false || (destination != null && destination.isTemporary()); 212 } 213 214 /** 215 * @return Returns the expired. 216 */ 217 public boolean isExpired() { 218 return expired; 219 } 220 /** 221 * @param expired The expired to set. 222 */ 223 public void setExpired(boolean expired) { 224 this.expired = expired; 225 } 226 227 /** 228 * @return Returns the producerKey. 229 */ 230 public String getProducerKey() { 231 return producerKey; 232 } 233 /** 234 * @param producerKey The producerKey to set. 235 */ 236 public void setProducerKey(String producerKey) { 237 this.producerKey = producerKey; 238 } 239 240 /** 241 * @return Returns the messageSequence. 242 */ 243 public long getSequenceNumber() { 244 return sequenceNumber; 245 } 246 /** 247 * @param messageSequence The messageSequence to set. 248 */ 249 public void setSequenceNumber(long messageSequence) { 250 this.sequenceNumber = messageSequence; 251 } 252 /** 253 * @return Returns the sessionId. 254 */ 255 public short getSessionId() { 256 return sessionId; 257 } 258 /** 259 * @param sessionId The sessionId to set. 260 */ 261 public void setSessionId(short sessionId) { 262 this.sessionId = sessionId; 263 } 264 /** 265 * @return Returns the externalMessageId. 266 */ 267 public boolean isExternalMessageId() { 268 return externalMessageId; 269 } 270 /** 271 * @param externalMessageId The externalMessageId to set. 272 */ 273 public void setExternalMessageId(boolean externalMessageId) { 274 this.externalMessageId = externalMessageId; 275 } 276 277 /** 278 * A helper method for the OpenWire protocol 279 */ 280 public String getTransactionIDString() throws IOException { 281 return ActiveMQXid.transactionIDToString(getTransactionId()); 282 } 283 284 /** 285 * A helper method for the OpenWire protocol 286 */ 287 public void setTransactionIDString(String text) throws IOException { 288 setTransactionId(ActiveMQXid.transactionIDFromString(text)); 289 } 290 }