Package org.codehaus.activemq.service

Examples of org.codehaus.activemq.service.QueueListEntry


    public synchronized ActiveMQMessage[] getMessagesToDispatch() throws JMSException {
        if (usePrefetch) {
            return getMessagesWithPrefetch();
        }
        List tmpList = new ArrayList();
        QueueListEntry entry = messagePtrs.getFirstEntry();
        while (entry != null) {
            MessagePointer pointer = (MessagePointer) entry.getElement();
            if (!pointer.isDispatched()) {
                ActiveMQMessage msg = pointer.getContainer().getMessage(pointer.getMessageIdentity());
                if (msg != null) {
                    if (pointer.isDispatched() || pointer.isRedelivered()) {
                        //already dispatched - so mark as redelivered
                        msg.setJMSRedelivered(true);
                        if (redeliveryPolicy.isBackOffMode()
                                && msg.getDeliveryCount() < redeliveryPolicy.getMaximumRetryCount()) {
                            long sleepTime = redeliveryPolicy.getInitialRedeliveryTimeout();
                            sleepTime *= (msg.getDeliveryCount() * redeliveryPolicy.getBackOffIncreaseRate());
                            try {
                                Thread.sleep(sleepTime);
                            }
                            catch (InterruptedException e) {
                            }
                        }
                        //incremenent delivery count
                        msg.incrementDeliveryCount();
                    }
                    if (!pointer.getContainer().isDeadLetterQueue()
                            && (msg.isExpired() || msg.getDeliveryCount() >= redeliveryPolicy.getMaximumRetryCount())) {
                        if (msg.isExpired()) {
                            log.warn("Message: " + msg + " has expired");
                        }
                        else {
                            log.warn("Message: " + msg + " exceeded retry count: " + msg.getDeliveryCount());
                        }
                        deadLetterPolicy.sendToDeadLetter(msg);
                        QueueListEntry discarded = entry;
                        entry = messagePtrs.getPrevEntry(discarded);
                        messagePtrs.remove(discarded);
                    }
                    else {
                        pointer.setDispatched(true);
                        msg.setDispatchedFromDLQ(pointer.getContainer().isDeadLetterQueue());
                        tmpList.add(msg);
                    }
                }
                else {
                    //the message is probably expired
                    log.info("Message probably expired: " + msg);
                    QueueListEntry discarded = entry;
                    entry = messagePtrs.getPrevEntry(discarded);
                    messagePtrs.remove(discarded);
                    if (msg != null) {
                        deadLetterPolicy.sendToDeadLetter(msg);
                    }
View Full Code Here


        return answer;
    }

    protected synchronized ActiveMQMessage[] getMessagesWithPrefetch() throws JMSException {
        List tmpList = new ArrayList();
        QueueListEntry entry = messagePtrs.getFirstEntry();
        int count = 0;
        int maxNumberToDispatch = prefetchLimit - unconsumedMessagesDispatched.get();
        while (entry != null && count < maxNumberToDispatch) {
            MessagePointer pointer = (MessagePointer) entry.getElement();
            if (!pointer.isDispatched()) {
                ActiveMQMessage msg = pointer.getContainer().getMessage(pointer.getMessageIdentity());
                if (msg != null && !msg.isExpired()) {
                    if (pointer.isDispatched() || pointer.isRedelivered()) {
                        //already dispatched - so mark as redelivered
                        msg.setJMSRedelivered(true);
                    }
                    pointer.setDispatched(true);
                    tmpList.add(msg);
                    unconsumedMessagesDispatched.increment();
                    count++;
                }
                else {
                    //the message is probably expired
                    log.info("Message probably expired: " + msg);
                    QueueListEntry discarded = entry;
                    entry = messagePtrs.getPrevEntry(discarded);
                    messagePtrs.remove(discarded);
                    if (msg != null) {
                        deadLetterPolicy.sendToDeadLetter(msg);
                    }
View Full Code Here

        else {
            final Map lastMessagePointersPerContainer = new HashMap();

            //remove up to this message
            boolean found = false;
            QueueListEntry queueEntry = messagePtrs.getFirstEntry();
            while (queueEntry != null) {
                final MessagePointer pointer = (MessagePointer) queueEntry.getElement();

                messagePtrs.remove(queueEntry);
                lastMessagePointersPerContainer.put(pointer.getContainer(), pointer);
                unconsumedMessagesDispatched.decrement();
View Full Code Here

     * Called when the Subscription is discarded
     *
     * @throws JMSException
     */
    public synchronized void clear() throws JMSException {
        QueueListEntry entry = messagePtrs.getFirstEntry();
        while (entry != null) {
            MessagePointer pointer = (MessagePointer) entry.getElement();
            pointer.clear();
            entry = messagePtrs.getNextEntry(entry);
        }
        messagePtrs.clear();
    }
View Full Code Here

    /**
     * Called when an active subscriber has closed. This resets all MessagePtrs
     */
    public synchronized void reset() throws JMSException {
        QueueListEntry entry = messagePtrs.getFirstEntry();
        while (entry != null) {
            MessagePointer pointer = (MessagePointer) entry.getElement();
            if (pointer.isDispatched()) {
                pointer.reset();
                pointer.setRedelivered(true);
            }
            else {
View Full Code Here

     */
    public synchronized void messageConsumed(final MessageAck ack) throws JMSException {
        //remove up to this message
        int count = 0;
        boolean found = false;
        QueueListEntry entry = messagePtrs.getFirstEntry();
        while (entry != null) {
            final MessagePointer pointer = (MessagePointer) entry.getElement();
            count++;
           
            // If in transaction: only consume the message acked.
            // If not in transaction: consume all previously delivered messages.
            if ( !ack.isPartOfTransaction() || pointer.getMessageIdentity().equals(ack.getMessageIdentity()) ) {

                if ((ack.isExpired() || ack.isMessageRead()) && !browser) {
                    pointer.delete(ack);//delete message from the container (if possible)
                }
               
                if (!ack.isMessageRead()){
                   
                    // It was a NACK.
                    pointer.reset();
                    pointer.setRedelivered(true);
                   
                } else {
                   
                    unconsumedMessagesDispatched.decrement();
                    // We may have to undo the delivery..
                    TransactionManager.getContexTransaction().addPostRollbackTask(new TransactionTask(){
                        public void execute() throws Throwable {
                            unconsumedMessagesDispatched.increment();
                            pointer.reset();
                            pointer.setRedelivered(true);
                            dispatch.wakeup(SubscriptionImpl.this);
                        }
                    });
                   
                    final QueueListEntry theEntry = entry;
                    TransactionManager.getContexTransaction().addPostCommitTask(new TransactionTask(){
                        public void execute() throws Throwable {
                            messagePtrs.remove(theEntry);
                            if ((ack.isExpired() || ack.isMessageRead()) && !browser) {
                                if (ack.isExpired() && !pointer.getContainer().isDeadLetterQueue()) {
View Full Code Here

    public void close() throws JMSException {
        if (started.get()) {
            stop();
        }
        queue.close();
        QueueListEntry entry = subscriptions.getFirstEntry();
        while (entry != null) {
            TransientQueueSubscription ts = (TransientQueueSubscription) entry.getElement();
            ts.close();
            entry = subscriptions.getNextEntry(entry);
        }
        subscriptions.clear();
    }
View Full Code Here

                targeted = false;
                if (!subscriptions.isEmpty()) {
                    message = (ActiveMQMessage) queue.dequeue(2000);
                    if (message != null) {
                        if (!message.isExpired()) {
                            QueueListEntry entry = subscriptions.getFirstEntry();
                            while (entry != null) {
                                TransientQueueSubscription ts = (TransientQueueSubscription) entry.getElement();
                                if (ts.isTarget(message)) {
                                    targeted = true;
                                    if (ts.canAcceptMessages()) {
                                        ts.doDispatch(message);
                                        message = null;
View Full Code Here

        }
    }

    private TransientQueueSubscription findMatch(ConsumerInfo info) throws JMSException {
        TransientQueueSubscription result = null;
        QueueListEntry entry = subscriptions.getFirstEntry();
        while (entry != null) {
            TransientQueueSubscription ts = (TransientQueueSubscription) entry.getElement();
            if (ts.getConsumerInfo().equals(info)) {
                result = ts;
                break;
            }
            entry = subscriptions.getNextEntry(entry);
View Full Code Here

     * @param id
     * @return
     */
    public Packet remove(String id) {
        Packet result = null;
        QueueListEntry entry = internalList.getFirstEntry();
        try {
            while (entry != null) {
                Packet p = (Packet) entry.getElement();
                if (p.getId().equals(id)) {
                    result = p;
                    internalList.remove(entry);
                    break;
                }
View Full Code Here

TOP

Related Classes of org.codehaus.activemq.service.QueueListEntry

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.