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 */
017package org.apache.camel.management.mbean;
018
019import java.util.Collection;
020
021import javax.management.openmbean.CompositeData;
022import javax.management.openmbean.CompositeDataSupport;
023import javax.management.openmbean.CompositeType;
024import javax.management.openmbean.TabularData;
025import javax.management.openmbean.TabularDataSupport;
026
027import org.apache.camel.CamelContext;
028import org.apache.camel.RuntimeCamelException;
029import org.apache.camel.api.management.ManagedResource;
030import org.apache.camel.api.management.mbean.CamelOpenMBeanTypes;
031import org.apache.camel.api.management.mbean.ManagedExchangeFactoryManagerMBean;
032import org.apache.camel.spi.ExchangeFactory;
033import org.apache.camel.spi.ExchangeFactoryManager;
034import org.apache.camel.spi.ManagementStrategy;
035import org.apache.camel.util.URISupport;
036
037@ManagedResource(description = "Managed ExchangeFactory")
038public class ManagedExchangeFactoryManager extends ManagedService implements ManagedExchangeFactoryManagerMBean {
039
040    private ExchangeFactoryManager exchangeFactoryManager;
041    private boolean sanitize;
042
043    public ManagedExchangeFactoryManager(CamelContext context, ExchangeFactoryManager exchangeFactoryManager) {
044        super(context, exchangeFactoryManager);
045        this.exchangeFactoryManager = exchangeFactoryManager;
046    }
047
048    @Override
049    public void init(ManagementStrategy strategy) {
050        super.init(strategy);
051        sanitize = strategy.getManagementAgent().getMask() != null ? strategy.getManagementAgent().getMask() : false;
052    }
053
054    @Override
055    public Integer getConsumerCounter() {
056        return exchangeFactoryManager.getConsumerCounter();
057    }
058
059    @Override
060    public Integer getTotalPooled() {
061        return exchangeFactoryManager.getPooledCounter();
062    }
063
064    @Override
065    public Integer getCapacity() {
066        return exchangeFactoryManager.getCapacity();
067    }
068
069    @Override
070    public Boolean getStatisticsEnabled() {
071        return exchangeFactoryManager.isStatisticsEnabled();
072    }
073
074    @Override
075    public void setStatisticsEnabled(Boolean statisticsEnabled) {
076        exchangeFactoryManager.setStatisticsEnabled(statisticsEnabled);
077    }
078
079    @Override
080    public void resetStatistics() {
081        exchangeFactoryManager.resetStatistics();
082    }
083
084    @Override
085    public void purge() {
086        exchangeFactoryManager.purge();
087    }
088
089    @Override
090    public Long getTotalCreated() {
091        return exchangeFactoryManager.getStatistics().getCreatedCounter();
092    }
093
094    @Override
095    public Long getTotalAcquired() {
096        return exchangeFactoryManager.getStatistics().getAcquiredCounter();
097    }
098
099    @Override
100    public Long getTotalReleased() {
101        return exchangeFactoryManager.getStatistics().getReleasedCounter();
102    }
103
104    @Override
105    public Long getTotalDiscarded() {
106        return exchangeFactoryManager.getStatistics().getDiscardedCounter();
107    }
108
109    @Override
110    public TabularData listStatistics() {
111        try {
112            TabularData answer = new TabularDataSupport(CamelOpenMBeanTypes.listExchangeFactoryTabularType());
113            Collection<ExchangeFactory> factories = exchangeFactoryManager.getExchangeFactories();
114            for (ExchangeFactory ef : factories) {
115                CompositeType ct = CamelOpenMBeanTypes.listExchangeFactoryCompositeType();
116                String routeId = ef.getRouteId();
117                String url = ef.getConsumer().getEndpoint().getEndpointUri();
118                if (sanitize) {
119                    url = URISupport.sanitizeUri(url);
120                }
121
122                int capacity = ef.getCapacity();
123                int size = ef.getSize();
124                long created = 0;
125                long acquired = 0;
126                long released = 0;
127                long discarded = 0;
128                if (ef.isStatisticsEnabled()) {
129                    created = ef.getStatistics().getCreatedCounter();
130                    acquired = ef.getStatistics().getAcquiredCounter();
131                    released = ef.getStatistics().getReleasedCounter();
132                    discarded = ef.getStatistics().getDiscardedCounter();
133                }
134
135                CompositeData data = new CompositeDataSupport(
136                        ct,
137                        new String[] { "url", "routeId", "capacity", "pooled", "created", "acquired", "released", "discarded" },
138                        new Object[] { url, routeId, capacity, size, created, acquired, released, discarded });
139                answer.put(data);
140            }
141            return answer;
142        } catch (Exception e) {
143            throw RuntimeCamelException.wrapRuntimeCamelException(e);
144        }
145    }
146}