Author: ieb
Date: Fri Feb 22 04:00:37 2013
New Revision: 1448886
URL: http://svn.apache.org/r1448886
Log:
SLING-2597 Operation JMX beans for Queues with notification when new queues are
added. Each queue is given its own MBean.
Added:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
(contents, props changed)
- copied, changed from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
(contents, props changed)
- copied, changed from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java
- copied, changed from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
(contents, props changed)
- copied, changed from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
(with props)
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
(with props)
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
(contents, props changed)
- copied, changed from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
(with props)
Removed:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBeanImpl.java
Modified:
sling/trunk/bundles/extensions/event/pom.xml
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
sling/trunk/launchpad/builder/src/main/bundles/list.xml
Modified: sling/trunk/bundles/extensions/event/pom.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/pom.xml?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/pom.xml (original)
+++ sling/trunk/bundles/extensions/event/pom.xml Fri Feb 22 04:00:37 2013
@@ -44,6 +44,7 @@
<properties>
<site.jira.version.id>12315369</site.jira.version.id>
+ <sling.java.version>6</sling.java.version>
</properties>
<build>
@@ -67,7 +68,8 @@
</Import-Package>
<Export-Package>
org.apache.sling.event;version=2.4.0,
- org.apache.sling.event.jobs;version=1.1.0
+ org.apache.sling.event.jobs;version=1.1.0,
+ org.apache.sling.event.jobs.jmx;version=1.0.0
</Export-Package>
<Private-Package>
org.apache.sling.event.impl.*
@@ -204,6 +206,12 @@
<artifactId>slf4j-simple</artifactId>
</dependency>
<dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>1.9.5</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.apache.jackrabbit</groupId>
<artifactId>jackrabbit-core</artifactId>
<version>2.2.4</version>
Copied:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
(from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java)
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java
(original)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
Fri Feb 22 04:00:37 2013
@@ -15,13 +15,14 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
import java.util.Date;
import javax.management.StandardMBean;
import org.apache.sling.event.jobs.Statistics;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
public abstract class AbstractJobStatistics extends StandardMBean implements
StatisticsMBean {
@@ -30,66 +31,66 @@ public abstract class AbstractJobStatist
super(StatisticsMBean.class, false);
}
- protected abstract Statistics getAggregateStatistics();
+ protected abstract Statistics getStatistics();
public long getAverageProcessingTime() {
- return getAggregateStatistics().getAverageProcessingTime();
+ return getStatistics().getAverageProcessingTime();
}
public long getAverageWaitingTime() {
- return getAggregateStatistics().getAverageWaitingTime();
+ return getStatistics().getAverageWaitingTime();
}
public long getLastActivatedJobTime() {
- return getAggregateStatistics().getLastActivatedJobTime();
+ return getStatistics().getLastActivatedJobTime();
}
public long getLastFinishedJobTime() {
- return getAggregateStatistics().getLastFinishedJobTime();
+ return getStatistics().getLastFinishedJobTime();
}
public long getNumberOfActiveJobs() {
- return getAggregateStatistics().getNumberOfActiveJobs();
+ return getStatistics().getNumberOfActiveJobs();
}
public long getNumberOfCancelledJobs() {
- return getAggregateStatistics().getNumberOfCancelledJobs();
+ return getStatistics().getNumberOfCancelledJobs();
}
public long getStartTime() {
- return getAggregateStatistics().getStartTime();
+ return getStatistics().getStartTime();
}
public long getNumberOfFinishedJobs() {
- return getAggregateStatistics().getNumberOfFinishedJobs();
+ return getStatistics().getNumberOfFinishedJobs();
}
public long getNumberOfFailedJobs() {
- return getAggregateStatistics().getNumberOfFailedJobs();
+ return getStatistics().getNumberOfFailedJobs();
}
public long getNumberOfProcessedJobs() {
- return getAggregateStatistics().getNumberOfProcessedJobs();
+ return getStatistics().getNumberOfProcessedJobs();
}
public long getNumberOfQueuedJobs() {
- return getAggregateStatistics().getNumberOfQueuedJobs();
+ return getStatistics().getNumberOfQueuedJobs();
}
public long getNumberOfJobs() {
- return getAggregateStatistics().getNumberOfJobs();
+ return getStatistics().getNumberOfJobs();
}
public void reset() {
- getAggregateStatistics().reset();
+ getStatistics().reset();
}
public Date getLastActivatedJobDate() {
- return new Date(getAggregateStatistics().getLastActivatedJobTime());
+ return new Date(getStatistics().getLastActivatedJobTime());
}
public Date getLastFinishedJobDate() {
- return new Date(getAggregateStatistics().getLastFinishedJobTime());
+ return new Date(getStatistics().getLastFinishedJobTime());
}
}
Propchange:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
(from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java)
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java
(original)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
Fri Feb 22 04:00:37 2013
@@ -15,7 +15,7 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Properties;
@@ -24,11 +24,11 @@ import org.apache.felix.scr.annotations.
import org.apache.felix.scr.annotations.Service;
import org.apache.sling.event.jobs.JobManager;
import org.apache.sling.event.jobs.Statistics;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
-@Component(immediate = true, enabled = false)
-// disabled while dev in progress.
+@Component(immediate = true)
@Service(value = StatisticsMBean.class)
-@Properties(@Property(name = "jmx.objectname", value =
"org.apache.sling.event.AllJobs;type=Statistics"))
+@Properties(@Property(name = "jmx.objectname", value =
"org.apache.sling.event.AllJobs:type=Statistics"))
public class AllJobStatisticsMBean extends AbstractJobStatistics {
private static final long TTL = 1000L;
private long agregateStatisticsTTL = 0L;
@@ -39,7 +39,7 @@ public class AllJobStatisticsMBean exten
/**
* @return the aggregate stats from the job manager.
*/
- protected Statistics getAggregateStatistics() {
+ protected Statistics getStatistics() {
if (System.currentTimeMillis() > agregateStatisticsTTL) {
aggregateStatistics = jobManager.getStatistics();
agregateStatisticsTTL = System.currentTimeMillis() + TTL;
@@ -47,4 +47,8 @@ public class AllJobStatisticsMBean exten
return aggregateStatistics;
}
+ public String getName() {
+ return "All Queues";
+ }
+
}
Propchange:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java
(from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java)
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
(original)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java
Fri Feb 22 04:00:37 2013
@@ -15,10 +15,14 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
import org.apache.sling.event.jobs.Statistics;
+/**
+ * Dummy stats that just returns 0 for all info, used where the queue doesnt
+ * implement the Statistics interface.
+ */
public class EmptyStatistics implements Statistics {
public long getStartTime() {
Copied:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
(from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java)
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java
(original)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
Fri Feb 22 04:00:37 2013
@@ -15,11 +15,14 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
import org.apache.sling.event.jobs.Queue;
import org.apache.sling.event.jobs.Statistics;
+/**
+ * An MBean that provides statistics from
+ */
public class QueueMBeanImpl extends AbstractJobStatistics {
private Queue queue;
@@ -40,11 +43,15 @@ public class QueueMBeanImpl extends Abst
}
@Override
- protected Statistics getAggregateStatistics() {
+ protected Statistics getStatistics() {
if (queue instanceof Statistics) {
return (Statistics) queue;
}
return emptyStatistics;
}
+ public String getName() {
+ return queue.getName();
+ }
+
}
Propchange:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java?rev=1448886&view=auto
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
(added)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
Fri Feb 22 04:00:37 2013
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.event.impl.jobs.jmx;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.management.AttributeChangeNotification;
+import javax.management.MBeanNotificationInfo;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.StandardEmitterMBean;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.event.impl.jobs.QueueStatusEvent;
+import org.apache.sling.event.jobs.Queue;
+import org.apache.sling.event.jobs.jmx.QueuesMBean;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+@Component(immediate = true)
+@Service(value = { QueuesMBean.class, EventHandler.class })
+@Properties({
+ @Property(name = "jmx.objectname", propertyPrivate = true, value =
"org.apache.sling.event.Queues:type=Statistics"),
+ @Property(name = "event.topics", propertyPrivate = true, value = {
QueueStatusEvent.TOPIC }) })
+public class QueuesMBeanImpl extends StandardEmitterMBean implements
+ QueuesMBean, EventHandler {
+
+ private static final String QUEUE_NOTIFICATION =
"org.apache.sling.event.queue";
+ private static final String[] NOTIFICATION_TYPES = { QUEUE_NOTIFICATION };
+ private Map<String, QueueMBeanHolder> queues = new
ConcurrentHashMap<String, QueueMBeanHolder>();
+ private String[] names;
+ private AtomicLong sequence = new AtomicLong(System.currentTimeMillis());
+ private BundleContext bundleContext;
+
+ class QueueMBeanHolder {
+
+ QueueMBeanHolder(String name, QueueMBeanImpl queueMBean,
+ ServiceRegistration registration) {
+ this.name = name;
+ this.queueMBean = queueMBean;
+ this.registration = registration;
+ }
+
+ QueueMBeanImpl queueMBean;
+ ServiceRegistration registration;
+ String name;
+
+ }
+
+ public QueuesMBeanImpl() {
+ super(QueuesMBean.class, false, new NotificationBroadcasterSupport(
+ new MBeanNotificationInfo(NOTIFICATION_TYPES,
+ Notification.class.getName(),
+ "Notifications about queues")));
+ }
+
+ @Activate
+ public void activate(ComponentContext componentContext) {
+ bundleContext = componentContext.getBundleContext();
+ }
+
+ @Deactivate
+ public void deactivate(ComponentContext componentContext) {
+
+ }
+
+ public void handleEvent(Event event) {
+ if (event instanceof QueueStatusEvent) {
+ QueueStatusEvent e = (QueueStatusEvent) event;
+ if (e.isNew()) {
+ bindQueueMBean(e);
+ } else if (e.isRemoved()) {
+ unbindQueueMBean(e);
+ } else {
+ updateQueueMBean(e);
+ }
+ }
+ }
+
+ private void updateQueueMBean(QueueStatusEvent e) {
+ QueueMBeanHolder queueMBeanHolder = queues.get(e.getQueue().getName());
+ if (queueMBeanHolder != null) {
+ String[] oldQueue = getQueueNames();
+ queueMBeanHolder.queueMBean.notifyUpdate(e.getQueue());
+ names = null;
+ this.sendNotification(new AttributeChangeNotification(this,
+ sequence.incrementAndGet(), System.currentTimeMillis(),
+ "Queue " + e.getQueue().getName() + " updated ",
+ "queueNames", "String[]", oldQueue, getQueueNames()));
+
+ }
+ }
+
+ private void unbindQueueMBean(QueueStatusEvent e) {
+ QueueMBeanHolder queueMBeanHolder =
queues.get(e.getOldQueue().getName());
+ if (queueMBeanHolder != null) {
+ removeAndNotify(queueMBeanHolder);
+ }
+ }
+
+ private void bindQueueMBean(QueueStatusEvent e) {
+ QueueMBeanHolder queueMBeanHolder = queues.get(e.getQueue().getName());
+ if (queueMBeanHolder != null) {
+ removeAndNotify(queueMBeanHolder);
+ }
+ addAndNotify(e.getQueue());
+ }
+
+ private void addAndNotify(Queue queue) {
+ String[] oldQueue = getQueueNames();
+ QueueMBeanHolder queueMBeanHolder = add(queue);
+ names = null;
+ this.sendNotification(new AttributeChangeNotification(this, sequence
+ .incrementAndGet(), System.currentTimeMillis(), "Queue "
+ + queueMBeanHolder.name + " added ", "queueNames", "String[]",
+ oldQueue, getQueueNames()));
+ }
+
+ private void removeAndNotify(QueueMBeanHolder queueMBeanHolder) {
+ String[] oldQueue = getQueueNames();
+ remove(queueMBeanHolder);
+ names = null;
+ this.sendNotification(new AttributeChangeNotification(this, sequence
+ .incrementAndGet(), System.currentTimeMillis(), "Queue "
+ + queueMBeanHolder.name + " removed ", "queueNames",
+ "String[]", oldQueue, getQueueNames()));
+ }
+
+ private QueueMBeanHolder add(Queue queue) {
+ QueueMBeanImpl queueMBean = new QueueMBeanImpl(queue);
+ ServiceRegistration serviceRegistration = bundleContext
+ .registerService(StatisticsMBean.class.getName(), queueMBean,
+ createProperties(
+
"jmx.objectname","org.apache.sling.event.queue."+queue.getName()+":type=Statistics",
+ Constants.SERVICE_DESCRIPTION, "QueueMBean for
queue "+queue.getName(),
+ Constants.SERVICE_VENDOR,"Apache"));
+ QueueMBeanHolder queueMBeanHolder = new QueueMBeanHolder(
+ queue.getName(), queueMBean, serviceRegistration);
+ queues.put(queueMBeanHolder.name, queueMBeanHolder);
+ return queueMBeanHolder;
+ }
+
+ private Dictionary<String, Object> createProperties(Object ... values) {
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ for ( int i = 0; i < values.length; i+=2) {
+ props.put((String) values[i], values[i+1]);
+ }
+ return props;
+ }
+
+ private void remove(QueueMBeanHolder queueMBeanHolder) {
+ queueMBeanHolder.queueMBean.notifyRemove();
+ queueMBeanHolder.registration.unregister();
+ queues.remove(queueMBeanHolder.name);
+ }
+
+ public String[] getQueueNames() {
+ if (names == null) {
+ List<String> lnames = new ArrayList<String>(queues.keySet());
+ Collections.sort(lnames);
+ names = lnames.toArray(new String[lnames.size()]);
+ }
+ return names;
+ }
+
+}
Propchange:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
(original)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
Fri Feb 22 04:00:37 2013
@@ -23,4 +23,6 @@ package org.apache.sling.event.jobs.jmx;
*/
public interface QueuesMBean {
+ String[] getQueueNames();
+
}
Modified:
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
(original)
+++
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
Fri Feb 22 04:00:37 2013
@@ -27,4 +27,6 @@ public interface StatisticsMBean extends
Date getLastFinishedJobDate();
+ String getName();
+
}
Added:
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java?rev=1448886&view=auto
==============================================================================
---
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
(added)
+++
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
Fri Feb 22 04:00:37 2013
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http:www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.event.impl.jobs.jmx;
+
+import java.util.Date;
+
+import junit.framework.Assert;
+import junitx.util.PrivateAccessor;
+
+import org.apache.sling.event.jobs.JobManager;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+public class AllJobStatisticsMBeanTest {
+
+ private AllJobStatisticsMBean mbean;
+ @Mock
+ private JobManager jobManager;
+ private long seed;
+
+ public AllJobStatisticsMBeanTest() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Before
+ public void setup() throws NoSuchFieldException {
+ mbean = new AllJobStatisticsMBean();
+ PrivateAccessor.setField(mbean, "jobManager", jobManager);
+ seed = System.currentTimeMillis();
+ Mockito.when(jobManager.getStatistics()).thenReturn(
+ new DummyStatistics(seed));
+ }
+
+ @Test
+ public void testStatistics() {
+ Assert.assertEquals(seed + 1, mbean.getStartTime());
+ Assert.assertEquals(seed + 2, mbean.getNumberOfFinishedJobs());
+ Assert.assertEquals(seed + 3, mbean.getNumberOfCancelledJobs());
+ Assert.assertEquals(seed + 4, mbean.getNumberOfFailedJobs());
+ Assert.assertEquals(seed + 5, mbean.getNumberOfProcessedJobs());
+ Assert.assertEquals(seed + 6, mbean.getNumberOfActiveJobs());
+ Assert.assertEquals(seed + 7, mbean.getNumberOfQueuedJobs());
+ Assert.assertEquals(seed + 8, mbean.getNumberOfJobs());
+ Assert.assertEquals(seed + 9, mbean.getLastActivatedJobTime());
+ Assert.assertEquals(new Date(seed + 9),
mbean.getLastActivatedJobDate());
+ Assert.assertEquals(seed + 10, mbean.getLastFinishedJobTime());
+ Assert.assertEquals(new Date(seed + 10),
mbean.getLastFinishedJobDate());
+ Assert.assertEquals(seed + 11, mbean.getAverageWaitingTime());
+ Assert.assertEquals(seed + 12, mbean.getAverageProcessingTime());
+ }
+
+}
Propchange:
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Copied:
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
(from r1448641,
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java)
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java?p2=sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
---
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
(original)
+++
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
Fri Feb 22 04:00:37 2013
@@ -15,58 +15,67 @@
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
import org.apache.sling.event.jobs.Statistics;
-public class EmptyStatistics implements Statistics {
+/**
+ * Dummy statistics for testing purposes.
+ */
+public class DummyStatistics implements Statistics {
+
+ private long base;
+ public DummyStatistics(long base) {
+ this.base = base;
+
+ }
public long getStartTime() {
- return 0;
+ return base+1;
}
public long getNumberOfFinishedJobs() {
- return 0;
+ return base+2;
}
public long getNumberOfCancelledJobs() {
- return 0;
+ return base+3;
}
public long getNumberOfFailedJobs() {
- return 0;
+ return base+4;
}
public long getNumberOfProcessedJobs() {
- return 0;
+ return base+5;
}
public long getNumberOfActiveJobs() {
- return 0;
+ return base+6;
}
public long getNumberOfQueuedJobs() {
- return 0;
+ return base+7;
}
public long getNumberOfJobs() {
- return 0;
+ return base+8;
}
public long getLastActivatedJobTime() {
- return 0;
+ return base+9;
}
public long getLastFinishedJobTime() {
- return 0;
+ return base+10;
}
public long getAverageWaitingTime() {
- return 0;
+ return base+11;
}
public long getAverageProcessingTime() {
- return 0;
+ return base+12;
}
public void reset() {
Propchange:
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
------------------------------------------------------------------------------
svn:eol-style = native
Added:
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
URL:
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java?rev=1448886&view=auto
==============================================================================
---
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
(added)
+++
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
Fri Feb 22 04:00:37 2013
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.event.impl.jobs.jmx;
+
+import java.util.Date;
+import java.util.Dictionary;
+
+import junit.framework.Assert;
+
+import org.apache.sling.event.impl.jobs.QueueStatusEvent;
+import org.apache.sling.event.jobs.Queue;
+import org.apache.sling.event.jobs.Statistics;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+
+public class QueuesMBeanImplTest {
+
+ private QueuesMBeanImpl mbean;
+ @Mock
+ private BundleContext bundleContext;
+ @Mock
+ private ComponentContext componentContext;
+ @Captor
+ private ArgumentCaptor<String> serviceClass;
+ @Captor
+ private ArgumentCaptor<Object> serviceObject;
+ @SuppressWarnings("rawtypes")
+ @Captor
+ private ArgumentCaptor<Dictionary> serviceProperties;
+ @Mock
+ private ServiceRegistration serviceRegistration;
+
+ public QueuesMBeanImplTest() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Before
+ public void setup() throws NoSuchFieldException {
+ mbean = new QueuesMBeanImpl();
+
Mockito.when(componentContext.getBundleContext()).thenReturn(bundleContext);
+ mbean.activate(componentContext);
+ }
+
+
+ @Test
+ public void testAddQueue() {
+ addQueue();
+ }
+
+ public Queue addQueue() {
+ Queue queue = Mockito.mock(Queue.class,
Mockito.withSettings().extraInterfaces(Statistics.class));
+ mockStatistics((Statistics) queue);
+ Mockito.when(queue.getName()).thenReturn("queue-name");
+ Mockito.when(bundleContext.registerService(Mockito.anyString(),
Mockito.any(StatisticsMBean.class),
Mockito.any(Dictionary.class))).thenReturn(serviceRegistration);
+ mbean.handleEvent(new QueueStatusEvent(queue,null));
+ Mockito.verify(bundleContext,
Mockito.only()).registerService(serviceClass.capture(),
serviceObject.capture(), serviceProperties.capture());
+ Assert.assertEquals("Expected bean to be registerd as a
StatisticsMBean ", StatisticsMBean.class.getName(), serviceClass.getValue());
+ Assert.assertTrue("Expected service to be an instance of
SatisticsMBean", serviceObject.getValue() instanceof StatisticsMBean);
+ Assert.assertNotNull("Expected properties to have a jmx.objectname",
serviceProperties.getValue().get("jmx.objectname"));
+ testStatistics((StatisticsMBean) serviceObject.getValue());
+ return queue;
+ }
+
+
+ @Test
+ public void updateQueue() {
+ Queue firstQueue = addQueue();
+ Queue queue = Mockito.mock(Queue.class,
Mockito.withSettings().extraInterfaces(Statistics.class));
+ Mockito.when(queue.getName()).thenReturn("queue-name-changed");
+ Mockito.reset(bundleContext);
+ mbean.handleEvent(new QueueStatusEvent(queue,firstQueue));
+ Mockito.verify(bundleContext,
Mockito.never()).registerService(serviceClass.capture(),
serviceObject.capture(), serviceProperties.capture());
+ }
+
+ @Test
+ public void removeQueue() {
+ Queue firstQueue = addQueue();
+ mbean.handleEvent(new QueueStatusEvent(null,firstQueue));
+ Mockito.verify(serviceRegistration, Mockito.only()).unregister();
+
+ }
+
+ private void mockStatistics(Statistics queue) {
+ Mockito.when(queue.getStartTime()).thenReturn(1L);
+ Mockito.when(queue.getNumberOfFinishedJobs()).thenReturn(2L);
+ Mockito.when(queue.getNumberOfCancelledJobs()).thenReturn(3L);
+ Mockito.when(queue.getNumberOfFailedJobs()).thenReturn(4L);
+ Mockito.when(queue.getNumberOfProcessedJobs()).thenReturn(5L);
+ Mockito.when(queue.getNumberOfActiveJobs()).thenReturn(6L);
+ Mockito.when(queue.getNumberOfQueuedJobs()).thenReturn(7L);
+ Mockito.when(queue.getNumberOfJobs()).thenReturn(8L);
+ Mockito.when(queue.getLastActivatedJobTime()).thenReturn(9L);
+ Mockito.when(queue.getLastFinishedJobTime()).thenReturn(10L);
+ Mockito.when(queue.getAverageWaitingTime()).thenReturn(11L);
+ Mockito.when(queue.getAverageProcessingTime()).thenReturn(12L);
+ }
+
+ public void testStatistics(StatisticsMBean statisticsMbean) {
+ Assert.assertEquals(1, statisticsMbean.getStartTime());
+ Assert.assertEquals(2, statisticsMbean.getNumberOfFinishedJobs());
+ Assert.assertEquals(3, statisticsMbean.getNumberOfCancelledJobs());
+ Assert.assertEquals(4, statisticsMbean.getNumberOfFailedJobs());
+ Assert.assertEquals(5, statisticsMbean.getNumberOfProcessedJobs());
+ Assert.assertEquals(6, statisticsMbean.getNumberOfActiveJobs());
+ Assert.assertEquals(7, statisticsMbean.getNumberOfQueuedJobs());
+ Assert.assertEquals(8, statisticsMbean.getNumberOfJobs());
+ Assert.assertEquals(9, statisticsMbean.getLastActivatedJobTime());
+ Assert.assertEquals(new Date(9),
statisticsMbean.getLastActivatedJobDate());
+ Assert.assertEquals(10, statisticsMbean.getLastFinishedJobTime());
+ Assert.assertEquals(new Date(10),
statisticsMbean.getLastFinishedJobDate());
+ Assert.assertEquals(11, statisticsMbean.getAverageWaitingTime());
+ Assert.assertEquals(12, statisticsMbean.getAverageProcessingTime());
+ }
+
+
+}
Propchange:
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: sling/trunk/launchpad/builder/src/main/bundles/list.xml
URL:
http://svn.apache.org/viewvc/sling/trunk/launchpad/builder/src/main/bundles/list.xml?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
--- sling/trunk/launchpad/builder/src/main/bundles/list.xml (original)
+++ sling/trunk/launchpad/builder/src/main/bundles/list.xml Fri Feb 22 04:00:37
2013
@@ -65,7 +65,7 @@
<bundle>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.event</artifactId>
- <version>3.1.4</version>
+ <version>3.1.5-SNAPSHOT</version>
</bundle>
<bundle>