View Javadoc

1   /*** 
2    * 
3    * Copyright 2004 Protique Ltd
4    * 
5    * Licensed under the Apache License, Version 2.0 (the "License"); 
6    * you may not use this file except in compliance with the License. 
7    * You may obtain a copy of the License at 
8    * 
9    * http://www.apache.org/licenses/LICENSE-2.0
10   * 
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS, 
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
14   * See the License for the specific language governing permissions and 
15   * limitations under the License. 
16   * 
17   **/
18  
19  package org.codehaus.activemq;
20  
21  import org.codehaus.activemq.message.Packet;
22  import org.codehaus.activemq.util.BitArrayBin;
23  import org.codehaus.activemq.util.IdGenerator;
24  
25  import javax.jms.Message;
26  import java.util.LinkedHashMap;
27  
28  /***
29   * Provides basic audit functions for Messages
30   *
31   * @version $Revision: 1.3 $
32   */
33  public class ActiveMQMessageAudit {
34      private static final int DEFAULT_WINDOW_SIZE = 1024;
35      private static final int MAXIMUM_PRODUCER_COUNT = 128;
36      private int windowSize;
37      private LinkedHashMap map;
38  
39      /***
40       * Default Constructor windowSize = 1024, maximumNumberOfProducersToTrack = 128
41       */
42      public ActiveMQMessageAudit() {
43          this(DEFAULT_WINDOW_SIZE, MAXIMUM_PRODUCER_COUNT);
44      }
45  
46      /***
47       * Construct a MessageAudit
48       *
49       * @param windowSize range of ids to track
50       * @param maximumNumberOfProducersToTrack
51       *                   number of producers expected in the system
52       */
53      public ActiveMQMessageAudit(int windowSize, final int maximumNumberOfProducersToTrack) {
54          this.windowSize = windowSize;
55          map = new LinkedHashMap() {
56              public boolean removeOldestEntry() {
57                  return size() > maximumNumberOfProducersToTrack;
58              }
59          };
60      }
61  
62      /***
63       * Checks if this message has beeb seen before
64       *
65       * @param message
66       * @return true if the message is a duplicate
67       */
68      public boolean isDuplicate(Message message) {
69          if (message instanceof Packet) {
70              return isDuplicate((Packet) message);
71          }
72          return false;
73      }
74  
75      /***
76       * checks whether this messageId has been seen before
77       *
78       * @param packet
79       * @return true if the message is a duplicate
80       */
81      public boolean isDuplicate(Packet packet) {
82          return isDuplicate(packet.getId());
83      }
84  
85      /***
86       * checks whether this messageId has been seen before and adds this messageId to the list
87       *
88       * @param id
89       * @return true if the message is a duplicate
90       */
91      public boolean isDuplicate(String id) {
92          boolean answer = false;
93          String seed = IdGenerator.getSeedFromId(id);
94          if (seed != null) {
95              BitArrayBin bab = (BitArrayBin) map.get(seed);
96              if (bab == null) {
97                  bab = new BitArrayBin(windowSize);
98                  map.put(seed, bab);
99              }
100             long index = IdGenerator.getCountFromId(id);
101             if (index >= 0) {
102                 answer = bab.setBit(index, true);
103             }
104         }
105         return answer;
106     }
107 }