001 /**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one or more
004 * contributor license agreements. See the NOTICE file distributed with
005 * this work for additional information regarding copyright ownership.
006 * The ASF licenses this file to You under the Apache License, Version 2.0
007 * (the "License"); you may not use this file except in compliance with
008 * the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 package org.apache.camel.component.jmx;
019
020 import javax.management.MBeanServer;
021 import javax.management.Notification;
022 import javax.management.ObjectName;
023 import javax.management.monitor.CounterMonitor;
024 import org.apache.camel.Consumer;
025 import org.apache.camel.Processor;
026 import org.apache.camel.Producer;
027 import org.apache.camel.impl.DefaultEndpoint;
028 import org.apache.commons.logging.Log;
029 import org.apache.commons.logging.LogFactory;
030
031 /**
032 * Creates a CounterMonitor for jmx attributes
033 *
034 * @version $Revision: 523016 $
035 */
036 public class JMXEndpoint extends DefaultEndpoint<JMXExchange> {
037
038 private static final Log log=LogFactory.getLog(JMXEndpoint.class);
039 private String name;
040 private ObjectName ourName;
041 private String observedObjectName;
042 private String attributeName;
043 private long granularityPeriod=5000;
044 private Number threshold;
045 private Number offset;
046 private MBeanServer mbeanServer;
047 private CounterMonitor counterMonitor=new CounterMonitor();
048
049 protected JMXEndpoint(String endpointUri,JMXComponent component){
050 super(endpointUri,component);
051 observedObjectName=endpointUri;
052 }
053
054 /**
055 * @return a Producer
056 * @throws Exception
057 * @see org.apache.camel.Endpoint#createProducer()
058 */
059 public Producer<JMXExchange> createProducer() throws Exception{
060 throw new RuntimeException("Not supported");
061 }
062
063 /**
064 * @param proc
065 * @return a Consumer
066 * @throws Exception
067 * @see org.apache.camel.Endpoint#createConsumer(org.apache.camel.Processor)
068 */
069 public Consumer<JMXExchange> createConsumer(Processor proc)
070 throws Exception{
071 ObjectName observedName=new ObjectName(observedObjectName);
072 if(name==null){
073 String type=observedName.getKeyProperty("type");
074 type=type!=null?type:"UNKNOWN";
075 name=mbeanServer.getDefaultDomain()+":type=CounterMonitor_"+type;
076 }
077 JMXConsumer result=new JMXConsumer(this,proc);
078 ourName=new ObjectName(name);
079 counterMonitor.setNotify(true);
080 counterMonitor.addObservedObject(observedName);
081 counterMonitor.setObservedAttribute(attributeName);
082 counterMonitor.setGranularityPeriod(granularityPeriod);
083 counterMonitor.setDifferenceMode(false);
084 counterMonitor.setInitThreshold(threshold);
085 counterMonitor.setOffset(offset);
086 mbeanServer.registerMBean(counterMonitor,ourName);
087 mbeanServer.addNotificationListener(ourName,result,null,new Object());
088 return result;
089 }
090
091 public boolean isSingleton(){
092 return true;
093 }
094
095 public JMXExchange createExchange(Notification notification){
096 return new JMXExchange(getContext(),notification);
097 }
098
099 public JMXExchange createExchange(){
100 return new JMXExchange(getContext(),null);
101 }
102
103
104 public String getAttributeName(){
105 return attributeName;
106 }
107
108
109 public void setAttributeName(String attributeName){
110 this.attributeName=attributeName;
111 }
112
113
114 public long getGranularityPeriod(){
115 return granularityPeriod;
116 }
117
118
119 public void setGranularityPeriod(long granularityPeriod){
120 this.granularityPeriod=granularityPeriod;
121 }
122
123
124 public String getName(){
125 return name;
126 }
127
128
129 public void setName(String name){
130 this.name=name;
131 }
132
133
134 public Number getOffset(){
135 return offset;
136 }
137
138
139 public void setOffset(Number offset){
140 this.offset=offset;
141 }
142
143
144 public Number getThreshold(){
145 return threshold;
146 }
147
148
149 public void setThreshold(Number threshold){
150 this.threshold=threshold;
151 }
152
153
154 public MBeanServer getMbeanServer(){
155 return mbeanServer;
156 }
157
158
159 public void setMbeanServer(MBeanServer mbeanServer){
160 this.mbeanServer=mbeanServer;
161 }
162 }