2012-03-14 4 views
2

ビルドパイプラインの一部としてJenkinsのビルドサーバーからリモートのJBoss AS 7.1.1サーバーに自動的にデプロイする作業をしています。私がantから呼び出した小さなjarファイル(thisに基づいています)があります。JBoss AS 7上の既存のアプリケーションをどのように照会するのですか?

私の質問は、アプリケーションが既にインストールされているかどうかを確認することです。アプリケーションがすでにデプロイされている場合、デプロイメントプランを実行すると失敗します(スローされた例外をキャッチすることはできますが、これはあまり役に立ちません)。

答えて

3

配備を行う前にリソースを読むことができます。そこから、再配布するか、何もしないことができます。

ここでは、スタンドアロンサーバーで動作する例を示します。

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; 
} 

あなたはMavenを使用している場合、あなたはあまりにも使用することができmaven pluginがあります。

+0

いいえ、ただのantです。明日それを試していただきありがとうございます。この種のドキュメントはどこにありますか? – blank

+0

@BedwyrHumphreysほとんどはhttps://docs.jboss.org/author/display/AS71/Management+API+referenceです。あなたはちょうど構造を探索しなければならない他のもの。 $ JBOSS_HOME/bin/jboss-cli.shを実行すると、概要を見ることができます。--connect "/:read-resource" >> output.txt –

+0

ポイントのカップル - 私はop.get(OP)が動作するはずです。 get(ClientConstants.OP)とClientConstants.FAILEDはorg.jboss.as.controller.client.helpers.ClientConstantsに存在しないようです。 – blank

0

代替:

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 CLIクライアントlibには、そのためのいくつかのAPIが含まれているように、今それを見つけることができません。

これはクエリ解析の基本的な実装です(ネストされた値はサポートされず、エスケープなどは気にしません)。

/** 
* 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()