Package org.jboss.messaging.core.contract

Examples of org.jboss.messaging.core.contract.Queue


          
           List targets = new ArrayList();
          
           while (iter.hasNext())
           {
             Queue queue = (Queue)iter.next();
            
             if (trace) { log.trace(this + " considering queue " + queue); }
            
             if (queue.getNodeID() == thisNodeID)
             {
               if (trace) { log.trace(this + " is a local queue"); }
            
               //Local queue

               boolean routeLocal = false;
              
               if (!fromCluster)
               {
                 //Same node
                 routeLocal = true;
               }
               else
               {
                 //From the cluster
                 if (!queue.isRecoverable() && queue.isClustered())
                 {
                   //When routing from the cluster we only route to non recoverable queues
                   //who haven't already been routed to on the sending node (same name)
                   //Also we don't route to non clustered queues
                   if (names == null || !names.contains(queue.getName()))
                   {
                     routeLocal = true;
                   }
                 }
               }
              
               if (routeLocal)
               {
                 //If we're not routing from the cluster OR the queue is unreliable then we consider it
                
                 //When we route from the cluster we never route to reliable queues
                
                 Filter filter = queue.getFilter();
                
                 if (filter == null || filter.accept(ref.getMessage()))
                 {                   
                   if (trace) { log.trace(this + " Added queue " + queue + " to list of targets"); }
                  
                  targets.add(queue);
                 
                  if (ref.getMessage().isReliable() && queue.isRecoverable())
                   {
                     localReliableCount++;
                   }                
                 }  
               }
             }
             else if (!fromCluster)
             {
               //Remote queue
              
               if (trace) { log.trace(this + " is a remote queue"); }
              
               if (!queue.isRecoverable() && queue.isClustered())
               {                
                 //When we send to the cluster we never send to reliable queues
                
                 Filter filter = queue.getFilter();
                
                 if (filter == null || filter.accept(ref.getMessage()))
                 {
                   if (remoteSet == null)
                   {
                     remoteSet = new HashSet();
                   }
                  
                   remoteSet.add(new Integer(queue.getNodeID()));
                  
                   if (trace) { log.trace(this + " added it to the remote set for casting"); }
                 }
               }
               else
               {
                 if (trace) { log.trace(this + " is recoverable so not casting"); }
               }
             }
           }
                                
           //If the ref is reliable and there is more than one reliable local queue that accepts the message then we need
           //to route in a transaction to guarantee once and only once reliability guarantee
          
           boolean startedTx = false;
          
           if (tx == null && localReliableCount > 1)
           {
             if (trace) { log.trace("Starting internal tx, reliableCount = " + localReliableCount); }
            
             tx = tr.createTransaction();
            
             startedTx = true;
           }
          
           //Now actually route the ref
          
           iter = targets.iterator();
          
           Set queueNames = null;
          
           while (iter.hasNext())
           {
             Queue queue = (Queue)iter.next();
            
             if (trace) { log.trace(this + " Routing ref to queue " + queue); }
                       
             Delivery del = queue.handle(null, ref, tx);
            
             if (trace) { log.trace("Queue returned " + del); }

               if (del != null && del.isSelectorAccepted())
               {
                  routed = true;
                 
                  if (remoteSet != null)
                  {
                    if (queueNames == null)
                    {
                      queueNames = new HashSet();
                    }
                   
                    //We put the queue name in a set - this is used on other nodes after routing from the cluster so it
                    //doesn't route to queues with the same name on other nodes
                    queueNames.add(queue.getName());
                  }
               }
           }
                      
            if (remoteSet != null)
View Full Code Here


      return binding;
   }
  
   private boolean addBindingInMemory(Binding binding) throws Exception
   {
     Queue queue = binding.queue;
         
     if (trace) { log.trace(this + " Adding binding in memory " + binding); }
    
      boolean intr = Thread.interrupted();
      for (;;)
      {
         try
         {
            lock.writeLock().acquire();
            break;
         }
         catch (InterruptedException ex)
         {
            intr = true;
         }
      }
    
     try
     {   
       Integer nid = new Integer(queue.getNodeID());
      
       Map nameMap = (Map)nameMaps.get(nid);
             
       if (nameMap != null && nameMap.containsKey(queue.getName()))
       {
         return false;
       }
      
       Long cid = new Long(queue.getChannelID());
      
       if (channelIDMap.containsKey(cid))
       {
         throw new IllegalStateException("Channel id map for node " + nid + " already contains binding for queue " + cid);
       }
      
       if (nameMap == null)
       {
         nameMap = new HashMap();
        
         nameMaps.put(nid, nameMap);
        
         if (queue.getNodeID() == thisNodeID)
         {
           localNameMap = nameMap;
         }
       }
      
       nameMap.put(queue.getName(), binding);
      
       channelIDMap.put(cid, binding);
             
       Condition condition = binding.condition;    
      
       List queues = (List)mappings.get(condition);
      
       if (queues == null)
       {
         queues = new ArrayList();
        
         if (queues.contains(queue))
         {
           throw new IllegalArgumentException("Queue is already bound with condition " + condition);
         }
        
         mappings.put(condition, queues);
       }
      
       queues.add(queue)
     }
     finally
     {
       lock.writeLock().release();
       if (intr) Thread.currentThread().interrupt();
     }
    
     if (trace) { log.trace(this + " Sending cluster notification"); }
    
      //Send a notification
      ClusterNotification notification = new ClusterNotification(ClusterNotification.TYPE_BIND, queue.getNodeID(), queue.getName());
     
      clusterNotifier.sendNotification(notification);
     
      return true;
   }
View Full Code Here

                  if (selector != null)
                  {
                     filter = filterFactory.createFilter(selector);
                  }

                  Queue queue = new MessagingQueue(thisNodeID, queueName, channelID, ms, pm,
                                                   true, filter, bindingClustered && clustered);

                  if (trace) { log.trace(this + " loaded binding from storage: " + queueName); }

                  Condition condition = conditionFactory.createCondition(conditionText);
View Full Code Here

      {
        Binding binding = (Binding)iter.next();
       
        addBindingInMemory(binding);   
       
        Queue queue = binding.queue;
        
         //Need to broadcast it too
         if (clustered && queue.isClustered())
         {
           String filterString = queue.getFilter() == null ? null : queue.getFilter().getFilterString();                     
          
           MappingInfo info = new MappingInfo(thisNodeID, queue.getName(), binding.condition.toText(), filterString, queue.getChannelID(),
                                            queue.isRecoverable(), true,
                                            binding.allNodes,
                                            queue.getFullSize(), queue.getPageSize(), queue.getDownCacheSize(),
                                            queue.getMaxSize(),
                                            queue.getRecoverDeliveriesTimeout());
          
            ClusterRequest request = new BindRequest(info, binding.allNodes);

            log.trace("Multicasting bind all");
            groupMember.multicastControl(request, false);        
View Full Code Here

            //Look up the queue

            Binding binding = postOffice.getBindingForQueueName(queueName);

            Queue queue = binding.queue;

            if (queue == null)
            {
               throw new IllegalStateException("Cannot find queue with queue name: " + queueName);
            }

            List acks = (List)entry.getValue();

            List ids = new ArrayList(acks.size());

            for (Iterator iter2 = acks.iterator(); iter2.hasNext(); )
            {
               DeliveryRecovery info = (DeliveryRecovery)iter2.next();

               ids.add(new Long(info.getMessageID()));
            }

            JMSCondition cond = (JMSCondition)binding.condition;

            ManagedDestination dest =
               sp.getDestinationManager().getDestination(cond.getName(), cond.isQueue());

            if (dest == null)
            {
               throw new IllegalStateException("Cannot find managed destination with name " +
                  cond.getName() + " isQueue" + cond.isQueue());
            }

            Queue dlqToUse =
               dest.getDLQ() == null ? defaultDLQ : dest.getDLQ();

            Queue expiryQueueToUse =
               dest.getExpiryQueue() == null ? defaultExpiryQueue : dest.getExpiryQueue();

            int maxDeliveryAttemptsToUse =
               dest.getMaxDeliveryAttempts() == -1 ? defaultMaxDeliveryAttempts : dest.getMaxDeliveryAttempts();
View Full Code Here

         dm.registerDestination(mDest);

         if (dest.isQueue())
         {
            Queue coreQueue = new MessagingQueue(nodeId, dest.getName(),
                                     idm.getID(), ms, pm, false, -1, null,
                                       fullSize, pageSize, downCacheSize, postOffice.isClustered(),
                                       sp.getRecoverDeliveriesTimeout());


            Condition cond = new JMSCondition(true, dest.getName());

           // make a binding for this temporary queue

            // temporary queues need to bound on ALL nodes of the cluster
            postOffice.addBinding(new Binding(cond, coreQueue, true), postOffice.isClustered());

            coreQueue.activate();
         }
      }
      catch (Throwable t)
      {
         throw ExceptionUtil.handleJMSInvocation(t, this + " addTemporaryDestination");
View Full Code Here

         {
            throw new InvalidDestinationException("Cannot find durable subscription with name " +
                                                  subscriptionName + " to unsubscribe");
         }

         Queue sub = binding.queue;

         // Section 6.11. JMS 1.1.
         // "It is erroneous for a client to delete a durable subscription while it has an active
         // TopicSubscriber for it or while a message received by it is part of a current
         // transaction or has not been acknowledged in the session."

         if (sub.getLocalDistributor().getNumberOfReceivers() != 0)
         {
            throw new IllegalStateException("Cannot unsubscribe durable subscription " +
                                            subscriptionName + " since it has active subscribers");
         }

         //Also if it is clustered we must disallow unsubscribing if it has active consumers on other nodes

         if (sub.isClustered() && postOffice.isClustered())
         {
           Replicator rep = (Replicator)postOffice;

           Map map = rep.get(sub.getName());

           if (!map.isEmpty())
           {
             throw new IllegalStateException("Cannot unsubscribe durable subscription " +
                     subscriptionName + " since it has active subscribers on other nodes");
           }
         }

         postOffice.removeBinding(sub.getName(), sub.isClustered() && postOffice.isClustered());

         String counterName = TopicService.SUBSCRIPTION_MESSAGECOUNTER_PREFIX + sub.getName();

         MessageCounter counter = sp.getMessageCounterManager().unregisterMessageCounter(counterName);

         if (counter == null)
         {
View Full Code Here

      if (selectorString != null)
      {
         selector = new Selector(selectorString);
      }

      Queue queue;

      if (jmsDestination.isTopic())
      {
         if (subscriptionName == null)
         {
            // non-durable subscription
            if (log.isTraceEnabled()) { log.trace(this + " creating new non-durable subscription on " + jmsDestination); }

            // Create the non durable sub

            queue = new MessagingQueue(nodeId, GUIDGenerator.generateGUID(),
                                idm.getID(), ms, pm, false,
                                mDest.getMaxSize(), selector,
                                mDest.getFullSize(),
                                mDest.getPageSize(),
                                mDest.getDownCacheSize(),
                                mDest.isClustered(),
                                sp.getRecoverDeliveriesTimeout());

            JMSCondition topicCond = new JMSCondition(false, jmsDestination.getName());

            postOffice.addBinding(new Binding(topicCond, queue, false), false);

            queue.activate();

            String counterName = TopicService.SUBSCRIPTION_MESSAGECOUNTER_PREFIX + queue.getName();

            int dayLimitToUse = mDest.getMessageCounterHistoryDayLimit();
            if (dayLimitToUse == -1)
            {
               //Use override on server peer
               dayLimitToUse = sp.getDefaultMessageCounterHistoryDayLimit();
            }

            //We don't create message counters on temp topics
            if (!mDest.isTemporary())
            {
              MessageCounter counter =  new MessageCounter(counterName, null, queue, true, false, dayLimitToUse);

              sp.getMessageCounterManager().registerMessageCounter(counterName, counter);
            }
         }
         else
         {
            if (jmsDestination.isTemporary())
            {
               throw new InvalidDestinationException("Cannot create a durable subscription on a temporary topic");
            }

            // We have a durable subscription, look it up
            String clientID = connectionEndpoint.getClientID();
            if (clientID == null)
            {
               throw new JMSException("Cannot create durable subscriber without a valid client ID");
            }

            // See if there any bindings with the same client_id.subscription_name name

            String name = MessageQueueNameHelper.createSubscriptionName(clientID, subscriptionName);

            Binding binding = postOffice.getBindingForQueueName(name);

            if (binding == null)
            {
               // Does not already exist

               if (trace) { log.trace(this + " creating new durable subscription on " + jmsDestination); }

               queue = new MessagingQueue(nodeId, name, idm.getID(),
                                          ms, pm, true,
                                          mDest.getMaxSize(), selector,
                                          mDest.getFullSize(),
                                          mDest.getPageSize(),
                                          mDest.getDownCacheSize(),
                                          mDest.isClustered(),
                                          sp.getRecoverDeliveriesTimeout());

               // Durable subs must be bound on ALL nodes of the cluster (if clustered)

               postOffice.addBinding(new Binding(new JMSCondition(false, jmsDestination.getName()), queue, true),
                                     postOffice.isClustered() && mDest.isClustered());

               queue.activate();

               //We don't create message counters on temp topics
               if (!mDest.isTemporary())
               {
                 String counterName = TopicService.SUBSCRIPTION_MESSAGECOUNTER_PREFIX + queue.getName();

                 MessageCounter counter =
                    new MessageCounter(counterName, subscriptionName, queue, true, true,
                                       mDest.getMessageCounterHistoryDayLimit());

                 sp.getMessageCounterManager().registerMessageCounter(counterName, counter);
               }
            }
            else
            {
               //Durable sub already exists

              queue = binding.queue;

               if (trace) { log.trace(this + " subscription " + subscriptionName + " already exists"); }

              //Check if it is already has a subscriber
              //We can't have more than one subscriber at a time on the durable sub unless it is clustered
               //we need this for clustered since otherwise we wouldn't be able to fail over subcribers for the same durable
               //sub onto a node which already has one

               if (queue.getLocalDistributor().getNumberOfReceivers() > 0 && !mDest.isClustered())
               {
                 throw new IllegalStateException("Cannot create a subscriber on the durable subscription since it already has subscriber(s)");
               }

               // If the durable sub exists because it is clustered and was created on this node due to a bind on another node
               // then it will have no message counter

               String counterName = TopicService.SUBSCRIPTION_MESSAGECOUNTER_PREFIX + queue.getName();

               boolean createCounter = false;

               if (sp.getMessageCounterManager().getMessageCounter(counterName) == null)
               {
                 createCounter = true;
               }

               // From javax.jms.Session Javadoc (and also JMS 1.1 6.11.1):
               // A client can change an existing durable subscription by creating a durable
               // TopicSubscriber with the same name and a new topic and/or message selector.
               // Changing a durable subscriber is equivalent to unsubscribing (deleting) the old
               // one and creating a new one.

               String filterString = queue.getFilter() != null ? queue.getFilter().getFilterString() : null;

               boolean selectorChanged =
                  (selectorString == null && filterString != null) ||
                  (filterString == null && selectorString != null) ||
                  (filterString != null && selectorString != null &&
                           !filterString.equals(selectorString));

               if (trace) { log.trace("selector " + (selectorChanged ? "has" : "has NOT") + " changed"); }

               String oldTopicName = ((JMSCondition)binding.condition).getName();

               boolean topicChanged = !oldTopicName.equals(jmsDestination.getName());

               if (log.isTraceEnabled()) { log.trace("topic " + (topicChanged ? "has" : "has NOT") + " changed"); }

               if (selectorChanged || topicChanged)
               {
                  if (trace) { log.trace("topic or selector changed so deleting old subscription"); }

                  // Unbind the durable subscription

                  // Durable subs must be unbound on ALL nodes of the cluster

                  postOffice.removeBinding(queue.getName(), postOffice.isClustered() && mDest.isClustered());

                  // create a fresh new subscription

                  queue = new MessagingQueue(nodeId, name, idm.getID(), ms, pm, true,
                                        mDest.getMaxSize(), selector,
                                        mDest.getFullSize(),
                                        mDest.getPageSize(),
                                        mDest.getDownCacheSize(),
                                        mDest.isClustered(),
                                        sp.getRecoverDeliveriesTimeout());

                  // Durable subs must be bound on ALL nodes of the cluster

                  postOffice.addBinding(new Binding(new JMSCondition(false, jmsDestination.getName()), queue, true),
                                      postOffice.isClustered() && mDest.isClustered());

                  queue.activate();

                  if (!mDest.isTemporary())
                  {
                    createCounter = true;
                  }
               }

               if (createCounter)
               {
                 MessageCounter counter =
                     new MessageCounter(counterName, subscriptionName, queue, true, true,
                                        mDest.getMessageCounterHistoryDayLimit());

                  sp.getMessageCounterManager().registerMessageCounter(counterName, counter);
               }
            }
         }
      }
      else
      {
         // Consumer on a jms queue

         // Let's find the queue

        queue = postOffice.getBindingForQueueName(jmsDestination.getName()).queue;

         if (queue == null)
         {
            throw new IllegalStateException("Cannot find queue: " + jmsDestination.getName());
         }
      }

      int prefetchSize = connectionEndpoint.getPrefetchSize();

      Queue dlqToUse = mDest.getDLQ() == null ? defaultDLQ : mDest.getDLQ();

      Queue expiryQueueToUse = mDest.getExpiryQueue() == null ? defaultExpiryQueue : mDest.getExpiryQueue();

      int maxDeliveryAttemptsToUse = mDest.getMaxDeliveryAttempts() == -1 ? defaultMaxDeliveryAttempts : mDest.getMaxDeliveryAttempts();

      long redeliveryDelayToUse = mDest.getRedeliveryDelay() == -1 ? defaultRedeliveryDelay : mDest.getRedeliveryDelay();
View Full Code Here

         if (binding == null)
         {
            throw new IllegalStateException("Cannot find binding for channel id " + channelID);
         }

         Queue queue = binding.queue;

         if (trace) log.trace("Destination for message[ID=" + ref.getMessage().getMessageID() + "] is: " + queue);

         // The actual jmx queue may not have been deployed yet, so we need to activate the core queue if so,
         // or the handle will have no effect

         boolean deactivate = false;

         if (!queue.isActive())
         {
           queue.activate();

           deactivate = true;
         }

         queue.handle(null, ref, tx);

         if (deactivate)
         {
           queue.deactivate();
         }
      }
   }
View Full Code Here

         if (binding == null)
         {
            throw new IllegalStateException("Cannot find binding for channel id " + channelID);
         }

         Queue queue = binding.queue;

         if (trace) log.trace("Destination for message[ID=" + ref.getMessage().getMessageID() + "] is: " + queue);

         //Create a new delivery - note that it must have a delivery observer otherwise acknowledge will fail
         Delivery del = new SimpleDelivery(queue, ref, true, true);

         if (trace) log.trace("Acknowledging..");

         try
         {
           // The actual jmx queue may not have been deployed yet, so we need to the core queue if so,
            // or the acknowledge will have no effect

            boolean deactivate = false;

            if (!queue.isActive())
            {
              queue.activate();

              deactivate = true;
            }

            del.acknowledge(tx);

            if (deactivate)
            {
              queue.deactivate();
            }
         }
         catch (Throwable t)
         {
            log.error("Failed to acknowledge " + del + " during recovery", t);
View Full Code Here

TOP

Related Classes of org.jboss.messaging.core.contract.Queue

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.