2012-03-14 7 views
2

Je travaille sur le déploiement automatique sur un serveur JBoss AS 7.1.1 distant à partir d'un serveur de build Jenkins dans le cadre d'un pipeline de build et j'ai un petit fichier jar que j'appelle ant (basé sur this).Comment interroger des applications existantes sur JBoss AS 7?

Ma question est comment puis-je savoir si une application est déjà installée? Faire un plan de déploiement échouera si l'application est déjà déployée (je pourrais attraper l'exception qui est lancée mais ce n'est pas génial).

Répondre

3

Vous pouvez lire la ressource avant de déployer. De là, vous pouvez le redéployer ou ne rien faire.

Voici un exemple qui fonctionnerait sur un serveur autonome.

private boolean exists(final ModelControllerClient client, final String deploymentName) { 
    final ModelNode op = new ModelNode(); 
    op.get(OP).set("read-children-names"); 
    op.get("child-type").set(ClientConstants.DEPLOYMENT); 
    final ModelNode result; 
    try { 
     result = client.execute(op); 
     // Check to make sure there is an outcome 
     if (result.hasDefined(ClientConstants.OUTCOME)) { 
      if (result.get(ClientConstants.OUTCOME).asString().equals(ClientConstants.SUCCESS)) { 
       final List<ModelNode> deployments = (result.hasDefined(ClientConstants.RESULT) ? result.get(ClientConstants.RESULT).asList() : Collections.<ModelNode>emptyList()); 
       for (ModelNode n : deployments) { 
        if (n.asString().equals(deploymentName)) { 
         return true; 
        } 
       } 
      } else if (result.get(ClientConstants.OUTCOME).asString().equals(ClientConstants.FAILED)) { 
       throw new IllegalStateException(String.format("A failure occurred when checking existing deployments. Error: %s", 
         (result.hasDefined(ClientConstants.FAILURE_DESCRIPTION) ? result.get(ClientConstants.FAILURE_DESCRIPTION).asString() : "Unknown"))); 
      } 
     } else { 
      throw new IllegalStateException(String.format("An unexpected response was found checking the deployment. Result: %s", result)); 
     } 
    } catch (IOException e) { 
     throw new IllegalStateException(String.format("Could not execute operation '%s'", op), e); 
    } 
    return false; 
} 

Si vous utilisez Maven, il y a un maven plugin vous pouvez utiliser aussi.

+0

Pas de maven, juste ant. Merci pour cela, j'essaierai demain. Où est la documentation pour ce genre de chose? – blank

+0

@BedwyrHumphreys La plus grande partie est ici https://docs.jboss.org/author/display/AS71/Management+API+reference. D'autres que vous avez juste besoin d'explorer la structure. Vous pouvez voir un aperçu si vous exécutez $ JBOSS_HOME/bin/jboss-cli.sh --connect "/: read-resource" >> output.txt –

+0

Quelques points - Je pense que op.get (OP) devrait être op. get (ClientConstants.OP) et ClientConstants.FAILED ne semble pas exister dans org.jboss.as.controller.client.helpers.ClientConstants – blank

0

Une alternative:

ModelNode res = AS7CliUtils.executeRequest("/deployment=* /:read-resource", ctx.getAS7Client()); 

{ 
    "outcome" => "success", 
    "result" => [{ 
     "address" => [("deployment" => "jboss-as-wicket-ear-ear.ear")], 
     "outcome" => "success", 
     "result" => { 
      "content" => [{"hash" => bytes { ... }}], 
      "enabled" => true, 
      "name" => "jboss-as-wicket-ear-ear.ear", 
      "persistent" => true, 
      "runtime-name" => "jboss-as-wicket-ear-ear.ear", 
      "subdeployment" => { 
       "jboss-as-wicket-ear-ejb.jar" => undefined, 
       "jboss-as-wicket-ear-war.war" => undefined 
      }, 
      "subsystem" => {"datasources" => undefined} 
     } 
    }] 
} 

JBoss AS lib client CLI contient une API pour cela, ne peut pas le trouver en ce moment.

Ceci est une implémentation primitive de l'analyse des requêtes (ne prend pas en charge les valeurs imbriquées et ne se soucie pas de l'échappement, etc.).

/** 
* Parse CLI command into a ModelNode - /foo=a/bar=b/:operation(param=value,...) . 
* 
* TODO: Support nested params. 
*/ 
public static ModelNode parseCommand(String command) { 
    return parseCommand(command, true); 
} 
public static ModelNode parseCommand(String command, boolean needOp) { 
    String[] parts = StringUtils.split(command, ':'); 
    if(needOp && parts.length < 2) throw new IllegalArgumentException("Missing CLI command operation: " + command); 
    String addr = parts[0]; 

    ModelNode query = new ModelNode(); 

    // Addr 
    String[] partsAddr = StringUtils.split(addr, '/'); 
    for(String segment : partsAddr) { 
     String[] partsSegment = StringUtils.split(segment, "=", 2); 
     if(partsSegment.length != 2) throw new IllegalArgumentException("Wrong addr segment format - need '=': " + command); 
     query.get(ClientConstants.OP_ADDR).add(partsSegment[0], partsSegment[1]); 
    } 

    // No op? 
    if(parts.length < 2) return query; 

    // Op 
    String[] partsOp = StringUtils.split(parts[1], '('); 
    String opName = partsOp[0]; 
    query.get(ClientConstants.OP).set(opName); 

    // Op args 
    if(partsOp.length > 1){ 
     String args = StringUtils.removeEnd(partsOp[1], ")"); 
     for(String arg : args.split(",")) { 
      String[] partsArg = arg.split("=", 2); 
      query.get(partsArg[0]).set(unquote(partsArg[1])); 
     } 
    } 
    return query; 
}// parseCommand()