You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@aries.apache.org by Matt Madhavan <ma...@gmail.com> on 2012/01/05 19:53:51 UTC

Limitation/Draw back in JMXWhiteBoard spec/impl ?

Hello,
In the last few days I have successfully instrumented one of my BluePrint
service. But I see a limitation.

Per JMX spec, *MBean Interface must be in the same package as the
Implementing MBean. But I want to keep the implementation packes internal
with the spirit of good BluePrint design. Hence what I see is the
limitation with the way JMXWhiteBoard bean is implemented.

So lets say I have the following two packages in my bundle.

*1. com.xxxx.jms.tester *-  *For the service interface - This package is
exported*
It has the following interface!

package com.xxxx.jms.tester;

public interface SendMsgService{
public void sendMsg();
}


*2.com.xxxx.jms.intrenal.tester *-  *For the service Impl (This package is
not exported)*
It has the following interface!

package com.xxxx.jms.tester.internal;

import com.xxxx.jms.tester.SendMsgService;

public interface *SendMsgMBean extends SendMsgService*{
}

And the following impl class:
package com.xxxx.jms.tester.internal;

import .....

public class *SendMsg implements SendMsgMBean*{
...
   public void sendMsg() {
           .............
    }
}

*In my blueprint.xml  I have for the bean impl!*

    <bean id="sendMsgServiceBean"
          class="com.xxxx.jms.tester.internal.SendMsg"
                init-method="init" destroy-method="destroy">
    <property name = "connectionFactory" ref="connectionFactory"/>
    </bean>

*For the service and JMX white board*
    <service id = "sendMsgService"
    ref="sendMsgServiceBean" interface="*
com.xxxx.jms.tester.internal.SendMsgMBean*">
<service-properties>
<entry key="jmx.objectname" value="SendMsgMBean:name=sendMessage" />
</service-properties>
    </service>

Everything works as expected!

*But in the spirit of a good design I would rather have the following xml
snippet:*

 <service id = "sendMsgService"
     ref="sendMsgServiceBean" interface="*com.xxxx.jms.tester.SendMsgService
*">
<service-properties>
<entry key="jmx.objectname" value="SendMsgMBean:name=sendMessage" />
</service-properties>
    </service>

*Please note that SendMsgMBean extends SendMsgService. *
With this I get the benefit of both hiding my impl classes and interfaces
and also get the benifit of the JMXWhite board pattern. Before my OSGi
days, this is the approach I took in keeping interface/impl separate.

But with this approach, I do get the JMX instrumentation! It does not work!
I think it is a limitation. Please correct me if I'm wrong!

Can some one please review this and answer me ? I'm really curious.

I really think JMX white board is a good pattern, hence my curiosity!

Thanks in advance!

Matt

Re: Limitation/Draw back in JMXWhiteBoard spec/impl ?

Posted by David Jencks <da...@yahoo.com>.
On Jan 3 Felix mentioned that the (unreleased) trunk version of jmx whiteboard handles this case.  Did you try it?  If you are using karaf you probably need to recompile karaf after adjusting the version in the root karaf pom.

thanks
david jencks

On Jan 5, 2012, at 10:53 AM, Matt Madhavan wrote:

> Hello,
> In the last few days I have successfully instrumented one of my BluePrint service. But I see a limitation.
> 
> Per JMX spec, *MBean Interface must be in the same package as the Implementing MBean. But I want to keep the implementation packes internal with the spirit of good BluePrint design. Hence what I see is the limitation with the way JMXWhiteBoard bean is implemented.
> 
> So lets say I have the following two packages in my bundle.
> 
> 1. com.xxxx.jms.tester -  For the service interface - This package is exported
> It has the following interface!
> 
> package com.xxxx.jms.tester;
> 
> public interface SendMsgService{
> 	public void sendMsg();
> }
> 
> 
> 2.com.xxxx.jms.intrenal.tester -  For the service Impl (This package is not exported)
> It has the following interface!
> 
> package com.xxxx.jms.tester.internal;
> 
> import com.xxxx.jms.tester.SendMsgService;
> 
> public interface SendMsgMBean extends SendMsgService{
> 	
> }
> 
> And the following impl class:
> package com.xxxx.jms.tester.internal;
> 
> import .....
> 
> public class SendMsg implements SendMsgMBean{
> ...
>    public void sendMsg() {
>            .............
>     }
> }
> 
> In my blueprint.xml  I have for the bean impl!
> 
>     <bean id="sendMsgServiceBean" 
>           class="com.xxxx.jms.tester.internal.SendMsg" 
>           	      init-method="init" destroy-method="destroy">
>     	<property name = "connectionFactory" ref="connectionFactory"/>
>     </bean>
> 
> For the service and JMX white board
>     <service id = "sendMsgService" 
>     	ref="sendMsgServiceBean" interface="com.xxxx.jms.tester.internal.SendMsgMBean">
> 			<service-properties>
> 				<entry key="jmx.objectname" value="SendMsgMBean:name=sendMessage" />
> 			</service-properties>    	
>     </service>        
> 
> Everything works as expected!
> 
> But in the spirit of a good design I would rather have the following xml snippet:
> 
>  <service id = "sendMsgService" 
>     	ref="sendMsgServiceBean" interface="com.xxxx.jms.tester.SendMsgService">
> 			<service-properties>
> 				<entry key="jmx.objectname" value="SendMsgMBean:name=sendMessage" />
> 			</service-properties>    	
>     </service>        
> 
> Please note that SendMsgMBean extends SendMsgService. 
> With this I get the benefit of both hiding my impl classes and interfaces and also get the benifit of the JMXWhite board pattern. Before my OSGi days, this is the approach I took in keeping interface/impl separate. 
> 
> But with this approach, I do get the JMX instrumentation! It does not work! I think it is a limitation. Please correct me if I'm wrong!
> 
> Can some one please review this and answer me ? I'm really curious. 
> 
> I really think JMX white board is a good pattern, hence my curiosity! 
> 
> Thanks in advance!
> 
> Matt
>