You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/02/08 17:45:31 UTC

[3/5] camel git commit: CAMEL-9577: Only support suspension if a component has custom logic

CAMEL-9577: Only support suspension if a component has custom logic


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/5973f141
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5973f141
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5973f141

Branch: refs/heads/master
Commit: 5973f1416b2233e5f34e357ec15e4d502cafd5b2
Parents: 8e479df
Author: Claus Ibsen <da...@apache.org>
Authored: Mon Feb 8 15:10:58 2016 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Mon Feb 8 17:45:20 2016 +0100

----------------------------------------------------------------------
 .../main/java/org/apache/camel/Suspendable.java | 31 ++++++++++++++++++++
 .../org/apache/camel/SuspendableService.java    |  5 +++-
 .../camel/component/direct/DirectConsumer.java  |  3 +-
 .../component/directvm/DirectVmConsumer.java    |  3 +-
 .../camel/component/seda/SedaConsumer.java      |  4 +--
 .../apache/camel/impl/DefaultCamelContext.java  | 11 +++++--
 .../camel/impl/DefaultShutdownStrategy.java     |  3 +-
 .../camel/impl/EventDrivenConsumerRoute.java    |  3 +-
 .../camel/impl/ScheduledPollConsumer.java       |  3 +-
 .../camel/management/mbean/ManagedService.java  |  5 ++--
 .../org/apache/camel/util/ServiceHelper.java    |  7 +++--
 11 files changed, 62 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/Suspendable.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/Suspendable.java b/camel-core/src/main/java/org/apache/camel/Suspendable.java
new file mode 100644
index 0000000..c1030cd
--- /dev/null
+++ b/camel-core/src/main/java/org/apache/camel/Suspendable.java
@@ -0,0 +1,31 @@
+/**
+ * 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 ASF 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.camel;
+
+/**
+ * Marker interface to indicate a custom component has custom implementation for suspending the {@link SuspendableService} service.
+ * <br/>
+ * This is needed to let Camel know if there is special code happening during a suspension.
+ * <p/>
+ * The {@link org.apache.camel.support.ServiceSupport} implementation that most Camel components / endpoints etc use
+ * as base class is a {@link SuspendableService} but the actual implementation may not have special logic for suspend.
+ * Therefore this marker interface is introduced to indicate when the implementation has special code for suspension.
+ *
+ * @see SuspendableService
+ */
+public interface Suspendable {
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/SuspendableService.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/SuspendableService.java b/camel-core/src/main/java/org/apache/camel/SuspendableService.java
index 990910c..79e2cbd 100644
--- a/camel-core/src/main/java/org/apache/camel/SuspendableService.java
+++ b/camel-core/src/main/java/org/apache/camel/SuspendableService.java
@@ -24,8 +24,11 @@ package org.apache.camel;
  * <p/>
  * For example this is use by the JmsConsumer which suspends the Spring JMS listener instead of stopping
  * the consumer totally.
+ * <p/>
+ * <b>Important:</b> The service should also implement the {@link Suspendable} marker interface to indicate
+ * the service supports suspension using custom code logic.
  *
- * @version 
+ * @see Suspendable
  */
 public interface SuspendableService extends Service {
 

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/component/direct/DirectConsumer.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/direct/DirectConsumer.java b/camel-core/src/main/java/org/apache/camel/component/direct/DirectConsumer.java
index a5be34f..9b5c8d1 100644
--- a/camel-core/src/main/java/org/apache/camel/component/direct/DirectConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/component/direct/DirectConsumer.java
@@ -19,6 +19,7 @@ package org.apache.camel.component.direct;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Processor;
 import org.apache.camel.ShutdownRunningTask;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.impl.DefaultConsumer;
 import org.apache.camel.spi.ShutdownAware;
@@ -28,7 +29,7 @@ import org.apache.camel.spi.ShutdownAware;
  *
  * @version 
  */
-public class DirectConsumer extends DefaultConsumer implements ShutdownAware, SuspendableService {
+public class DirectConsumer extends DefaultConsumer implements ShutdownAware, Suspendable {
 
     private DirectEndpoint endpoint;
 

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java b/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java
index 037b7e2..4b18fe3 100644
--- a/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/component/directvm/DirectVmConsumer.java
@@ -17,13 +17,14 @@
 package org.apache.camel.component.directvm;
 
 import org.apache.camel.Processor;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.impl.DefaultConsumer;
 
 /**
  * The direct-vm consumer
  */
-public class DirectVmConsumer extends DefaultConsumer implements SuspendableService {
+public class DirectVmConsumer extends DefaultConsumer implements Suspendable {
 
     public DirectVmConsumer(DirectVmEndpoint endpoint, Processor processor) {
         super(endpoint, processor);

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java b/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java
index c0970fb..ca0ddcb 100644
--- a/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/component/seda/SedaConsumer.java
@@ -30,7 +30,7 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.ShutdownRunningTask;
-import org.apache.camel.SuspendableService;
+import org.apache.camel.Suspendable;
 import org.apache.camel.processor.MulticastProcessor;
 import org.apache.camel.spi.ExceptionHandler;
 import org.apache.camel.spi.ShutdownAware;
@@ -52,7 +52,7 @@ import org.slf4j.LoggerFactory;
  *
  * @version 
  */
-public class SedaConsumer extends ServiceSupport implements Consumer, Runnable, ShutdownAware, SuspendableService {
+public class SedaConsumer extends ServiceSupport implements Consumer, Runnable, ShutdownAware, Suspendable {
     private static final Logger LOG = LoggerFactory.getLogger(SedaConsumer.class);
 
     private final AtomicInteger taskCount = new AtomicInteger();

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index bba3ed1..d0c2c37 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -72,6 +72,7 @@ import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
 import org.apache.camel.StartupListener;
 import org.apache.camel.StatefulService;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.VetoCamelContextStartException;
@@ -171,7 +172,7 @@ import org.slf4j.LoggerFactory;
  * @version
  */
 @SuppressWarnings("deprecation")
-public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, SuspendableService {
+public class DefaultCamelContext extends ServiceSupport implements ModelCamelContext, Suspendable {
     private final Logger log = LoggerFactory.getLogger(getClass());
     private JAXBContext jaxbContext;
     private CamelContextNameStrategy nameStrategy = new DefaultCamelContextNameStrategy();
@@ -1169,7 +1170,9 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
             // must suspend route service as well
             suspendRouteService(routeService);
             // must suspend the route as well
-            ServiceHelper.suspendService(route);
+            if (route instanceof SuspendableService) {
+                ((SuspendableService) route).suspend();
+            }
         }
     }
 
@@ -1190,7 +1193,9 @@ public class DefaultCamelContext extends ServiceSupport implements ModelCamelCon
             // must suspend route service as well
             suspendRouteService(routeService);
             // must suspend the route as well
-            ServiceHelper.suspendService(route);
+            if (route instanceof SuspendableService) {
+                ((SuspendableService) route).suspend();
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
index 2eac21e..074837b 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultShutdownStrategy.java
@@ -40,6 +40,7 @@ import org.apache.camel.Route;
 import org.apache.camel.Service;
 import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.spi.InflightRepository;
 import org.apache.camel.spi.RouteStartupOrder;
@@ -557,7 +558,7 @@ public class DefaultShutdownStrategy extends ServiceSupport implements ShutdownS
                         if (consumer instanceof ShutdownAware) {
                             shutdown = !((ShutdownAware) consumer).deferShutdown(shutdownRunningTask);
                         }
-                        if (shutdown && consumer instanceof SuspendableService) {
+                        if (shutdown && consumer instanceof Suspendable) {
                             // we prefer to suspend over shutdown
                             suspend = true;
                         }

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/impl/EventDrivenConsumerRoute.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/EventDrivenConsumerRoute.java b/camel-core/src/main/java/org/apache/camel/impl/EventDrivenConsumerRoute.java
index 8a6da5d..0e77b17 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/EventDrivenConsumerRoute.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/EventDrivenConsumerRoute.java
@@ -25,6 +25,7 @@ import org.apache.camel.Navigate;
 import org.apache.camel.Processor;
 import org.apache.camel.RouteAware;
 import org.apache.camel.Service;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.spi.IdAware;
 import org.apache.camel.spi.RouteContext;
@@ -129,6 +130,6 @@ public class EventDrivenConsumerRoute extends DefaultRoute {
     }
 
     public boolean supportsSuspension() {
-        return consumer instanceof SuspendableService;
+        return consumer instanceof Suspendable && consumer instanceof SuspendableService;
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
index 5f25a4f..c0fadaa 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/ScheduledPollConsumer.java
@@ -27,6 +27,7 @@ import org.apache.camel.FailedToCreateConsumerException;
 import org.apache.camel.LoggingLevel;
 import org.apache.camel.PollingConsumerPollingStrategy;
 import org.apache.camel.Processor;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.spi.PollingConsumerPollStrategy;
 import org.apache.camel.spi.ScheduledPollConsumerScheduler;
@@ -39,7 +40,7 @@ import org.slf4j.LoggerFactory;
 /**
  * A useful base class for any consumer which is polling based
  */
-public abstract class ScheduledPollConsumer extends DefaultConsumer implements Runnable, SuspendableService, PollingConsumerPollingStrategy {
+public abstract class ScheduledPollConsumer extends DefaultConsumer implements Runnable, Suspendable, PollingConsumerPollingStrategy {
     private static final Logger LOG = LoggerFactory.getLogger(ScheduledPollConsumer.class);
 
     private ScheduledPollConsumerScheduler scheduler;

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
index b5dffe0..9fe5df0 100644
--- a/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
+++ b/camel-core/src/main/java/org/apache/camel/management/mbean/ManagedService.java
@@ -22,6 +22,7 @@ import org.apache.camel.Service;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.StatefulService;
 import org.apache.camel.StaticService;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.apache.camel.api.management.ManagedInstance;
 import org.apache.camel.api.management.ManagedResource;
@@ -111,7 +112,7 @@ public class ManagedService implements ManagedInstance, ManagedServiceMBean {
     }
 
     public boolean isSupportSuspension() {
-        return service instanceof SuspendableService;
+        return service instanceof Suspendable && service instanceof SuspendableService;
     }
 
     public boolean isSuspended() {
@@ -127,7 +128,7 @@ public class ManagedService implements ManagedInstance, ManagedServiceMBean {
         if (!context.getStatus().isStarted()) {
             throw new IllegalArgumentException("CamelContext is not started");
         }
-        if (service instanceof SuspendableService) {
+        if (service instanceof Suspendable && service instanceof SuspendableService) {
             SuspendableService ss = (SuspendableService) service;
             ss.suspend();
         } else {

http://git-wip-us.apache.org/repos/asf/camel/blob/5973f141/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java b/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java
index 90b5ce9..e0b4d77 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ServiceHelper.java
@@ -28,6 +28,7 @@ import org.apache.camel.Processor;
 import org.apache.camel.Service;
 import org.apache.camel.ShutdownableService;
 import org.apache.camel.StatefulService;
+import org.apache.camel.Suspendable;
 import org.apache.camel.SuspendableService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -361,13 +362,13 @@ public final class ServiceHelper {
     /**
      * Suspends the given {@code service}.
      * <p/>
-     * If {@code service} is a {@link org.apache.camel.SuspendableService} then
+     * If {@code service} is both {@link org.apache.camel.Suspendable} and {@link org.apache.camel.SuspendableService} then
      * it's {@link org.apache.camel.SuspendableService#suspend()} is called but
      * <b>only</b> if {@code service} is <b>not</b> already
      * {@link #isSuspended(Object) suspended}.
      * <p/>
      * If {@code service} is <b>not</b> a
-     * {@link org.apache.camel.SuspendableService} then it's
+     * {@link org.apache.camel.Suspendable} and {@link org.apache.camel.SuspendableService} then it's
      * {@link org.apache.camel.Service#stop()} is called.
      * <p/>
      * Calling this method has no effect if {@code service} is {@code null}.
@@ -380,7 +381,7 @@ public final class ServiceHelper {
      * @see #stopService(Object)
      */
     public static boolean suspendService(Object service) throws Exception {
-        if (service instanceof SuspendableService) {
+        if (service instanceof Suspendable && service instanceof SuspendableService) {
             SuspendableService ss = (SuspendableService) service;
             if (!ss.isSuspended()) {
                 LOG.trace("Suspending service {}", service);