You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@geronimo.apache.org by Dain Sundstrom <da...@coredevelopers.net> on 2003/08/13 23:47:47 UTC

[deployment] Relationship management

I am 371 emails behind the list, but wanted to let you all know where I 
am with the relationship managements system.

The first thing necessary for a relationship it to define a 
relationship type in the system.  We have an MBean that creates a 
binary relationship (two roles) on start and removes the relationship 
when stopped.  The following is a complete MBean declaration (note: all 
attributes other then the name are optional)

<mbean code="org.apache.geronimo.jmx.Relationship" 
name="geronimo.test:role=Relationship,name=Twins">
     <attribute name="Name">Twins</attribute>
     <attribute name="LeftRoleName">Good</attribute>
     <attribute name="LeftRoleClass"> some.good.BeanMBean</attribute>
     <attribute name="LeftRoleMinimum">1</attribute>
     <attribute name="LeftRoleMaximum">1</attribute>
     <attribute name="LeftRoleDescription">This is the Good 
Twin</attribute>
     <attribute name="RightRoleName">Evil</attribute>
     <attribute name="RightRoleClass"> some.evil.BeanBean</attribute>
     <attribute name="RightRoleMinimum">1</attribute>
     <attribute name="RightRoleMaximum">1</attribute>
     <attribute name="RightRoleDescription">This is the Evil 
Twin</attribute>
</mbean>

The default is for a relationship with two roles, "left" and "right", 
where each role is r/w, can have zero or more elements and can only 
contains MBeans of type "java.lang.Object" (anything).

We also now support MBean relationship declaration in our MBean 
deployment descriptor.  You can declare an MBean as follows.

<mbean code="some.good.Bean" name="geronimo.test:alignment=Good">
     <attribute name="Interval">3000000</attribute>
</mbean>

<mbean code="some.evil.Bean" name="geronimo.test:alignment=Evil">
     <attribute name="Interval">30000</attribute>
     <relationship
         name="basic good and evil"
         role="Evil"
         type="Twins"
         target="geronimo.test:alignment=Good"
         targetRole="Good"/>
</mbean>

The name and role attributes are required.  The type, target and target 
role attributes are only used if the  relationship is not found.  In 
the case where the relationship is not found, we create a new one of 
the specified type and assign the target to the target role.  The 
target and targetRole attributes are really only necessary for blind 
relationships or if the relationship has a minimal cardinality of 1.

Finally, I added the RelationshipMBeanProxyFactory creates a dynamic 
proxy to an MBean based on a relationship end point.  The interface 
type, relationship existience, and object existance is not enforced 
during construction. Instead, if a method is invoked on the proxy and 
there is no relationship registered with the specified id or if the 
target role does not conatin any objects, an InvocationTargetException 
is thrown, which contains an IllegalStateException.  If an interface 
method that is not implemented by the MBean is invoked, an 
InvocationTargetException is thrown, which contains an 
NoSuchMethodException.

To invoke a method based on the above relationship you can simply do 
this:

some.evil.BeanMBean evil = (some.evil.BeanMBean) 
RelationshipMBeanProxyFactory.getProxy(
         some.evil.Bean.class,
         server,
         "basic good and evil",
         "Evil");
evil.doSomethingEvil();

There is also a overloaded method which does not take the interface 
class, but looks at the RoleInfo to determine the interface class.  
This only works if the role is defined in terms of interfaces and not 
classes.

I'm going to keep working on this, as this is a path to a simple 
dependency management system.  I'm not sure exactly how it will work, 
but I plan on having a special "Must be started" relationship which 
contains the object names of the MBeans that must be started before the 
an MBean is started.  I'm avoiding details, because I just don't know 
exactly how it will work.  BTW, I just writing the easy dependancy 
system, not the final dependancy startup/management system, so please 
don't worry we can rewrite it later (think XP -- something for today).

-dain

/*************************
  * Dain Sundstrom
  * Partner
  * Core Developers Network
  *************************/