001 /** 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.apache.camel.management.mbean; 018 019 import org.apache.camel.CamelContext; 020 import org.apache.camel.Route; 021 import org.apache.camel.Service; 022 import org.apache.camel.ServiceStatus; 023 import org.apache.camel.StatefulService; 024 import org.apache.camel.SuspendableService; 025 import org.apache.camel.api.management.ManagedInstance; 026 import org.apache.camel.api.management.ManagedResource; 027 import org.apache.camel.api.management.mbean.ManagedServiceMBean; 028 import org.apache.camel.spi.ManagementStrategy; 029 030 @ManagedResource(description = "Managed Service") 031 public class ManagedService implements ManagedInstance, ManagedServiceMBean { 032 private final CamelContext context; 033 private final Service service; 034 private Route route; 035 036 public ManagedService(CamelContext context, Service service) { 037 this.context = context; 038 this.service = service; 039 } 040 041 public void init(ManagementStrategy strategy) { 042 // do nothing 043 } 044 045 public Service getService() { 046 return service; 047 } 048 049 public CamelContext getContext() { 050 return context; 051 } 052 053 public Route getRoute() { 054 return route; 055 } 056 057 public void setRoute(Route route) { 058 this.route = route; 059 } 060 061 public String getState() { 062 // must use String type to be sure remote JMX can read the attribute without requiring Camel classes. 063 if (service instanceof StatefulService) { 064 ServiceStatus status = ((StatefulService) service).getStatus(); 065 return status.name(); 066 } 067 068 // assume started if not a ServiceSupport instance 069 return ServiceStatus.Started.name(); 070 } 071 072 public String getCamelId() { 073 return context.getName(); 074 } 075 076 public String getRouteId() { 077 if (route != null) { 078 return route.getId(); 079 } 080 return null; 081 } 082 083 public void start() throws Exception { 084 if (!context.getStatus().isStarted()) { 085 throw new IllegalArgumentException("CamelContext is not started"); 086 } 087 service.start(); 088 } 089 090 public void stop() throws Exception { 091 if (!context.getStatus().isStarted()) { 092 throw new IllegalArgumentException("CamelContext is not started"); 093 } 094 service.stop(); 095 } 096 097 public boolean isSupportSuspension() { 098 return service instanceof SuspendableService; 099 } 100 101 public boolean isSuspended() { 102 if (service instanceof SuspendableService) { 103 SuspendableService ss = (SuspendableService) service; 104 return ss.isSuspended(); 105 } else { 106 return false; 107 } 108 } 109 110 public void suspend() throws Exception { 111 if (!context.getStatus().isStarted()) { 112 throw new IllegalArgumentException("CamelContext is not started"); 113 } 114 if (service instanceof SuspendableService) { 115 SuspendableService ss = (SuspendableService) service; 116 ss.suspend(); 117 } else { 118 throw new UnsupportedOperationException("suspend() is not a supported operation"); 119 } 120 } 121 122 public void resume() throws Exception { 123 if (!context.getStatus().isStarted()) { 124 throw new IllegalArgumentException("CamelContext is not started"); 125 } 126 if (service instanceof SuspendableService) { 127 SuspendableService ss = (SuspendableService) service; 128 ss.resume(); 129 } else { 130 throw new UnsupportedOperationException("resume() is not a supported operation"); 131 } 132 } 133 134 public Object getInstance() { 135 return service; 136 } 137 }