Class: JMX::MBean
- Inherits:
-
Object
- Object
- JMX::MBean
- Defined in:
- lib/jmx4r.rb
Constant Summary collapse
- JThread =
java.lang.Thread
- @@connection =
nil
Instance Attribute Summary collapse
-
#attributes ⇒ Object
readonly
Returns the value of attribute attributes.
-
#connection ⇒ Object
readonly
Returns the value of attribute connection.
-
#object_name ⇒ Object
readonly
Returns the value of attribute object_name.
-
#operations ⇒ Object
readonly
Returns the value of attribute operations.
Class Method Summary collapse
- .connection(args = {}) ⇒ Object
-
.create_connection(args = {}) ⇒ Object
Create a connection to a remote MBean server.
- .create_mbean(object_name, connection) ⇒ Object
-
.establish_connection(args = {}) ⇒ Object
establish a connection to a remote MBean server which will be used by all subsequent MBeans.
-
.find_all_by_name(name, args = {}) ⇒ Object
Returns an array of MBeans corresponding to all the MBeans registered for the ObjectName passed in parameter (which may be a pattern).
-
.find_by_name(name, args = {}) ⇒ Object
Same as #find_all_by_name but the ObjectName passed in parameter can not be a pattern.
- .pretty_print(object_name, args = {}) ⇒ Object
- .remove_connection(args = {}) ⇒ Object
Instance Method Summary collapse
-
#initialize(object_name, connection = nil) ⇒ MBean
constructor
Creates a new MBean.
- #meta_def(name, &blk) ⇒ Object
- #metaclass ⇒ Object
-
#method_missing(method, *args, &block) ⇒ Object
:nodoc:.
Constructor Details
#initialize(object_name, connection = nil) ⇒ MBean
Creates a new MBean.
- object_name
-
a string corresponding to a valid ObjectName
- connection
-
a connection to a MBean server. If none is passed, use the global connection created by MBean.establish_connection
82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/jmx4r.rb', line 82 def initialize(object_name, connection=nil) @connection = connection || @@connection @object_name = object_name info = @connection.getMBeanInfo @object_name @attributes = Hash.new info.attributes.each do | mbean_attr | @attributes[mbean_attr.name.snake_case] = mbean_attr.name end @operations = Hash.new info.operations.each do |mbean_op| param_types = mbean_op.signature.map {|param| param.type} @operations[mbean_op.name.snake_case] = [mbean_op.name, param_types] end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
:nodoc:
97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/jmx4r.rb', line 97 def method_missing(method, *args, &block) #:nodoc: method_in_snake_case = method.to_s.snake_case # this way Java/JRuby styles are compatible if @operations.keys.include?(method_in_snake_case) op_name, param_types = @operations[method_in_snake_case] @connection.invoke @object_name, op_name, args.to_java(:Object), param_types.to_java(:String) else super end end |
Instance Attribute Details
#attributes ⇒ Object (readonly)
Returns the value of attribute attributes.
67 68 69 |
# File 'lib/jmx4r.rb', line 67 def attributes @attributes end |
#connection ⇒ Object (readonly)
Returns the value of attribute connection.
67 68 69 |
# File 'lib/jmx4r.rb', line 67 def connection @connection end |
#object_name ⇒ Object (readonly)
Returns the value of attribute object_name.
67 68 69 |
# File 'lib/jmx4r.rb', line 67 def object_name @object_name end |
#operations ⇒ Object (readonly)
Returns the value of attribute operations.
67 68 69 |
# File 'lib/jmx4r.rb', line 67 def operations @operations end |
Class Method Details
.connection(args = {}) ⇒ Object
135 136 137 138 139 140 141 |
# File 'lib/jmx4r.rb', line 135 def self.connection(args={}) if args.has_key? :host or args.has_key? :port return create_connection(args) else @@connection ||= MBean.establish_connection(args) end end |
.create_connection(args = {}) ⇒ Object
Create a connection to a remote MBean server.
The args accepts the following keys:
- :host
-
the host of the MBean server (defaults to “localhost”)
- :port
-
the port of the MBean server (defaults to 3000)
- :url
-
the url of the MBean server. No default. if the url is specified, the host & port parameters are not taken into account
- :command
-
the pattern matches the command line of the local JVM process including the MBean server. (command lines are listed on the connection dialog in JConsole). No default. this feature needs a JDK (>=5) installed on the local system. if the command is specified, the host & port or the url parameters are not taken into account
- :username
-
the name of the user (if the MBean server requires authentication). No default
- :password
-
the password of the user (if the MBean server requires authentication). No default
- :credentials
-
custom credentials (if the MBean server requires authentication). No default. It has precedence over :username and :password (i.e. if :credentials is specified, :username & :password are ignored)
- :provider_package
-
use to fill the JMXConnectorFactory::PROTOCOL_PROVIDER_PACKAGES. No default
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/jmx4r.rb', line 179 def self.create_connection(args={}) host= args[:host] || "localhost" port = args[:port] || 3000 username = args[:username] password = args[:password] credentials = args[:credentials] provider_package = args[:provider_package] if args[:command] url = JDKHelper.find_local_url(args[:command]) or raise "no locally attacheable VMs" else # host & port are not taken into account if url is set (see issue #7) standard_url = "service:jmx:rmi:///jndi/rmi://#{host}:#{port}/jmxrmi" url = args[:url] || standard_url end unless credentials if !username.nil? and username.length > 0 user_password_credentials = [username, password] credentials = user_password_credentials.to_java(:String) end end env = HashMap.new env.put(JMXConnector::CREDENTIALS, credentials) if credentials # only fill the Context and JMXConnectorFactory properties if provider_package is set if provider_package env.put(Context::SECURITY_PRINCIPAL, username) if username env.put(Context::SECURITY_CREDENTIALS, password) if password env.put(JMXConnectorFactory::PROTOCOL_PROVIDER_PACKAGES, provider_package) end # the context class loader is set to JRuby's classloader when # creating the JMX Connection so that classes loaded using # JRuby "require" (and not from its classpath) can also be # accessed (see issue #6) begin context_class_loader = JThread.current_thread.context_class_loader JThread.current_thread.context_class_loader = JRuby.runtime.getJRubyClassLoader connector = JMXConnectorFactory::connect JMXServiceURL.new(url), env MBeanServerConnectionProxy.new connector ensure # ... and we reset the previous context class loader JThread.current_thread.context_class_loader = context_class_loader end end |
.create_mbean(object_name, connection) ⇒ Object
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 |
# File 'lib/jmx4r.rb', line 254 def self.create_mbean(object_name, connection) info = connection.getMBeanInfo object_name mbean = MBean.new object_name, connection # define attribute accessor methods for the mbean info.attributes.each do |mbean_attr| mbean. mbean_attr.name.snake_case do connection.getAttribute object_name, mbean_attr.name end if mbean_attr.isWritable mbean. "#{mbean_attr.name.snake_case}=" do |value| attribute = Attribute.new mbean_attr.name, value connection.setAttribute object_name, attribute end end end mbean end |
.establish_connection(args = {}) ⇒ Object
establish a connection to a remote MBean server which will be used by all subsequent MBeans.
See MBean.create_connection for a list of the keys that are accepted in arguments.
Examples
JMX::MBean.establish_connection :port => "node23", :port => 1090
JMX::MBean.establish_connection :port => "node23", :username => "jeff", :password => "secret"
JMX::MBean.establish_connection :command => /jconsole/i
124 125 126 |
# File 'lib/jmx4r.rb', line 124 def self.establish_connection(args={}) @@connection ||= create_connection args end |
.find_all_by_name(name, args = {}) ⇒ Object
Returns an array of MBeans corresponding to all the MBeans registered for the ObjectName passed in parameter (which may be a pattern).
The args accepts the same keys than #create_connection and an additional one:
- :connection
-
a MBean server connection (as returned by #create_connection) No default. It has precedence over :host and :port (i.e if :connection is specified, :host and :port are ignored)
239 240 241 242 243 244 |
# File 'lib/jmx4r.rb', line 239 def self.find_all_by_name(name, args={}) object_name = ObjectName.new(name) connection = args[:connection] || MBean.connection(args) object_names = connection.queryNames(object_name, nil) object_names.map { |on| create_mbean on, connection } end |
.find_by_name(name, args = {}) ⇒ Object
Same as #find_all_by_name but the ObjectName passed in parameter can not be a pattern. Only one single MBean is returned.
249 250 251 252 |
# File 'lib/jmx4r.rb', line 249 def self.find_by_name(name, args={}) connection = args[:connection] || MBean.connection(args) create_mbean ObjectName.new(name), connection end |
.pretty_print(object_name, args = {}) ⇒ Object
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 |
# File 'lib/jmx4r.rb', line 272 def self.pretty_print (object_name, args={}) connection = args[:connection] || MBean.connection(args) info = connection.getMBeanInfo ObjectName.new(object_name) puts "object_name: #{object_name}" puts "class: #{info.class_name}" puts "description: #{info.description}" puts "operations:" info.operations.each do | op | puts " #{op.name}" op.signature.each do | param | puts " #{param.name} (#{param.type} #{param.description})" end puts " ----" puts " description: #{op.description}" puts " return_type: #{op.return_type}" puts " impact: #{op.impact}" end puts "attributes:" info.attributes.each do | attr | puts " #{attr.name}" puts " description: #{attr.description}" puts " type: #{attr.type}" puts " readable: #{attr.readable}" puts " writable: #{attr.writable}" puts " is: #{attr.is}" end end |
.remove_connection(args = {}) ⇒ Object
128 129 130 131 132 133 |
# File 'lib/jmx4r.rb', line 128 def self.remove_connection(args={}) if @@connection @@connection.close rescue nil end @@connection = nil end |
Instance Method Details
#meta_def(name, &blk) ⇒ Object
70 71 72 73 74 |
# File 'lib/jmx4r.rb', line 70 def name, &blk .instance_eval do define_method name, &blk end end |
#metaclass ⇒ Object
69 |
# File 'lib/jmx4r.rb', line 69 def ; class << self; self; end; end |