You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2010/11/13 09:37:19 UTC

svn commit: r1034702 - in /james/server/trunk: container-spring/src/main/config/james/spring-beans.xml queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueue.java

Author: norman
Date: Sat Nov 13 08:37:19 2010
New Revision: 1034702

URL: http://svn.apache.org/viewvc?rev=1034702&view=rev
Log:
Use ActivMQ StatisticsPlugin to get size of the queue (JAMES-1131)

Modified:
    james/server/trunk/container-spring/src/main/config/james/spring-beans.xml
    james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueue.java

Modified: james/server/trunk/container-spring/src/main/config/james/spring-beans.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/container-spring/src/main/config/james/spring-beans.xml?rev=1034702&r1=1034701&r2=1034702&view=diff
==============================================================================
--- james/server/trunk/container-spring/src/main/config/james/spring-beans.xml (original)
+++ james/server/trunk/container-spring/src/main/config/james/spring-beans.xml Sat Nov 13 08:37:19 2010
@@ -168,6 +168,9 @@
         <amq:persistenceAdapter>
             <amq:amqPersistenceAdapter/>
         </amq:persistenceAdapter>
+        <amq:plugins>
+            <amq:statisticsBrokerPlugin/>
+        </amq:plugins>
         <amq:transportConnectors>
             <amq:transportConnector uri="tcp://localhost:0" />
         </amq:transportConnectors>

Modified: james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueue.java
URL: http://svn.apache.org/viewvc/james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueue.java?rev=1034702&r1=1034701&r2=1034702&view=diff
==============================================================================
--- james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueue.java (original)
+++ james/server/trunk/queue-activemq/src/main/java/org/apache/james/queue/activemq/ActiveMQMailQueue.java Sat Nov 13 08:37:19 2010
@@ -29,6 +29,7 @@ import java.util.Map;
 import javax.jms.Connection;
 import javax.jms.ConnectionFactory;
 import javax.jms.JMSException;
+import javax.jms.MapMessage;
 import javax.jms.Message;
 import javax.jms.MessageConsumer;
 import javax.jms.MessageProducer;
@@ -288,4 +289,95 @@ public class ActiveMQMailQueue extends J
             return super.copy(session, m);
         }
     }
+
+    /**
+     * Try to use ActiveMQ StatisticsPlugin to get size and if that fails fallback to {@link JMSMailQueue#getSize()}
+     * 
+     */
+    @Override
+    public long getSize() throws MailQueueException {
+        
+        Connection connection = null;
+        Session session = null;
+        MessageConsumer consumer = null;
+        MessageProducer producer = null;
+        int size = -1;
+        
+        try {
+            connection = connectionFactory.createConnection();
+            connection.start();
+
+            session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
+            Queue replyTo = session.createTemporaryQueue();
+            consumer = session.createConsumer(replyTo);
+
+            Queue myQueue = session.createQueue(queuename);;
+            producer = session.createProducer(null);
+
+            String queueName = "ActiveMQ.Statistics.Destination." + myQueue.getQueueName();
+            Queue query = session.createQueue(queueName);
+
+            Message msg = session.createMessage();
+
+            producer.send(myQueue, msg);
+            msg.setJMSReplyTo(replyTo);
+            producer.send(query, msg);
+            MapMessage reply = (MapMessage) consumer.receive();
+            if (reply.itemExists("size")) {
+                try {
+                    // Maybe a bug in activemq as reply.getInt(..) did not work
+                    // need to check activemq source code to understand why ..
+                    size = Integer.parseInt(reply.getObject("size").toString());
+                    return size;
+                } catch (NumberFormatException e) {
+                    // if we hit this we can't calculate the size so just catch it
+                }
+            }
+              
+        } catch (Exception e) {
+            try {
+                session.rollback();
+            } catch (JMSException e1) {
+                // ignore on rollback
+            }
+            throw new MailQueueException("Unable to remove mails" , e);
+
+        } finally {
+            if (consumer != null) {
+
+                try {
+                    consumer.close();
+                } catch (JMSException e1) {
+                    // ignore on rollback
+                }
+            }
+            if (producer != null) {
+
+                try {
+                    producer.close();
+                } catch (JMSException e1) {
+                    // ignore on rollback
+                }
+            }
+            
+            try {
+                if (session != null)
+                    session.close();
+            } catch (JMSException e1) {
+                // ignore here
+            }
+
+            try {
+                if (connection != null)
+                    connection.close();
+            } catch (JMSException e1) {
+                // ignore here
+            }
+        }    
+        
+        // if we came to this point we should just fallback to super method
+        return super.getSize();
+    }
+    
+    
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org