Archive for the ‘java’ Category
jmx4r 0.0.5 has just been released (jmx4r is a JRuby library which makes it super easy to write simple Ruby scripts to manage Java applications using JMX).
There is only one enhancement to this release but it is an important one: you can now specify a custom JMX URL to connect to a MBean Server.
Before this release, the URL was hard-wired to connect using the JMX URL defined by Sun service:jmx:rmi:///jndi/rmi://#{host}:#{port}/jmxrmi.
This means it was not possible to use jmx4r to connect to a MBean server which used another URL or another connector that RMI/JRMP.
With this release, you can now fully specify the url:
url = "service:jmx:rmi:///jndi/iiop://node1:7001/weblogic.management.mbeanservers.runtime"
JMX::MBean.establish_connection :url => url
As an example, the code above can be used to connect to a Weblogic server using RMI/IIOP.
When the :url argument is used, :hostand :port arguments are ignored. If you’re connecting to a Sun JRE, it is still simpler to specify only :host & :port though.
This enhancement was proposed by Tim Koopmans. Thanks Tim!
As usual, to get this new release, just update the rubygem:
jruby -S gem install jmx4r
I use Subversion for my daily work (and CVS before that) but I’ve never used a distributed VCS before.
One of my ex-colleagues, Marc, explained to me all the advantages of these systems but I never took the time to play with them.
With all the increasing noise about Git and Mercurial, I’m now curious to learn more about it.
Since I learn better by practicing, I moved one of my little projects, jmx4r, from Subversion to Git and hosted it on GitHub.
I don’t use jmx4r at the moment and I don’t plan to develop it more (less features is the new black). However, if you have requests for a new feature or enhancement (or bugs), do not hesitate to fill an issue on the tracker.
Or better, clone the Git project:
git clone git://github.com/jmesnil/jmx4r.git
and start hacking it!
P.S.:
With the recent release of JRuby 1.1, I also checked that the latest version of jmx4r had no regression.
Congratulation to the JRuby team for the performance boost since version 1.0!
jmx4r 0.0.4 has just been released.
jmx4r is a JRuby library which makes it super easy to write simple Ruby scripts to manage Java applications using JMX.
To get this new release, just update the rubygem: jruby -S gem install jmx4r
All contributions to this new release were done by Skaar:
- CompositeData behave like regular read-only Ruby Hash
- custom classes can be loaded by `require` statements
- custom JMX credentials are supported
(more…)
Something which is not obvious with the way jmx4r leverages JMX API and Ruby metaprogramming is that you can write simple scripts to manage a Java application without any dependency on the MBeans exposed by the application.
For simplicity, in my examples I always use MBeans exposed by the JVM but jmx4r works with any MBean even if its interface is unknown from the JVM running the management scripts.
Here is a simple example to manage Tomcat using jmx4r.
Let’s assume that we have Tomcat running locally and manageable remotely on port 3000 (without authentication):
$ export CATALINA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=3000 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false"
$ ./bin/catalina.sh/run
We want to know among all the Web Modules running in Tomcat which ones are privileged and which ones are not.
The whole script to do so is:
# tomcat_modules.rb
require "rubygems"
require "jmx4r"
JMX::MBean.establish_connection :host => "localhost", :port => 3000
web_modules = JMX::MBean.find_all_by_name "Catalina:j2eeType=WebModule,*"
privileged, unprivileged = web_modules.partition { |m| m.privileged }
puts "Privileged:\n" + privileged.map {|m| m.path }.join("\n ")
puts "Unprivileged:\n " + unprivileged.map {|m| m.path }.join("\n ")
Executing this script gives:
$ jruby tomcat_modules.rb
Privileged:
/balancer
/manager
/host-manager
Unprivileged:
/tomcat-docs
/servlets-examples
/jsp-examples
/webdav
That’s were using JRuby shines: it combines the simplicity of using directly the MBeans exposed by a Java application without having to bother with classes dependency.
Using Java to write a corresponding script means choosing your “poison”:
- No class dependency but tedious (and unnatural) use of MBeanServerConnection methods to interact with Tomcat MBeans
- Use directly Tomcat MBeans (thanks to MBeanServerInvocationHandler) but you must take care having all their interfaces (and dependencies) in the class path of the JVM running the script
I can not thank enough both the JMX and JRuby guys which make it so simple to get the best of both worlds in jmx4r:
- simple to use directly the MBeans API
- simple to deploy without class dependency issues
jmx4r 0.0.3 has just been released.
jmx4r is a JRuby library which makes it super easy to write simple Ruby scripts to manage Java applications using JMX.
Two new features in this release:
- some much-needed documentation
- as requested by Brian McCallister, I’ve modified the code so that it is now possible
to write a script to manage many Java applications at the same time.
For example, the script to trigger a garbage collection on a cluster of Java applications at the same time (quite a bad idea but a simple one):
port = 1090
hosts = ["node1", "node2", "node3", "node4"]
hosts.each do |h|
memory = JMX::MBean.find_by_name "java.lang:type=Memory", :host => h, :port => port
memory.gc
end
Quite simple, isn’t it?
(more…)