2013-04-30 1 views
3

Im пытается написать небольшие «сторожевой» * .war, которая отслеживает состояние развертывания моего (намного больше) * .ear на JBoss 7.1.3Как получить доступ к подробному состоянию развертывания приложений Java EE на JBoss AS 7?

Как получить в точном состоянии развертывания * .ear?

Я знаю, что могу это сделать (с помощью JBoss классов MSC):

ServiceContainer sc = CurrentServiceContainer.getServiceContainer(); //jboss msc 
ServiceController earController = sc.getService(Services.deploymentUnitName("my.ear")); 
return "my.ear - "+earController.getMode()+"-"+earController.getState()+"-"+earController.getSubstate(); 

, но это даст мне все-зеленый, даже если не удалось развертывания. для exmaple - скажем, у меня есть @Startup @Singleton, метод @PostConstruct (называемый частью загрузки) генерирует исключение. на данный момент мое развертывание логически провалилось (инициализация бросила исключение), но jboss отметит . как развернутый - как с использованием файлов маркеров в каталоге развертывания ( .isDeploying -> * .deployed), так и с использованием значений из контроллер выше.

У jboss есть класс ContainerStateMonitor, который хранит список служб с отсутствующими зависимостями, которые мне нужны - любые @Singletons, которые не запускаются, вызовут кучу @EJB, которые полагаются на него, чтобы не выполнить развертывание, - но Я понятия не имею, как это сделать.

ближе всего я нашел это:

sc.getService(org.jboss.as.serverServices.JBOSS_SERVER_CONTROLLER).getService() 

это заставляет меня экземпляр ServerService, который имеет поле контроллер (переходная), который хранит эти данные. но все это в частных областях, и я действительно не хочу прибегать к размышлениям.

так что мой вопрос - есть ли способ получить эти данные? jboss, очевидно, знает, что @Singletons не удалось развернуть, что @EJBs не хватает зависимостей, какие источники данных не удалось подключить и т. д., но есть ли у меня способ добраться до него? не обязательно должен быть MSC, может быть JMX (хотя я думаю, что это просто карты MSC в jboss 7) или любой другой API.

ответ

3

Вы можете использовать management API и проверить результаты.

Код будет выглядеть примерно так:

import java.net.InetAddress; 

import org.jboss.as.controller.client.ModelControllerClient; 
import org.jboss.as.controller.client.helpers.ClientConstants; 
import org.jboss.as.controller.client.helpers.Operations; 
import org.jboss.dmr.ModelNode; 

public class ClientExample { 

    public static void main(final String[] args) throws Exception { 
     final ModelControllerClient client = ModelControllerClient.Factory.create(InetAddress.getLocalHost(), 9999); 
     try { 
      final ModelNode address = new ModelNode().setEmptyList(); 
      address.add("deployment", "jboss-as-helloworld.war"); 
      final ModelNode op = Operations.createReadResourceOperation(address, true); 
      op.get(ClientConstants.INCLUDE_RUNTIME).set(true); 
      final ModelNode outcome = client.execute(op); 
      if (Operations.isSuccessfulOutcome(outcome)) { 
       System.out.println(outcome); 
      } else { 
       System.err.printf("Operation failure: %s%n", Operations.getFailureDescription(outcome)); 
      } 
     } finally { 
      client.close(); 
     } 
    } 
} 

Примечание Я использую версию 7.2.0.Final в API, который должен работать с более старыми версиями JBoss AS7, JBoss EAP 6.x и WildFly.

Это выводит результат как

{ 
    "outcome" => "success", 
    "result" => { 
     "content" => [{"hash" => bytes { 
      0xab, 0x77, 0x61, 0x49, 0x4b, 0x30, 0x3b, 0x4f, 
      0xd7, 0x80, 0x13, 0x5a, 0x6c, 0x48, 0x1e, 0x3d, 
      0xb3, 0xbe, 0xc1, 0xc2 
     }}], 
     "enabled" => true, 
     "name" => "jboss-as-helloworld.war", 
     "persistent" => true, 
     "runtime-name" => "jboss-as-helloworld.war", 
     "status" => "OK", 
     "subdeployment" => undefined, 
     "subsystem" => {"web" => { 
      "active-sessions" => 0, 
      "context-root" => "/jboss-as-helloworld", 
      "duplicated-session-ids" => 0, 
      "expired-sessions" => 0, 
      "max-active-sessions" => 0, 
      "rejected-sessions" => 0, 
      "session-avg-alive-time" => 0, 
      "session-max-alive-time" => 0, 
      "sessions-created" => 0, 
      "virtual-host" => "default-host", 
      "servlet" => {"org.jboss.as.quickstarts.helloworld.HelloWorldServlet" => { 
       "load-time" => 0L, 
       "maxTime" => 9223372036854775807L, 
       "min-time" => 0L, 
       "processingTime" => 0L, 
       "requestCount" => 0, 
       "servlet-class" => "org.jboss.as.quickstarts.helloworld.HelloWorldServlet", 
       "servlet-name" => "org.jboss.as.quickstarts.helloworld.HelloWorldServlet" 
      }} 
     }} 
    } 
} 

Или если вы просто хотите, чтобы статус вы могли бы немного изменить приведенный выше пример и сделать:

final ModelNode op = Operations.createReadAttributeOperation(address, "status"); 
final ModelNode outcome = client.execute(op); 
if (Operations.isSuccessfulOutcome(outcome)) { 
    System.out.println(Operations.readResult(outcome).asString()); 
} else { 
    System.err.printf("Operation failure: %s%n", Operations.getFailureDescription(outcome)); 
} 
Смежные вопросы