Guest User

Untitled

a guest
Apr 16th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.58 KB | None | 0 0
  1. include Java
  2.  
  3. import javax.management.DynamicMBean
  4. import javax.management.MBeanInfo
  5. import javax.management.ObjectName
  6. import javax.management.remote.JMXServiceURL
  7. import javax.management.remote.JMXConnectorServerFactory
  8.  
  9. module JMX
  10. class MBeanServerConnector
  11. def initialize(location, server)
  12. @url = JMXServiceURL.new location
  13. @server = JMXConnectorServerFactory.newJMXConnectorServer @url, nil, server.server
  14.  
  15. if block_given?
  16. start; yield; stop
  17. end
  18. end
  19.  
  20. def active?; @server.isActive; end
  21. def start; @server.start; end
  22. def stop; @server.stop if active?; end
  23. end
  24.  
  25. # Represents both MBeanServer and MBeanServerConnection
  26. class MBeanServer
  27. import javax.management.remote.JMXConnectorFactory
  28. import javax.management.MBeanServerFactory
  29. import javax.management.Attribute
  30.  
  31. attr_accessor :server
  32. @@classes = {}
  33.  
  34. def initialize(location=nil, username=nil, password=nil)
  35. if (location)
  36. url = JMXServiceURL.new location
  37. if (username)
  38. credentials = java.lang.String[2].new
  39. credentials[0], credentials[1] = username, password
  40. env = {"jmx.remote.credentials" => credentials}
  41. else
  42. env = nil
  43. end
  44. @server =JMXConnectorFactory.connect(url, env).getMBeanServerConnection
  45. else
  46. @server = MBeanServerFactory.createMBeanServer
  47. end
  48. end
  49.  
  50. def get_mbean(object_name)
  51. name = ObjectName.new object_name
  52.  
  53. raise NoSuchBeanError.new("No name: #{object_name}") unless @server.isRegistered(name)
  54. @server.getObjectInstance name
  55. generate_proxy(name)
  56. end
  57.  
  58. def create_mbean(class_name, object_name)
  59. name = ObjectName.new object_name
  60. @server.createMBean class_name, name, nil, nil
  61. generate_proxy(name)
  62. end
  63.  
  64. def default_domain; @server.getDefaultDomain; end
  65. def domains; @server.domains; end
  66. def mbean_count; @server.getMBeanCount; end
  67.  
  68. def query_names(name=nil, query=nil)
  69. name = ObjectName.new name
  70. @server.queryNames(name, query)
  71. end
  72.  
  73. def register_mbean(object, object_name)
  74. name = ObjectName.new object_name
  75.  
  76. @server.registerMBean(object, name)
  77. generate_proxy(name)
  78. end
  79.  
  80. def generate_proxy(object_name)
  81. info = @server.getMBeanInfo object_name
  82. class_name = info.className
  83.  
  84. return @@classes[class_name].new if @@classes[class_name]
  85.  
  86. # Make local so closure capturage.
  87. server = @server
  88. proxy = Class.new
  89.  
  90. # Attributes are supported using aref/aset syntax
  91. proxy.class_eval do
  92. define_method(:[]) do |name|
  93. server.getAttribute object_name, name
  94. end
  95.  
  96. define_method(:[]=) do |name, value|
  97. server.setAttribute object_name, Attribute.new(attr.name, value)
  98. end
  99. end
  100.  
  101. # Operations get method names (collision potential)
  102. info.operations.each do |op|
  103. proxy.class_eval do
  104. define_method(op.name) do |*args|
  105. args_array = JMX::MBeanServer.args_array(args)
  106. signature_array = JMX::MBeanServer.signature_array(args_array)
  107. server.invoke object_name, op.name, args_array, signature_array
  108. end
  109. end
  110. end
  111.  
  112. # Add notification listener methods
  113. proxy.class_eval do
  114. define_method(:add_notification_listener) do |listener,*rest|
  115. filter, handback = *rest
  116. server.addNotificationListener object_name, listener, filter, handback
  117. end
  118.  
  119. define_method(:remove_notification_listener) do |listener|
  120. server.removeNotificationListener object_name, listener
  121. end
  122.  
  123. define_method(:method_missing) do |method_name, *args|
  124. args_array = JMX::MBeanServer.args_array(args)
  125. signature_array = JMX::MBeanServer.signature_array(args_array)
  126. server.invoke object_name, method_name.to_s, args_array, signature_array
  127. end
  128. end
  129.  
  130. @@classes[info.className] = proxy
  131.  
  132. proxy.new
  133. end
  134.  
  135. class << self
  136. def args_array(params)
  137. return nil if params.nil?
  138.  
  139. array = java.lang.String[params.length].new
  140. params.each_with_index { |parm, i| array[i] = parm }
  141.  
  142. array
  143. end
  144.  
  145. def signature_array(params)
  146. return nil if params.nil?
  147.  
  148. array = java.lang.String[params.length].new
  149. params.each_with_index do |parm, i|
  150. array[i] = Java.ruby_to_java(parm).java_class.name
  151. end
  152. array
  153. end
  154. end
  155. end
  156.  
  157. class NoSuchBeanError < RuntimeError
  158. end
  159. end
  160.  
  161. class RubyDynamicMBean
  162. include DynamicMBean
  163.  
  164. def initialize(name, description)
  165. @info = MBeanInfo.new name, description, nil, nil, nil, nil
  166. @name, @description = name, description
  167. end
  168.  
  169. def getAttribute(attribute); $stderr.puts "getAttribute"; end
  170. def getAttributes(attributes); $stderr.puts "getAttributes"; end
  171. def getMBeanInfo; $stderr.puts "getMBeanInfo"; @info; end
  172. def invoke(actionName, params=nil, signature=nil);
  173. send(actionName, *params)
  174. end
  175. def setAttribute(attribute); $stderr.puts "setAttribute"; end
  176. def setAttributes(attributes); $stderr.puts "setAttributes"; end
  177. def to_s; "#@name: #@description"; end
  178. def inspect; "#@name: #@description"; end
  179. def toString; "#@name: #@description"; end
  180. end
  181. ##### Above was jmx.rb
  182.  
  183. url = "service:jmx:rmi:///jndi/rmi://localhost:8686/jmxrmi"
  184. server = JMX::MBeanServer.new url, "admin", "adminadmin"
  185. listener = server.get_mbean "java.lang:type=MemoryPool,name=Perm Gen"
  186.  
  187. def perm_gen_usage(mbean)
  188. mbean['Usage'].to_s =~ /committed=(\d+),\s+init=(\d+),\s+max=(\d+),\s+used=(\d+)/
  189. [$1, $2, $3, $4]
  190. end
  191.  
  192. puts "[committed, init, max, used] = #{perm_gen_usage(listener).join(", ")}"
Add Comment
Please, Sign In to add comment