Dear all Catalina ant task <jmx:set> sets only one mbean attribute My improvement proposes to set several attributes by using <jmx:attribute> sun-elements The MBeanServer.setAttributes(ObjectName name,AttributeList attributes) method is used instead of the MBeanServer.setAttribute(ObjectName name,Attribute attribute) method
Modified files are in attachment and modified and new code lines are bracketed between // ADDED comments My ICLA is signed and I'm a contributor of Felix (Apache incubated project). Kind regards Didier PS: I hope to post this mail to the right mailing list ! I did not seen Tomcat in https://issues.apache.org/jira/secure/BrowseProject.jspa -- --------------------------------------------------------- Didier DONSEZ Laboratoire LSR, Institut Imag, Universite Joseph Fourier Bat. C, 220 rue de la Chimie, Domaine Universitaire BP 53, 38041 Grenoble Cedex 9, France GPS : lat 45°11'38.3"N, lon 05°46'14.7"E, alt 223m http://www-adele.imag.fr/users/Didier.Donsez/map/map.html Tel : +33 4 76 63 55 49 Fax : +33 4 76 63 55 50 mailto:[EMAIL PROTECTED] URL: http://www-adele.imag.fr/users/Didier.Donsez ---------------------------------------------------------
/* * Copyright 2002,2004-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.ant.jmx; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.management.Attribute; import javax.management.AttributeList; import javax.management.MBeanAttributeInfo; import javax.management.MBeanInfo; import javax.management.MBeanServerConnection; import javax.management.ObjectName; import org.apache.tools.ant.BuildException; /** * Access <em>JMX</em> JSR 160 MBeans Server. * <ul> * <li>Set Mbeans attributes</li> * </ul> * <p> * Examples: * Set a Mbean Manager attribute maxActiveSessions. * Set this attribute with fresh jmx connection without save reference * <pre> * <jmx:set * host="127.0.0.1" * port="9014" * ref="" * name="Catalina:type=Manager,path="/ClusterTest",host=localhost" * attribute="maxActiveSessions" * value="100" * type="int" * echo="false"> * /> * </pre> * * or * * <pre> * <jmx:set * host="127.0.0.1" * port="9014" * ref="" * name="Catalina:type=Manager,path="/ClusterTest",host=localhost" * echo="false"> * > * * <jmx:attribute name="maxActiveSessions" * value="100" * type="int"/> * <jmx:attribute name="minActiveSessions" * value="10" * type="int"/> * </jmx:set> * * </pre> * </p> * <p> * First call to a remote MBeanserver save the JMXConnection a referenz <em>jmx.server</em> * </p> * These tasks require Ant 1.6 or later interface. * * @author Peter Rossbach * @contributor Didier Donsez (add <attributes name='...' value='...' type='...'> * @version $Revision: 304089 $ $Date: 2005-09-14 09:28:29 -0400 (Wed, 14 Sep 2005) $ * @since 5.5.10 */ public class JMXAccessorSetTask extends JMXAccessorTask { // ----------------------------------------------------- Instance Variables private String attribute; private String value; private String type; private boolean convert = false ; // ADDED BEGIN private List attributes=new ArrayList(); // ADDED END // ----------------------------------------------------- Instance Info /** * Descriptive information describing this implementation. */ private static final String info = "org.apache.catalina.ant.JMXAccessorSetTask/1.0"; /** * Return descriptive information about this implementation and the * corresponding version number, in the format * <code><description>/<version></code>. */ public String getInfo() { return (info); } // ------------------------------------------------------------- Properties // ADDED BEGIN public void addAttribute(org.apache.catalina.ant.jmx.Attribute attribute) { attributes.add(attribute); } public List getAttributes() { return attributes; } // ADDED END /** * @return Returns the attribute. */ public String getAttribute() { return attribute; } /** * @param attribute The attribute to set. */ public void setAttribute(String attribute) { this.attribute = attribute; } /** * @return Returns the value. */ public String getValue() { return value; } /** * @param value The value to set. */ public void setValue(String value) { this.value = value; } /** * @return Returns the type. */ public String getType() { return type; } /** * @param valueType The type to set. */ public void setType(String valueType) { this.type = valueType; } /** * @return Returns the convert. */ public boolean isConvert() { return convert; } /** * @param convert The convert to set. */ public void setConvert(boolean convert) { this.convert = convert; } // ------------------------------------------------------ protected Methods /** * Execute the specified command, based on the configured properties. The * input stream will be closed upon completion of this task, whether it was * executed successfully or not. * * @exception Exception * if an error occurs */ public String jmxExecute(MBeanServerConnection jmxServerConnection) throws Exception { if (getName() == null) { throw new BuildException("Must specify a 'name'"); } // ADDED BEGIN if ((attribute == null || value == null) && attributes.isEmpty()) { throw new BuildException( "Must specify a 'attribute' and 'value' or 'attribute' elements for set "); } if (attributes.isEmpty()) { return jmxSet(jmxServerConnection, getName()); } else { if ((attribute != null && value != null)) { org.apache.catalina.ant.jmx.Attribute a=new org.apache.catalina.ant.jmx.Attribute(); a.setName(attribute); a.setValue(value); a.setType(type); attributes.add(a); } return jmxMultiSet(jmxServerConnection, getName()); } // ADDED END } /** * @param jmxServerConnection * @param name * @throws Exception */ protected String jmxSet(MBeanServerConnection jmxServerConnection, String name) throws Exception { Object realValue; if (type != null) { realValue = convertStringToType(value, type); } else { if (isConvert()) { String mType = getMBeanAttributeType(jmxServerConnection, name, attribute); realValue = convertStringToType(value, mType); } else realValue = value; } jmxServerConnection.setAttribute(new ObjectName(name), new Attribute( attribute, realValue)); return null; } // ADDED BEGIN /** * set several attributes in one invocation to the server * @param jmxServerConnection * @param name * @throws Exception */ protected String jmxMultiSet(MBeanServerConnection jmxServerConnection, String name) throws Exception { AttributeList attributeList=new AttributeList(); MBeanInfo minfo=null; for (Iterator iter = attributes.iterator(); iter.hasNext();) { org.apache.catalina.ant.jmx.Attribute element = (org.apache.catalina.ant.jmx.Attribute) iter.next(); Object realValue; if (element.getType() != null) { realValue = convertStringToType(element.getValue(), element.getType()); } else { if (isConvert()) { if(minfo==null) minfo = getMBeanInfo(jmxServerConnection, name); String mType = getMBeanAttributeType(minfo, element.getName()); realValue = convertStringToType(element.getValue(), mType); } else realValue = element.getValue(); } Attribute a=new Attribute(element.getName(), realValue); attributeList.add(a); } AttributeList settedAttributes=jmxServerConnection.setAttributes(new ObjectName(name),attributeList); if(isEcho()) if(settedAttributes.isEmpty()){ getProject().log("No setted attributes!"); } else { StringBuffer sb=new StringBuffer(); sb.append("Attributes"); for (Iterator iter = settedAttributes.iterator(); iter .hasNext();) { Attribute element = (Attribute) iter.next(); sb.append(' ').append(element.getName()); } sb.append(" were setted"); getProject().log(sb.toString()); } return null; } // ADDED END // ADDED BEGIN /** * Get MBean Attribute from the MBeanInfo * @param minfo * @param attribute * @return The type * @throws Exception */ protected String getMBeanAttributeType( MBeanInfo minfo, String attribute) throws Exception { String mattrType = null; MBeanAttributeInfo attrs[] = minfo.getAttributes(); if (attrs != null) { for (int i = 0; mattrType == null && i < attrs.length; i++) { if (attribute.equals(attrs[i].getName())) mattrType = attrs[i].getType(); } } return mattrType; } /** * Get the MBeanInfo from Mbean Server * @param jmxServerConnection * @param name * @return The mbean info * @throws Exception */ protected MBeanInfo getMBeanInfo( MBeanServerConnection jmxServerConnection, String name) throws Exception { ObjectName oname = new ObjectName(name); MBeanInfo minfo = jmxServerConnection.getMBeanInfo(oname); return minfo; } // ADDED END /** * Get MBean Attriute from Mbean Server * @param jmxServerConnection * @param name * @param attribute * @return The type * @throws Exception */ protected String getMBeanAttributeType( MBeanServerConnection jmxServerConnection, String name, String attribute) throws Exception { ObjectName oname = new ObjectName(name); String mattrType = null; MBeanInfo minfo = jmxServerConnection.getMBeanInfo(oname); MBeanAttributeInfo attrs[] = minfo.getAttributes(); if (attrs != null) { for (int i = 0; mattrType == null && i < attrs.length; i++) { if (attribute.equals(attrs[i].getName())) mattrType = attrs[i].getType(); } } return mattrType; } }
<!-- Copy your catalina-ant.jar from $CATALINA_HOME/server/lib to $ANT_HOME/lib --> <project name="jmx.query" xmlns:jmx="antlib:org.apache.catalina.ant.jmx" default="all" basedir="." > <!-- Author : Didier Donsez --> <description>Example of ANT JMX</description> <property name="jmx.serviceurl" value="service:jmx:rmi:///jndi/rmi://localhost:9999/server"/> <property name="jmx.host" value="localhost"/> <property name="jmx.port" value="9999"/> <property name="jmx.username" value=""/> <property name="jmx.password" value=""/> <target name="all" depends="open,query,get,set,invoke"/> <target name="open" depends="open-url"/> <target name="open-serverport" description="Open the JSR160 connection" unless="jmx.serviceurl" > <jmx:open host="${jmx.host}" port="${jmx.port}" username="${jmx.username}" password="${jmx.password}" ref="my.jmx.server" /> </target> <target name="open-url" description="Open the JSR160 coonection" if="jmx.serviceurl" > <jmx:open url="${jmx.serviceurl}" username="${jmx.username}" password="${jmx.password}" ref="my.jmx.server" /> </target> <!-- Query MBean list --> <target name="query" depends="open" description="Example to get all MBeans from a server and store inside an external xml property file"> <jmx:query ref="my.jmx.server" name="*:*" resultproperty="mbeans" attributebinding="false" /> <echo message="Number of MBeans in server ${jmx.serviceurl} is ${mbeans.Length}"/> <echoproperties destfile="mbeans.properties" prefix="mbeans." format="xml" /> <echoproperties prefix="mbeans." /> </target> <!-- Test Get --> <target name="get" depends="open"> <jmx:get ref="my.jmx.server" name="java.lang:type=Memory" attribute="Verbose" resultproperty="mbeans" delimiter=" " echo="true" /> </target> <!-- Test Set --> <target name="set" depends="open"> <echo message="Set java.lang:type=Memory"/> <jmx:set ref="my.jmx.server" name="java.lang:type=Memory" attribute="Verbose" value="true" type="boolean" echo="true" > </jmx:set> <sleep seconds="20"/> <echo message="Set java.lang:type=Memory"/> <jmx:set ref="my.jmx.server" name="java.lang:type=Memory" echo="true" > <attribute name="Verbose" value="false" type="boolean"/> </jmx:set> <echo message="Set java.lang:type=Threading"/> <jmx:set ref="my.jmx.server" name="java.lang:type=Threading" echo="true" > <attribute name="ThreadContentionMonitoringEnabled" value="true" type="boolean"/> <attribute name="ThreadCpuTimeEnabled" value="false" type="boolean"/> </jmx:set> <sleep seconds="20"/> <echo message="Set java.lang:type=Threading"/> <jmx:set ref="my.jmx.server" name="java.lang:type=Threading" echo="true" > <attribute name="ThreadContentionMonitoringEnabled" value="false" type="boolean"/> <attribute name="ThreadCpuTimeEnabled" value="true" type="boolean"/> </jmx:set> </target> <target name="invoke" depends="open"> <echo message="Invoke"/> <jmx:invoke ref="my.jmx.server" name="java.lang:type=Threading" operation="getThreadUserTime" > <arg value="2" type="long" /> </jmx:invoke> <echo message="Invoke"/> <jmx:invoke ref="my.jmx.server" name="java.lang:type=Memory" operation="gc" > </jmx:invoke> </target> </project>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]