2012-03-14 28 views
2

我正在從Jenkins構建服務器作爲構建管道的一部分自動部署到遠程JBoss AS 7.1.1服務器,並且有一個我從螞蟻調用的小型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

沒有maven,只是螞蟻。謝謝你明天會試試看。這種事情的文件在哪裏? – blank 2012-03-14 18:59:26

+0

@BedwyrHumphreys大部分是在這裏https://docs.jboss.org/author/display/AS71/Management+API+reference。其他你只是需要探索的結構。你可以看到一個概述,如果你執行$ JBOSS_HOME/bin/jboss-cli.sh --connect「/:read-resource」>> output.txt – 2012-03-15 00:11:22

+0

幾點 - 我認爲op.get(OP)應該是op。得到(ClientConstants.OP)和ClientConstants.FAILED似乎不存在org.jboss.as.controller.client.helpers.ClientConstants – blank 2012-03-15 07:54:51

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 AS中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()