2012-03-14 9 views
2

Я работаю над автоматическим развертыванием на удаленном сервере JBoss AS 7.1.1 с сервера сборки Jenkins в составе конвейера сборки и имеет небольшой файл 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

No maven, just 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) должен быть 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 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() 

 Смежные вопросы

  • Нет связанных вопросов^_^