[jboss-user] [Microcontainer] - Ordering a deployer which needs multiple inputs

jaikiran do-not-reply at jboss.com
Thu Mar 12 10:44:50 EDT 2009


If i have n number of deployers in a chain, is there a specific order these deployers follow while deploying an unit?

Right now, i have the following scenario:

public class FirstDeployer extends AbstractDeployer
  | {
  | 
  |   public FirstDeployer()
  |   {
  |     setStage(REAL);
  |   
  |     // our only input is JBossMetaData
  |     setInput(JBossMetaData.class);
  | 
  |     // we generate FirstOutput.class as the output
  |     setOutput(FirstOutput.class);
  |   }
  | 
  |   public void deploy(DeploymentUnit unit)
  |   {
  |     // do something and add output
  |     unit.addAttachment(FirstOutput.class);
  |   }
  | 
  | }
  | 
  | 
  | 

public class SecondDeployer extends AbstractRealDeployerWithInput<JBossMetaData>
  | {
  | 
  |   public SecondDeployer()
  |   {
  |     // set a visitor
  |     setDeploymentVisitor(new SimpleVisitor());
  | 
  |     // we generate SecondOutput.class as the output
  |     setOutput(SecondOutput.class);
  |   }
  | 
  |   private class SimpleVisitor implements DeploymentVisitor<JBossMetaData>
  |   {
  |     public void deploy(DeploymentUnit unit, JBossMetaData jbmeta)
  |     {
  |       // we generate SecondOutput.class as the output
  |       unit.addAttachment(SecondOutput.class);
  |     }
  | 
  |   }
  | 
  | }
  | 


public class FinalDeployer extends AbstractDeployer
  | {
  | 
  |   public FinalDeployer()
  |   {
  |     setStage(REAL);
  |   
  |     // we rely on 2 inputs 
  |     // 1) FisrtOutput.class Generated from FirstDeployer
  |     // 2) SecondOutput.class generated from SecondDeployer
  |     addInput(FirstOutput.class);
  |     addInput(SecondOutput.class);
  | 
  |     // we generate FinalOutput.class as the output
  |     setOutput(FinalOutput.class);
  |   }
  | 
  |   public void deploy(DeploymentUnit unit)
  |   {
  |     // we expect both the inputs to be present in the unit at this point
  |     FirstOutput one = unit.getAttachment(FirstOutput.class);
  |     SecondOutput second = unit.getAttachment(SecondOutput.class);
  |   }
  | 
  | }
  | 
  | 
  | 

As can be seen:

* There are 3 deployers - FirstDeployer, SecondDeployer and FinalDeployer. Each are for the REAL stage.
* The FirstDeployer generates FirstOutput.class as output
* The SecondDeployer generates SecondOutput.class as output
* Ordering between FirstDeployer and SecondDeployer is NOT of concern in this example, since each one is independent
* The FinalDeployer expects 2 inputs - one from FirstDeployer and one from SecondDeployer. Ordering IS important here. So when FinalDeployer is invoked, for deploying the unit, it expects both the inputs to be available (as attachments) in the unit. So both the FirstDeployer and SecondDeployer should have processed the unit before reaching the FinalDeployer.

However, from what i see, the FinalDeployer is invoked before the SecondDeployer and hence when the FinalDeployer tries to get hold of SecondOutput, it gets a null.

Shouldn't the inputs add some sort of dependency/ordering within the deployers? More importantly, since the FinalDeployer relies on 2 inputs, shouldn't it be called only after *both* inputs are available? Right now, from the logs it appears to me that this FinalDeployer is being invoked when atleast one of the input is available.

As a ugly hack (for testing) i set the relative order for the FinalDeployer and i see that it gets called after both the FirstDeployer and SecondDeployer are invoked (the original intention).

public class FinalDeployer extends AbstractDeployer
  | {
  | 
  |   public FinalDeployer()
  |   {
  |     setStage(REAL);
  |   
  |     // we rely on 2 inputs 
  |     // 1) FisrtOutput.class Generated from FirstDeployer
  |     // 2) SecondOutput.class generated from SecondDeployer
  |     addInput(FirstOutput.class);
  |     addInput(SecondOutput.class);
  | 
  |     // we generate FinalOutput.class as the output
  |     setOutput(FinalOutput.class);
  | 
  |     // let's go last
  |     setRelativeOrder(Integer.MAX_VALUE);
  |   }
  | ...
  | 
  | }
  | 
  | 
By the way, the setRelativeOrder - what is it relative to?



View the original post : http://www.jboss.org/index.html?module=bb&op=viewtopic&p=4217498#4217498

Reply to the post : http://www.jboss.org/index.html?module=bb&op=posting&mode=reply&p=4217498



More information about the jboss-user mailing list