jmx 0.2 → 0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +4 -2
- data/Rakefile +0 -0
- data/lib/jmx.rb +10 -8
- data/lib/jmx/dynamic_mbean.rb +22 -16
- data/lib/jmx/server.rb +6 -2
- data/lib/jmx/version.rb +1 -1
- data/lib/rmi.rb +0 -0
- data/test/jmx_attribute_test.rb +2 -81
- data/test/jmx_client_test.rb +0 -0
- data/test/jmx_notification_test.rb +29 -0
- data/test/jmx_server_test.rb +13 -0
- data/test/object_name_test.rb +12 -0
- metadata +42 -40
data/Manifest.txt
CHANGED
@@ -3,12 +3,14 @@ Rakefile
|
|
3
3
|
README.txt
|
4
4
|
LICENSE.txt
|
5
5
|
lib/jmx
|
6
|
+
lib/jmx.rb
|
7
|
+
lib/rmi.rb
|
6
8
|
lib/jmx/dynamic_mbean.rb
|
7
9
|
lib/jmx/server.rb
|
8
10
|
lib/jmx/version.rb
|
9
|
-
lib/jmx.rb
|
10
|
-
lib/rmi.rb
|
11
11
|
samples/memory.rb
|
12
12
|
test/jmx_attribute_test.rb
|
13
13
|
test/jmx_client_test.rb
|
14
|
+
test/jmx_notification_test.rb
|
14
15
|
test/jmx_server_test.rb
|
16
|
+
test/object_name_test.rb
|
data/Rakefile
CHANGED
File without changes
|
data/lib/jmx.rb
CHANGED
@@ -6,17 +6,19 @@ require 'jmx/server'
|
|
6
6
|
|
7
7
|
import java.util.ArrayList
|
8
8
|
import javax.management.Attribute
|
9
|
-
import javax.management.DynamicMBean
|
10
9
|
import javax.management.MBeanInfo
|
11
|
-
import javax.management.
|
10
|
+
import javax.management.DynamicMBean
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
module JMX
|
13
|
+
import javax.management.ObjectName
|
14
|
+
class ObjectName
|
15
|
+
def [](key)
|
16
|
+
get_key_property(key.to_s)
|
17
|
+
end
|
17
18
|
|
18
|
-
|
19
|
-
|
19
|
+
def info(server)
|
20
|
+
server.getMBeanInfo(self)
|
21
|
+
end
|
20
22
|
end
|
21
23
|
end
|
22
24
|
|
data/lib/jmx/dynamic_mbean.rb
CHANGED
@@ -70,10 +70,10 @@ module JMX
|
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
73
|
-
# The Ruby-Java JMX utilities work
|
73
|
+
# The Ruby-Java JMX utilities work throughout the DynamicMBean concept. Creators of Ruby based MBeans must inherit this
|
74
74
|
# class (<tt>RubyDynamicMBean</tt>) in their own bean classes and then register them with a JMX mbean server.
|
75
75
|
# Here is an example:
|
76
|
-
# class MyMBean <
|
76
|
+
# class MyMBean < RuybDynamicMBean
|
77
77
|
# rw_attribute :status, :string, "Status information for this process"
|
78
78
|
#
|
79
79
|
# operation "Shutdown this process"
|
@@ -83,18 +83,27 @@ end
|
|
83
83
|
# "shutdown requests more time"
|
84
84
|
# end
|
85
85
|
# end
|
86
|
-
# Once you have defined your bean class you can start declaring attributes and operations.
|
87
|
-
# read, write, and read write. Simmilar to the <tt>attr*</tt>
|
88
|
-
#
|
89
|
-
#
|
86
|
+
# Once you have defined your bean class you can start declaring attributes and operations.
|
87
|
+
# Attributes come in three flavors: read, write, and read write. Simmilar to the <tt>attr*</tt>
|
88
|
+
# helpers, there are helpers that are used to create management attributes. Use +r_attribute+,
|
89
|
+
# +w_attribute+, and +rw_attribute+ to declare attributes, and the +operation+, +returns+,
|
90
|
+
# and +parameter+ helpers to define a management operation.
|
90
91
|
# Creating attributes with the *_attribute convention ALSO creates ruby accessors
|
91
|
-
# (it invokes the attr_accessor/attr_reader/attr_writer ruby helpers) to create ruby methods
|
92
|
-
# So in your ruby code you can treat the attributes
|
92
|
+
# (it invokes the attr_accessor/attr_reader/attr_writer ruby helpers) to create ruby methods
|
93
|
+
# like: user_name= and username. So in your ruby code you can treat the attributes
|
94
|
+
# as "regular" ruby accessors
|
93
95
|
class RubyDynamicMBean
|
94
96
|
import javax.management.MBeanOperationInfo
|
95
97
|
import javax.management.MBeanAttributeInfo
|
98
|
+
import javax.management.DynamicMBean
|
99
|
+
import javax.management.MBeanInfo
|
96
100
|
include JMX::JavaTypeAware
|
97
101
|
|
102
|
+
#NOTE this will not be needed when JRuby-3164 is fixed.
|
103
|
+
def self.inherited(cls)
|
104
|
+
cls.send(:include, DynamicMBean)
|
105
|
+
end
|
106
|
+
|
98
107
|
# TODO: preserve any original method_added?
|
99
108
|
# TODO: Error handling here when it all goes wrong?
|
100
109
|
def self.method_added(name) #:nodoc:
|
@@ -120,8 +129,6 @@ class RubyDynamicMBean
|
|
120
129
|
# patterns of creating getters and setters in ruby
|
121
130
|
#++
|
122
131
|
def self.rw_attribute(name, type, description)
|
123
|
-
#QUESTION: Is this here to ensure that our type implements the interface?
|
124
|
-
include DynamicMBean
|
125
132
|
attributes << JMX::Attribute.new(name, type, description, true, true).to_jmx
|
126
133
|
attr_accessor name
|
127
134
|
#create a "java" oriented accessor method
|
@@ -140,15 +147,14 @@ class RubyDynamicMBean
|
|
140
147
|
define_method("jmx_set_#{name.to_s.downcase}") do |value|
|
141
148
|
blck = to_ruby(type)
|
142
149
|
eval "@#{name.to_s} = #{blck.call(value)}"
|
143
|
-
end
|
144
|
-
|
150
|
+
end
|
145
151
|
end
|
152
|
+
|
146
153
|
# the <tt>r_attribute</tt> method is used to declare a JMX read only attribute.
|
147
154
|
# see the +JavaSimpleTypes+ module for more information about acceptable types
|
148
155
|
# usage:
|
149
156
|
# r_attribute :attribute_name, :string, "Description displayed in a JMX console"
|
150
157
|
def self.r_attribute(name, type, description)
|
151
|
-
include DynamicMBean
|
152
158
|
attributes << JMX::Attribute.new(name, type, description, true, false).to_jmx
|
153
159
|
attr_reader name
|
154
160
|
#create a "java" oriented accessor method
|
@@ -164,12 +170,12 @@ class RubyDynamicMBean
|
|
164
170
|
attribute = javax.management.Attribute.new(name.to_s, value)
|
165
171
|
end
|
166
172
|
end
|
173
|
+
|
167
174
|
# the <tt>w_attribute</tt> method is used to declare a JMX write only attribute.
|
168
175
|
# see the +JavaSimpleTypes+ module for more information about acceptable types
|
169
176
|
# usage:
|
170
177
|
# w_attribute :attribute_name, :string, "Description displayed in a JMX console"
|
171
178
|
def self.w_attribute(name, type, description)
|
172
|
-
include DynamicMBean
|
173
179
|
attributes << JMX::Attribute.new(name, type, description, false, true).to_jmx
|
174
180
|
attr_writer name
|
175
181
|
define_method("jmx_set_#{name.to_s.downcase}") do |value|
|
@@ -187,7 +193,6 @@ class RubyDynamicMBean
|
|
187
193
|
# Last operation wins if more than one
|
188
194
|
#++
|
189
195
|
def self.operation(description)
|
190
|
-
include DynamicMBean
|
191
196
|
|
192
197
|
# Wait to error check until method_added so we can know method name
|
193
198
|
Thread.current[:op] = JMX::Operation.new description
|
@@ -221,7 +226,8 @@ class RubyDynamicMBean
|
|
221
226
|
@info = MBeanInfo.new name, description, attributes, nil, operations, nil
|
222
227
|
end
|
223
228
|
|
224
|
-
# Retrieve the value of the requested attribute (where attribute is a
|
229
|
+
# Retrieve the value of the requested attribute (where attribute is a
|
230
|
+
# javax.management.Attribute class)
|
225
231
|
def getAttribute(attribute)
|
226
232
|
send("jmx_get_"+attribute.downcase)
|
227
233
|
end
|
data/lib/jmx/server.rb
CHANGED
@@ -69,12 +69,16 @@ module JMX
|
|
69
69
|
|
70
70
|
@server.query_names(object_name, query)
|
71
71
|
end
|
72
|
+
|
73
|
+
def unregister_mbean(object_name)
|
74
|
+
name = make_object_name object_name
|
75
|
+
@server.unregisterMBean(name)
|
76
|
+
|
77
|
+
end
|
72
78
|
|
73
79
|
def register_mbean(object, object_name)
|
74
80
|
name = make_object_name object_name
|
75
|
-
|
76
81
|
@server.registerMBean(object, name)
|
77
|
-
|
78
82
|
MBeanProxy.generate(@server, name)
|
79
83
|
end
|
80
84
|
|
data/lib/jmx/version.rb
CHANGED
data/lib/rmi.rb
CHANGED
File without changes
|
data/test/jmx_attribute_test.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
|
-
|
2
1
|
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
3
2
|
|
4
3
|
require 'test/unit'
|
5
|
-
require 'rmi'
|
6
4
|
require 'jmx'
|
7
5
|
|
8
|
-
|
9
6
|
class MyAttributeDynamicBean < RubyDynamicMBean
|
10
7
|
rw_attribute :name1, :string, "My sample attribute"
|
11
8
|
r_attribute :number1, :int, "My sample integer based attribute that is read only"
|
@@ -23,86 +20,9 @@ class MyAttributeDynamicBean < RubyDynamicMBean
|
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
26
|
-
class JMXAttributeTest < Test::Unit::TestCase
|
27
|
-
|
28
|
-
def setup
|
29
|
-
@madb = MyAttributeDynamicBean.new("test.MyTestBean","Mwahahahahahah")
|
30
|
-
end
|
31
|
-
|
32
|
-
#make sure we didn't break anything from a ruby perspective
|
33
|
-
def test_can_create_bean_and_access_accessor_type_methods
|
34
|
-
@madb.set_number1 4
|
35
|
-
assert_nil(@madb.name1)
|
36
|
-
@madb.name1 = "Name"
|
37
|
-
assert_equal("Name", @madb.name1)
|
38
|
-
assert_equal(4, @madb.number1)
|
39
|
-
@madb.number2 = 4
|
40
|
-
assert_equal(4, @madb.fetch_number2)
|
41
|
-
assert_raise(NoMethodError) { @madb.number2 }
|
42
|
-
end
|
43
|
-
|
44
|
-
def test_get_attributes_via_dynamicmbeaninterface
|
45
|
-
@madb.set_number1 4
|
46
|
-
@madb.name1 = "Name"
|
47
|
-
|
48
|
-
assert_equal(@madb.name1, @madb.getAttribute("name1").get_value.to_s)
|
49
|
-
assert_equal(@madb.number1, @madb.getAttribute("number1").get_value)
|
50
|
-
atts = ["name1", "number1"]
|
51
|
-
retrieved = @madb.getAttributes(atts)
|
52
|
-
assert_equal(2, retrieved.length)
|
53
|
-
#TODO: assertion comparing the types in teh array to java types
|
54
|
-
end
|
55
|
-
|
56
|
-
def test_set_attributes_via_dynamicbeaninterface
|
57
|
-
@madb.name1 = "blue"
|
58
|
-
red = java.lang.String.new("red")
|
59
|
-
attribute = javax.management.Attribute.new("name1", red)
|
60
|
-
@madb.setAttribute(attribute)
|
61
|
-
|
62
|
-
assert_equal("String", @madb.name1.class.to_s )
|
63
|
-
assert_equal("red", @madb.name1)
|
64
|
-
end
|
65
|
-
|
66
|
-
def test_set_multiple_attributes_via_dynamicbeaninterface
|
67
|
-
@madb.name1 = "blue"
|
68
|
-
three = java.lang.Integer.new(3)
|
69
|
-
red = java.lang.String.new("red")
|
70
|
-
attribute1 = javax.management.Attribute.new("name1", red)
|
71
|
-
attribute2 = javax.management.Attribute.new("number2", three)
|
72
|
-
|
73
|
-
@madb.setAttributes([attribute1, attribute2])
|
74
|
-
assert_equal("red", @madb.name1)
|
75
|
-
assert_equal(3, @madb.fetch_number2)
|
76
|
-
end
|
77
|
-
|
78
|
-
end
|
79
|
-
|
80
|
-
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
81
|
-
|
82
|
-
require 'test/unit'
|
83
|
-
require 'rmi'
|
84
|
-
require 'jmx'
|
85
|
-
|
86
|
-
|
87
|
-
class MyAttributeDynamicBean < RubyDynamicMBean
|
88
|
-
rw_attribute :name1, :string, "My sample attribute"
|
89
|
-
r_attribute :number1, :int, "My sample integer based attribute that is read only"
|
90
|
-
w_attribute :number2, :int, "My sample integer based attribute that is write only"
|
91
|
-
|
92
|
-
def intialize(type, text)
|
93
|
-
super(type,text)
|
94
|
-
end
|
95
|
-
def set_number1(val)
|
96
|
-
@number1 = val
|
97
|
-
end
|
98
|
-
|
99
|
-
def fetch_number2
|
100
|
-
@number2
|
101
|
-
end
|
102
|
-
end
|
103
23
|
|
104
24
|
class JMXAttributeTest < Test::Unit::TestCase
|
105
|
-
|
25
|
+
|
106
26
|
def setup
|
107
27
|
@madb = MyAttributeDynamicBean.new("test.MyTestBean","Mwahahahahahah")
|
108
28
|
end
|
@@ -154,3 +74,4 @@ class JMXAttributeTest < Test::Unit::TestCase
|
|
154
74
|
end
|
155
75
|
|
156
76
|
end
|
77
|
+
|
data/test/jmx_client_test.rb
CHANGED
File without changes
|
@@ -0,0 +1,29 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'rmi'
|
5
|
+
require 'jmx'
|
6
|
+
|
7
|
+
class MyAttributeDynamicBean < RubyDynamicMBean
|
8
|
+
rw_attribute :name1, :string, "My sample attribute"
|
9
|
+
r_attribute :number1, :int, "My sample integer based attribute that is read only"
|
10
|
+
w_attribute :number2, :int, "My sample integer based attribute that is write only"
|
11
|
+
|
12
|
+
def intialize(type, text)
|
13
|
+
super(type,text)
|
14
|
+
end
|
15
|
+
def set_number1(val)
|
16
|
+
@number1 = val
|
17
|
+
end
|
18
|
+
|
19
|
+
def fetch_number2
|
20
|
+
@number2
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
#interface NotificationEmitter
|
27
|
+
#v addNotificationListener listener, filter, handback
|
28
|
+
#MBEanNotificationInfo getNotificationInfo
|
29
|
+
#v removeNotificationListener listener, filter, handback
|
data/test/jmx_server_test.rb
CHANGED
@@ -68,4 +68,17 @@ class JMXServerTest < Test::Unit::TestCase
|
|
68
68
|
assert_equal("hehheh", bean.string_double("heh"))
|
69
69
|
assert_equal("123", bean.concat([1,2,3]))
|
70
70
|
end
|
71
|
+
def test_ruby_mbean_twice
|
72
|
+
dyna = MyDynamicMBean.new("domain.MySuperBean", "Heh")
|
73
|
+
domain = @server.default_domain
|
74
|
+
@server.unregister_mbean "#{domain}:type=MyDynamicMBean"
|
75
|
+
@server.register_mbean dyna, "#{domain}:type=MyDynamicMBean"
|
76
|
+
# Get bean from client connector connection
|
77
|
+
bean = @client["#{domain}:type=MyDynamicMBean"]
|
78
|
+
assert_equal("foo", bean.foo)
|
79
|
+
assert_equal(6, bean.double(3))
|
80
|
+
assert_raise(TypeError) { puts bean.double("HEH") }
|
81
|
+
assert_equal("hehheh", bean.string_double("heh"))
|
82
|
+
assert_equal("123", bean.concat([1,2,3]))
|
83
|
+
end
|
71
84
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
require "test/unit"
|
3
|
+
|
4
|
+
require "jmx"
|
5
|
+
|
6
|
+
class TestObjectName < Test::Unit::TestCase
|
7
|
+
def test_create_object_name
|
8
|
+
MObjectName.ancestors.each {|method| p method}
|
9
|
+
x = MObjectName.new "foo:d=bar"
|
10
|
+
assert_not_nil(x)
|
11
|
+
end
|
12
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,71 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
autorequire:
|
9
|
-
bindir: bin
|
10
|
-
cert_chain: []
|
11
|
-
|
12
|
-
date: 2008-07-28 00:00:00 +09:00
|
13
|
-
default_executable:
|
14
|
-
dependencies: []
|
15
|
-
|
16
|
-
description: Install this gem and require 'jmx' to load the library.
|
2
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
3
|
+
requirements:
|
4
|
+
- - '>='
|
5
|
+
- !ruby/object:Gem::Version
|
6
|
+
version: "0"
|
7
|
+
version:
|
17
8
|
email: enebo@acm.org
|
18
|
-
|
19
|
-
|
20
|
-
extensions: []
|
9
|
+
cert_chain: []
|
21
10
|
|
11
|
+
summary: Package for interacting/creating Java Management Extensions
|
12
|
+
post_install_message:
|
22
13
|
extra_rdoc_files:
|
23
14
|
- Manifest.txt
|
24
15
|
- README.txt
|
25
16
|
- LICENSE.txt
|
17
|
+
homepage: http://jruby-extras.rubyforge.org/jmx
|
18
|
+
signing_key:
|
19
|
+
name: jmx
|
20
|
+
rdoc_options:
|
21
|
+
- --main
|
22
|
+
- README.txt
|
23
|
+
autorequire:
|
24
|
+
rubyforge_project: jruby-extras
|
25
|
+
executables: []
|
26
|
+
|
27
|
+
description: Install this gem and require 'jmx' to load the library.
|
28
|
+
specification_version: 2
|
29
|
+
default_executable:
|
26
30
|
files:
|
27
31
|
- Manifest.txt
|
28
32
|
- Rakefile
|
29
33
|
- README.txt
|
30
34
|
- LICENSE.txt
|
31
35
|
- lib/jmx
|
36
|
+
- lib/jmx.rb
|
37
|
+
- lib/rmi.rb
|
32
38
|
- lib/jmx/dynamic_mbean.rb
|
33
39
|
- lib/jmx/server.rb
|
34
40
|
- lib/jmx/version.rb
|
35
|
-
- lib/jmx.rb
|
36
|
-
- lib/rmi.rb
|
37
41
|
- samples/memory.rb
|
38
42
|
- test/jmx_attribute_test.rb
|
39
43
|
- test/jmx_client_test.rb
|
44
|
+
- test/jmx_notification_test.rb
|
40
45
|
- test/jmx_server_test.rb
|
41
|
-
|
42
|
-
homepage: http://jruby-extras.rubyforge.org/jmx
|
43
|
-
post_install_message:
|
44
|
-
rdoc_options:
|
45
|
-
- --main
|
46
|
-
- README.txt
|
47
|
-
require_paths:
|
48
|
-
- lib
|
49
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: "0"
|
54
|
-
version:
|
46
|
+
- test/object_name_test.rb
|
55
47
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
56
48
|
requirements:
|
57
|
-
- -
|
49
|
+
- - '>='
|
58
50
|
- !ruby/object:Gem::Version
|
59
51
|
version: "0"
|
60
52
|
version:
|
53
|
+
extensions: []
|
54
|
+
|
55
|
+
rubygems_version: 1.3.1
|
61
56
|
requirements: []
|
62
57
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
summary: Package for interacting/creating Java Management Extensions
|
58
|
+
authors:
|
59
|
+
- Thomas Enebo
|
60
|
+
date: 2008-11-21 05:00:00 +00:00
|
61
|
+
platform: ruby
|
68
62
|
test_files: []
|
69
63
|
|
64
|
+
version: !ruby/object:Gem::Version
|
65
|
+
version: "0.3"
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
dependencies: []
|
69
|
+
|
70
|
+
bindir: bin
|
71
|
+
has_rdoc: true
|