weblogic-jmx4r 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE.txt +202 -0
- data/README.rdoc +45 -0
- data/Rakefile +39 -0
- data/examples/class_loading.rb +16 -0
- data/examples/jvm_mngmt.rb +12 -0
- data/examples/logging.rb +26 -0
- data/examples/memory.rb +21 -0
- data/examples/memory_on_many_nodes.rb +44 -0
- data/examples/memory_types.rb +9 -0
- data/examples/ruby_mbean.rb +41 -0
- data/examples/runtime_sysprops.rb +14 -0
- data/examples/weblogic.rb +127 -0
- data/lib/dynamic_mbean.rb +277 -0
- data/lib/jconsole.rb +75 -0
- data/lib/jdk/jdk4.rb +16 -0
- data/lib/jdk/jdk5.rb +34 -0
- data/lib/jdk/jdk6.rb +69 -0
- data/lib/jdk_helper.rb +69 -0
- data/lib/jmx4r.rb +304 -0
- data/lib/jmx4r/version.rb +3 -0
- data/lib/objectname_helper.rb +21 -0
- data/lib/open_data_helper.rb +50 -0
- data/test/tc_attributes.rb +44 -0
- data/test/tc_auth.rb +70 -0
- data/test/tc_composite_data.rb +77 -0
- data/test/tc_connection.rb +92 -0
- data/test/tc_dynamic_mbean.rb +157 -0
- data/test/tc_methods.rb +30 -0
- data/test/tc_multiple_connections.rb +66 -0
- data/test/ts_all.rb +12 -0
- metadata +81 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright 2008 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
#
|
3
|
+
# This file adds methods to ObjectName proxies
|
4
|
+
require 'java'
|
5
|
+
|
6
|
+
JavaUtilities.extend_proxy('javax.management.ObjectName') do
|
7
|
+
def key?(k)
|
8
|
+
self.contains_key k
|
9
|
+
end
|
10
|
+
alias has_key? key?
|
11
|
+
alias include? key?
|
12
|
+
alias member? key?
|
13
|
+
|
14
|
+
def keys
|
15
|
+
self.get_key_property_list.key_set
|
16
|
+
end
|
17
|
+
|
18
|
+
def [](key)
|
19
|
+
self.get_key_property key
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# Copyright 2007 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
#
|
3
|
+
# This file adds methods to CompositeData proxies so that they can behave like
|
4
|
+
# regular (read-only) Ruby Hash
|
5
|
+
require 'java'
|
6
|
+
|
7
|
+
JavaUtilities.extend_proxy('javax.management.openmbean.CompositeData') do
|
8
|
+
include Enumerable
|
9
|
+
def each
|
10
|
+
self.get_composite_type.key_set.each do |k|
|
11
|
+
yield(k,self.get(k))
|
12
|
+
end
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
def key?(k)
|
17
|
+
self.contains_key k
|
18
|
+
end
|
19
|
+
alias has_key? key?
|
20
|
+
alias include? key?
|
21
|
+
alias member? key?
|
22
|
+
|
23
|
+
def keys
|
24
|
+
self.get_composite_type.key_set
|
25
|
+
end
|
26
|
+
|
27
|
+
def [](key)
|
28
|
+
self.get key
|
29
|
+
end
|
30
|
+
|
31
|
+
def method_missing(name, *args)
|
32
|
+
key = name.to_s.camel_case
|
33
|
+
super unless containsKey(key)
|
34
|
+
get(name.to_s.camel_case)
|
35
|
+
end
|
36
|
+
|
37
|
+
def respond_to?(symbol, include_private = false)
|
38
|
+
containsKey(symbol.to_s.camel_case) || super
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
JavaUtilities.extend_proxy('javax.management.openmbean.TabularData') do
|
43
|
+
include Enumerable
|
44
|
+
def each
|
45
|
+
self.values.each do |value|
|
46
|
+
yield value
|
47
|
+
end
|
48
|
+
self
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Copyright 2007 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "jmx4r"
|
6
|
+
require "jconsole"
|
7
|
+
|
8
|
+
class TestAttribute < Test::Unit::TestCase
|
9
|
+
import java.lang.management.ManagementFactory
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@memory = JMX::MBean.find_by_name "java.lang:type=Memory", :connection => ManagementFactory.platform_mbean_server
|
13
|
+
end
|
14
|
+
|
15
|
+
def teardown
|
16
|
+
JMX::MBean.remove_connection
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_unknwown_attribute
|
20
|
+
assert_raise(NoMethodError) { @memory.unknown_attribute }
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_readable_attribute
|
24
|
+
assert_equal false, @memory.verbose
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_writable_attribute
|
28
|
+
assert_equal false, @memory.verbose
|
29
|
+
@memory.verbose = true
|
30
|
+
assert_equal true, @memory.verbose
|
31
|
+
@memory.verbose = false
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_non_writable_attribute
|
35
|
+
assert_raise(NoMethodError) { @memory.object_pending_finalization_count = -1 }
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_non_overlapping_attributes
|
39
|
+
assert_raise(NoMethodError) { @memory.logger_names }
|
40
|
+
logging = JMX::MBean.find_by_name "java.util.logging:type=Logging", :connection => ManagementFactory.platform_mbean_server
|
41
|
+
assert_raise(NoMethodError) { logging.verbose }
|
42
|
+
assert_raise(NoMethodError) { @memory.logger_names }
|
43
|
+
end
|
44
|
+
end
|
data/test/tc_auth.rb
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
# Copyright 2007 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "jmx4r"
|
6
|
+
require "jconsole"
|
7
|
+
|
8
|
+
class TestAuthentication < Test::Unit::TestCase
|
9
|
+
import java.lang.SecurityException
|
10
|
+
|
11
|
+
def setup
|
12
|
+
@username = "jmx4r.user"
|
13
|
+
@password = "jmx4r.password"
|
14
|
+
|
15
|
+
pwd_path = "/tmp/jmx4r.password"
|
16
|
+
@pwd_file = File.new(pwd_path, "w")
|
17
|
+
@pwd_file.puts "#{@username} #{@password}"
|
18
|
+
@pwd_file.close
|
19
|
+
|
20
|
+
# pwd file must be readable only by user
|
21
|
+
# but somehow File.chmod is not working
|
22
|
+
# with JRuby
|
23
|
+
`chmod 0600 #{@pwd_file.path}`
|
24
|
+
|
25
|
+
access_path = "/tmp/jmx4r.access"
|
26
|
+
@access_file = File.new(access_path, "w")
|
27
|
+
@access_file.puts "#{@username} readwrite"
|
28
|
+
@access_file.close
|
29
|
+
# access file must be readable only by user
|
30
|
+
`chmod 0600 #{@access_file.path}`
|
31
|
+
|
32
|
+
JConsole::start :pwd_file => @pwd_file.path, :access_file => @access_file.path
|
33
|
+
end
|
34
|
+
|
35
|
+
def teardown
|
36
|
+
JMX::MBean.remove_connection
|
37
|
+
JConsole::stop
|
38
|
+
File.delete @pwd_file.path if File.file? @pwd_file.path
|
39
|
+
File.delete @access_file.path if File.file? @access_file.path
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_establish_auth_connection_with_correct_credentials
|
43
|
+
JMX::MBean.establish_connection :username => @username, :password => @password
|
44
|
+
end
|
45
|
+
|
46
|
+
# test that using the :credentials key to pass the username/password
|
47
|
+
# credentials is working the same way than passing :username/:password
|
48
|
+
def test_establish_auth_connection_with_custom_credentials
|
49
|
+
credentials = [@username, @password].to_java(:String)
|
50
|
+
JMX::MBean.establish_connection :credentials => credentials
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_establish_auth_connection_with_invalid_username
|
54
|
+
assert_raise(SecurityException) {
|
55
|
+
JMX::MBean.establish_connection :username => "invalid user name", :password => @password
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_establish_auth_connection_with_invalid_password
|
60
|
+
assert_raise(SecurityException) {
|
61
|
+
JMX::MBean.establish_connection :username => @username, :password => "invalid password"
|
62
|
+
}
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_establish_auth_connection_with_no_credentials
|
66
|
+
assert_raise(SecurityException) {
|
67
|
+
JMX::MBean.establish_connection
|
68
|
+
}
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# Copyright 2007 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "jmx4r"
|
6
|
+
require "jconsole"
|
7
|
+
|
8
|
+
class TestCompositeData < Test::Unit::TestCase
|
9
|
+
import java.lang.management.ManagementFactory
|
10
|
+
import javax.management.openmbean.InvalidKeyException
|
11
|
+
|
12
|
+
def setup
|
13
|
+
memory = JMX::MBean.find_by_name "java.lang:type=Memory", :connection => ManagementFactory.platform_mbean_server
|
14
|
+
# heap_memory_usage is a CompositeData
|
15
|
+
@heap = memory.heap_memory_usage
|
16
|
+
end
|
17
|
+
|
18
|
+
def teardown
|
19
|
+
@heap = nil
|
20
|
+
JMX::MBean.remove_connection
|
21
|
+
end
|
22
|
+
|
23
|
+
# use #map to check that CompositeData includes Enumerable
|
24
|
+
def test_enumerable_composite_data
|
25
|
+
expected_headers = ["init", "committed", "used", "max"].sort
|
26
|
+
headers = @heap.map { |k, v| k }.sort
|
27
|
+
assert_equal expected_headers, headers
|
28
|
+
end
|
29
|
+
|
30
|
+
def test_composite_data_keys
|
31
|
+
expected_headers = ["init", "committed", "used", "max"].sort
|
32
|
+
headers = @heap.keys.sort
|
33
|
+
assert_equal expected_headers, headers
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_composite_data_key_aliases
|
37
|
+
assert @heap.key?("used")
|
38
|
+
assert @heap.has_key?("used")
|
39
|
+
assert @heap.include?("used")
|
40
|
+
assert @heap.member?("used")
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_composite_data_method_missing
|
44
|
+
assert @heap.used
|
45
|
+
|
46
|
+
def @heap.containsKey(key)
|
47
|
+
"camelCaseAttributeName" == key
|
48
|
+
end
|
49
|
+
|
50
|
+
def @heap.get(key)
|
51
|
+
return "value" if "camelCaseAttributeName" == key
|
52
|
+
raise("should not happen")
|
53
|
+
end
|
54
|
+
|
55
|
+
assert_equal "value", @heap.camel_case_attribute_name
|
56
|
+
|
57
|
+
assert_raises NoMethodError do
|
58
|
+
@heap.unknown_attribute
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_composite_data_as_hash
|
63
|
+
used = @heap.get "used"
|
64
|
+
used_from_hash = @heap["used"]
|
65
|
+
assert_equal used, used_from_hash
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_composite_data_as_hash_with_known_key
|
69
|
+
assert_equal true, @heap.key?("used")
|
70
|
+
used = @heap["used"]
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_composite_data_as_hash_with_unknown_key
|
74
|
+
assert_equal false, @heap.key?("unknown")
|
75
|
+
assert_raise(InvalidKeyException) { @heap["unknown"] }
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# Copyright 2007 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
|
5
|
+
require "jmx4r"
|
6
|
+
require "jconsole"
|
7
|
+
|
8
|
+
class TestConnection < Test::Unit::TestCase
|
9
|
+
import java.io.IOException
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
JMX::MBean.remove_connection
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_establish_connection_with_bad_port
|
16
|
+
assert_raise(IOException) {
|
17
|
+
JMX::MBean.establish_connection :port => 9999
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_establish_connection_with_bad_host
|
22
|
+
assert_raise(IOException) {
|
23
|
+
JMX::MBean.establish_connection :host => "not a valid host"
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_establish_connection
|
28
|
+
begin
|
29
|
+
JConsole::start
|
30
|
+
connection = JMX::MBean.establish_connection
|
31
|
+
assert(connection.getMBeanCount > 0)
|
32
|
+
ensure
|
33
|
+
JConsole::stop
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_remove_connection
|
38
|
+
begin
|
39
|
+
JConsole::start
|
40
|
+
connection = JMX::MBean.establish_connection
|
41
|
+
JMX::MBean.remove_connection
|
42
|
+
assert_raise(IOException) {
|
43
|
+
connection.getMBeanCount
|
44
|
+
}
|
45
|
+
ensure
|
46
|
+
JConsole::stop
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_establish_connection_with_custom_port
|
51
|
+
begin
|
52
|
+
JConsole::start :port => 3001
|
53
|
+
JMX::MBean.establish_connection :port => 3001
|
54
|
+
ensure
|
55
|
+
JConsole::stop 3001
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_establish_connection_with_custom_url
|
60
|
+
begin
|
61
|
+
JConsole::start :port => 3001
|
62
|
+
url = "service:jmx:rmi:///jndi/rmi://localhost:3001/jmxrmi"
|
63
|
+
JMX::MBean.establish_connection :url => url
|
64
|
+
ensure
|
65
|
+
JConsole::stop 3001
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_establish_connection_with_custom_url_overrides_host_and_port
|
70
|
+
begin
|
71
|
+
JConsole::start :port => 3001
|
72
|
+
good_url = "service:jmx:rmi:///jndi/rmi://localhost:3001/jmxrmi"
|
73
|
+
bad_port = 3000
|
74
|
+
# specifying a :url discards the :port & :host parameters
|
75
|
+
JMX::MBean.establish_connection :port => bad_port, :url => good_url
|
76
|
+
ensure
|
77
|
+
JConsole::stop 3001
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def test_establish_connection_local
|
82
|
+
begin
|
83
|
+
JConsole::start :port => 0
|
84
|
+
connection = JMX::MBean.establish_connection \
|
85
|
+
:command => /jconsole/i
|
86
|
+
assert(connection.getMBeanCount > 0)
|
87
|
+
ensure
|
88
|
+
JConsole::stop 0
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
# Copyright 2008 Jeff Mesnil (http://jmesnil.net)
|
2
|
+
|
3
|
+
require "test/unit"
|
4
|
+
require "jmx4r"
|
5
|
+
|
6
|
+
|
7
|
+
class TestDynamicMBean < Test::Unit::TestCase
|
8
|
+
|
9
|
+
import java.lang.management.ManagementFactory
|
10
|
+
import javax.management.ObjectName
|
11
|
+
import javax.management.Attribute
|
12
|
+
|
13
|
+
class AttributeTypesMBean < JMX::DynamicMBean
|
14
|
+
rw_attribute :string_attr, :string, "a String attribute"
|
15
|
+
rw_attribute :byte_attr, :byte, "a Byte attribute"
|
16
|
+
rw_attribute :int_attr, :int, "a Integer attribute"
|
17
|
+
rw_attribute :long_attr, :long, "a Long attribute"
|
18
|
+
rw_attribute :float_attr, :float, "a Float attribute"
|
19
|
+
rw_attribute :double_attr, :double, "a Double attribute"
|
20
|
+
rw_attribute :list_attr, :list, "a List attribute"
|
21
|
+
rw_attribute :map_attr, :map, "a Map attribute"
|
22
|
+
rw_attribute :set_attr, :set, "a Set attribute"
|
23
|
+
rw_attribute :boolean_attr, :boolean, "a Boolean attribute"
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_attribute_types
|
27
|
+
mbean = AttributeTypesMBean.new
|
28
|
+
object_name = ObjectName.new "jmx4r:name=AttributeTypesMBean"
|
29
|
+
mbean_server = ManagementFactory.platform_mbean_server
|
30
|
+
mbean_server.register_mbean mbean, object_name
|
31
|
+
|
32
|
+
mbean = JMX::MBean.find_by_name object_name.to_s, :connection => mbean_server
|
33
|
+
mbean.string_attr = "test"
|
34
|
+
assert_equal("test", mbean.string_attr)
|
35
|
+
|
36
|
+
mbean.byte_attr = 9
|
37
|
+
assert_equal(9, mbean.byte_attr)
|
38
|
+
|
39
|
+
mbean.int_attr = 23
|
40
|
+
assert_equal(23, mbean.int_attr)
|
41
|
+
|
42
|
+
mbean.long_attr = 33
|
43
|
+
assert_equal(33, mbean.long_attr)
|
44
|
+
|
45
|
+
mbean.float_attr = 91.0
|
46
|
+
assert_equal(91.0, mbean.float_attr)
|
47
|
+
|
48
|
+
mbean.float_attr = 7.0
|
49
|
+
assert_equal(7.0, mbean.float_attr)
|
50
|
+
|
51
|
+
mbean.list_attr = [1, 2, 3]
|
52
|
+
assert_equal([1, 2, 3], mbean.list_attr.to_a)
|
53
|
+
|
54
|
+
mbean.set_attr = [1, 2, 3]
|
55
|
+
assert_equal([1, 2, 3].sort, mbean.list_attr.to_a.sort)
|
56
|
+
|
57
|
+
mbean.map_attr = { "a" => 1, "b" => 2}
|
58
|
+
assert_equal({ "a" => 1, "b" => 2}.to_a.sort, mbean.map_attr.to_a.sort)
|
59
|
+
|
60
|
+
mbean.boolean_attr = true
|
61
|
+
assert_equal(true, mbean.boolean_attr)
|
62
|
+
|
63
|
+
mbean_server.unregister_mbean object_name
|
64
|
+
end
|
65
|
+
|
66
|
+
class OperationInvocationMBean < JMX::DynamicMBean
|
67
|
+
operation "reverse the string passed in parameter"
|
68
|
+
parameter :string, "arg", "a String to reverse"
|
69
|
+
returns :string
|
70
|
+
def reverse(arg)
|
71
|
+
arg.reverse
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_operation_invocation
|
76
|
+
mbean = OperationInvocationMBean.new
|
77
|
+
object_name = ObjectName.new "jmx4r:name=OperationInvocationMBean"
|
78
|
+
mbean_server = ManagementFactory.platform_mbean_server
|
79
|
+
mbean_server.register_mbean mbean, object_name
|
80
|
+
|
81
|
+
mbean = JMX::MBean.find_by_name object_name.to_s, :connection => mbean_server
|
82
|
+
assert_equal("oof", mbean.reverse("foo"))
|
83
|
+
|
84
|
+
mbean_server.unregister_mbean object_name
|
85
|
+
end
|
86
|
+
|
87
|
+
class Foo < JMX::DynamicMBean
|
88
|
+
rw_attribute :foo_attr, :string
|
89
|
+
|
90
|
+
operation
|
91
|
+
parameter :string
|
92
|
+
returns :string
|
93
|
+
def foo(arg)
|
94
|
+
"foo #{arg}"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
class Bar < JMX::DynamicMBean
|
99
|
+
rw_attribute :bar_attr, :string
|
100
|
+
|
101
|
+
operation
|
102
|
+
parameter :string
|
103
|
+
returns :string
|
104
|
+
def bar(arg)
|
105
|
+
"bar #{arg}"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_separate_dynamic_beans_have_separate_operations_and_attributes
|
110
|
+
mbean_server = ManagementFactory.platform_mbean_server
|
111
|
+
foo_object_name = ObjectName.new "jmx4r:name=foo"
|
112
|
+
bar_object_name = ObjectName.new "jmx4r:name=bar"
|
113
|
+
mbean_server.register_mbean Foo.new, foo_object_name
|
114
|
+
mbean_server.register_mbean Bar.new, bar_object_name
|
115
|
+
|
116
|
+
foo_mbean = JMX::MBean.find_by_name foo_object_name.to_s, :connection => mbean_server
|
117
|
+
assert_equal "foo test", foo_mbean.foo("test")
|
118
|
+
assert_raise(NoMethodError){
|
119
|
+
foo_mbean.bar("test")
|
120
|
+
}
|
121
|
+
foo_mbean.foo_attr = "test"
|
122
|
+
assert_equal "test", foo_mbean.foo_attr
|
123
|
+
assert_raise(NoMethodError){
|
124
|
+
foo_mbean.bar_attr = "test"
|
125
|
+
}
|
126
|
+
bar_mbean = JMX::MBean.find_by_name bar_object_name.to_s, :connection => mbean_server
|
127
|
+
assert_equal "bar test", bar_mbean.bar("test")
|
128
|
+
assert_raise(NoMethodError) {
|
129
|
+
bar_mbean.foo("test")
|
130
|
+
}
|
131
|
+
bar_mbean.bar_attr = "test"
|
132
|
+
assert_equal "test", bar_mbean.bar_attr
|
133
|
+
assert_raise(NoMethodError){
|
134
|
+
bar_mbean.foo_attr = "test"
|
135
|
+
}
|
136
|
+
|
137
|
+
mbean_server.unregister_mbean foo_object_name
|
138
|
+
mbean_server.unregister_mbean bar_object_name
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_get_attributes
|
142
|
+
foo = Foo.new
|
143
|
+
foo.foo_attr = "value"
|
144
|
+
|
145
|
+
object_name = ObjectName.new "jmx4r:name=baz"
|
146
|
+
mbean_server = ManagementFactory.platform_mbean_server
|
147
|
+
mbean_server.register_mbean foo, object_name
|
148
|
+
|
149
|
+
foo_mbean = JMX::MBean.find_by_name object_name.to_s, :connection => mbean_server
|
150
|
+
attrs = mbean_server.get_attributes object_name, ["foo_attr"].to_java(:string)
|
151
|
+
assert attrs[0].kind_of? Attribute
|
152
|
+
assert_equal foo.foo_attr, attrs[0].value
|
153
|
+
|
154
|
+
mbean_server.unregister_mbean object_name
|
155
|
+
|
156
|
+
end
|
157
|
+
end
|