dev@glassfish.java.net

Re: MBean operation not supported

From: kedar <Kedar.Mhaswade_at_Sun.COM>
Date: Wed, 24 Jan 2007 21:26:43 -0800

Amy Roh wrote:
> kedar wrote:
>>
>>
>> Amy Roh wrote:
>>
>>> kedar wrote:
>>>
>>>> Using proxy apart, I am not able to assess why this
>>>> operation fails. I checked fisheye and the actual
>>>> invocation code snippet is not available in WebContainer.java.
>>>> Can you send me the exact MBean code and the code that
>>>> calls the method?
>>>
>>>
>>> I think the issue might be related to ClassLoader.
>>
>> Right. This is important piece of information.
>>
>>>
>>> I've created a separate ClassLoader to load and start Tomcat in a
>>> lifecycle listener module. Tomcat related MBeans are created using
>>> this
>>> ClassLoader.
>>
>> And are you using the createMBean method on MBeanServer
>> that takes the classloader as an object name?
>> You've got to handle this rather carefully.
>>
>> If the MBean code is known to a special class loader, then
>> it will be better to
>> 1- either, use the registerMBean method where you create
>> your MBean instance and register it.
>
>> 2- or, use the createMBean method, but prior to that, register
>> the class loader that knows about MBean as an MBean.
>>
>> Can you try out 1) and report back?
>
> I already register the class loader as an MBean after creating it. Is
> that what you mean?
Yes.
>
> I tried MBeanServer.instantiate(String className, ObjectName
> loaderName) to make sure if the Object created is using the same class
> loader.
Right, this should work.
But I would prefer you use the registerMBean method, rather
than createMBean method.
- create the instance of Catalina Context class (cc)
- use an object name (on)
- MBeanServer.registerMBean(cc, on);

now invoke the operation on that MBean.

I suggest this because I don't know how you are
setting up the class loaders.

In general, when class loaders are involved, you need to
to exercise more care with MBeans.

Kedar
>
> Thanks,
> Amy
>>
>> Kedar
>>
>>>
>>> However, passing a StandardContext Object loaded from the Tomcat JAR to
>>> invoke a method on Tomcat Deployer MBean doesn't seem to work.
>>>
>>> Class contextClass = catalinaLoader.loadClass(
>>> "org.apache.catalina.core.StandardContext");
>>> Object context = contextClass.newInstance();
>>>
>>> MBeanServer.invoke(deployer, "manageApp",
>>> new Object[] {context},
>>> new String[] {"org.apache.catalina.Context"});
>>>
>>> Since MBeanServer.invoke uses the same class loader as the one used for
>>> loading the MBean on which the operation was invoked, I checked the
>>> ClassLoader for deployer MBean and found that it is Tomcat's common
>>> class loader rather than catalina class loader.
>>>
>>> I even tried instantiating context Object using MBeanServer.instantiate
>>> to make sure the class is the same one but no luck.
>>>
>>> Thanks,
>>> Amy
>>>
>>>>
>>>> Lloyd L Chambers wrote:
>>>>
>>>>> Amy,
>>>>>
>>>>> You'll be happier using
>>>>> MBeanServerInvocationHandler.newProxyInstance() to get type-safe,
>>>>> compile-time invocation. That might not solve your issue, but
>>>>> it's safer, since type errors are detected at compile time.
>>>>>
>>>>> You can write your own java interface for newProxyInstance () if
>>>>> one is not available, including only the methods relevant to you.
>>>>>
>>>>> Lloyd
>>>>>
>>>>>
>>>>> On Jan 19, 2007, at 1:57 PM, Amy Roh wrote:
>>>>>
>>>>>> kedar wrote:
>>>>>>
>>>>>>> Amy Roh wrote:
>>>>>>>
>>>>>>>> kedar wrote:
>>>>>>>>
>>>>>>>>> Oh that message is simply a classic
>>>>>>>>> problem of not being able to provide
>>>>>>>>> a "rich" java object like "Context" to
>>>>>>>>> this method on HTML page, that's all.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Oh I Wish that was just the case. However, method invoke fails
>>>>>>>> with ReflectionException although I can see the method and
>>>>>>>> signature/param is correct. Perhaps it's related to passing a
>>>>>>>> "rich" java object since methods that take String get invoked
>>>>>>>> fine.
>>>>>>>
>>>>>>>
>>>>>>> I think I am not explaining it right.
>>>>>>> On HTML adaptor, primitive Java Objects can easily be sent as
>>>>>>> params, by
>>>>>>> entering their value in the text field. That's not true for the
>>>>>>> non-primitive Java Objects and Arrays. So, if your method accepts
>>>>>>> such an object, it is simply not "invokable" from HTML adaptor.
>>>>>>> So, I guess I don't understand what you mean when you say,
>>>>>>> "method invoke
>>>>>>> fails ..". How do you invoke it? There is no "button" do so.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Sorry for not being clear. No, I don't invoke it from HTML
>>>>>> adaptor. The adaptor was just for me to view MBean information to
>>>>>> check its availability.
>>>>>>
>>>>>> I invoke it in my code (added code is in
>>>>>> com/sun/enterprise/web/WebContainer.java) like this -
>>>>>>
>>>>>> MBeanServer.invoke(deployer, "manageApp",
>>>>>> new Object[] {context},
>>>>>> new String[] {"org.apache.catalina.Context"});
>>>>>>
>>>>>> which fails with the exception although the method is available
>>>>>> with right signature.
>>>>>>
>>>>>> Thanks,
>>>>>> Amy
>>>>>>
>>>>>>> Kedar
>>>>>>>
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Amy
>>>>>>>>
>>>>>>>>>
>>>>>>>>> This unsupported method is basically
>>>>>>>>> accepting Context object and simply
>>>>>>>>> speaking there is no way to provide
>>>>>>>>> that on the page!
>>>>>>>>>
>>>>>>>>> Actually, this brings up a good point and
>>>>>>>>> I am copying Eamonn, the JMX spec lead about
>>>>>>>>> MBean best practices. This MBean method is
>>>>>>>>> not a good one because
>>>>>>>>> 1- it does not use the Open types.
>>>>>>>>> 2- it is not possible to invoke it from a
>>>>>>>>> pure JMX client like JConsole.
>>>>>>>>>
>>>>>>>>> Note that MBeans are a little different beasts
>>>>>>>>> from the Java objects :) No need to worry, just
>>>>>>>>> a question of following best practices.
>>>>>>>>>
>>>>>>>>> If you use JConsole, see the MemoryMXBean and you'll
>>>>>>>>> appreciate what open types are.
>>>>>>>>>
>>>>>>>>> Regards,
>>>>>>>>> Kedar
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Amy Roh wrote:
>>>>>>>>>
>>>>>>>>>> kedar wrote:
>>>>>>>>>>
>>>>>>>>>>> I agree with Lloyd, when it comes to the GlassFish
>>>>>>>>>>> Platform MBeans. To be precise, the "amx:" MBeans
>>>>>>>>>>> are the ones that the clients can "depend on" to
>>>>>>>>>>> manage GlassFish. The "com.sun.appserv:" MBeans are
>>>>>>>>>>> not supported. You are on your own, when you call
>>>>>>>>>>> these MBeans. In that sense, this is a reserved MBean
>>>>>>>>>>> domain that you should leave alone. In future, we will
>>>>>>>>>>> try to hide those MBeans from our clients.
>>>>>>>>>>>
>>>>>>>>>>> This however, does not mean that you can't have your
>>>>>>>>>>> own MBeans. Actually, your application code or explicit
>>>>>>>>>>> admin operation does allow to deploy your own MBeans and
>>>>>>>>>>> they will be in a domain called "user:". This relates
>>>>>>>>>>> to our feature of "custom MBeans" and several folks have
>>>>>>>>>>> used that feature. Look at Admin console or asadmin
>>>>>>>>>>> commands like "create-mbean".
>>>>>>>>>>>
>>>>>>>>>>> Amy: What MBeans (object names) do you refer to, and why
>>>>>>>>>>> do you want to invoke those MBean operations?
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> I'm trying to invoke Catalina Deployer MBean method. The
>>>>>>>>>> MBean is created after I embed Tomcat so you can think of it
>>>>>>>>>> as my own MBean.
>>>>>>>>>>
>>>>>>>>>> Again, although the method is visible but "not operational".
>>>>>>>>>> Trying to figure out why and where the MBeanServer is making
>>>>>>>>>> the method "not operational".
>>>>>>>>>>
>>>>>>>>>> If you're on swan, you can access my mbean -
>>>>>>>>>>
>>>>>>>>>> http://asengsol1.sfbay.sun.com:8082/ViewObjectRes//Catalina%3Atype%3DDeployer%2Chost%3Dlocalhost
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Description of manageApp (Operation Not Supported)
>>>>>>>>>> void manageApp (org.apache.catalina.Context)context
>>>>>>>>>>
>>>>>>>>>> manageApp operation is listed but says "Operation Not
>>>>>>>>>> Supported".
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Amy
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Thanks,
>>>>>>>>>>> Kedar
>>>>>>>>>>>
>>>>>>>>>>> Lloyd L Chambers wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Amy,
>>>>>>>>>>>>
>>>>>>>>>>>> Most all MBeans that have a JMX domain other than "amx" are
>>>>>>>>>>>> private and should not be used. AMX are the public ones,
>>>>>>>>>>>> and there are no unsupported methods.
>>>>>>>>>>>>
>>>>>>>>>>>> The com.sun.appserv MBeans have a fair number of
>>>>>>>>>>>> unsupported methods; the generic code makes no attempt to
>>>>>>>>>>>> remove inappropriate methods from the MBeanInfo of subclasses.
>>>>>>>>>>>>
>>>>>>>>>>>> Lloyd Chambers
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> On Jan 19, 2007, at 10:50 AM, Amy Roh wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> Hi guys,
>>>>>>>>>>>>>
>>>>>>>>>>>>> Do you know why some MBeans operations are "not supported"?
>>>>>>>>>>>>>
>>>>>>>>>>>>> I do see the method available in MBeanInfo and
>>>>>>>>>>>>> MBeanOperationInfo and the method is public and available
>>>>>>>>>>>>> through mbean descriptor.
>>>>>>>>>>>>>
>>>>>>>>>>>>> However, when I view the MBean through HTML Adaptor I do
>>>>>>>>>>>>> see the method listed but it also says "(Operation Not
>>>>>>>>>>>>> Supported)"
>>>>>>>>>>>>>
>>>>>>>>>>>>> After looking at various MBeans, it seems that methods
>>>>>>>>>>>>> that take any parameters other than Object or String says
>>>>>>>>>>>>> "Operation Not Supported", perhaps serialization issue(?).
>>>>>>>>>>>>>
>>>>>>>>>>>>> Is there a way to use these "available" methods without
>>>>>>>>>>>>> getting "ReflectionException" when invoked?
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>> Amy
>>>>>>>>>>>>>
>>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>
>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>>>>> dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>>> dev-help_at_glassfish.dev.java.net
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>
>>>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> dev-help_at_glassfish.dev.java.net
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>
>>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>> dev-help_at_glassfish.dev.java.net
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>
>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>
>>>>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>>>>>>
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>
>>>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>>
>>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>>>
>>>>>>
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>>
>>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>>
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>