2013-04-30 12 views
3

我试着写一个小的“看门狗” *的.war监视我的(更大)*的.ear部署状态在JBoss 7.1.3如何在JBoss AS 7上访问详细的Java EE应用程序部署状态?

我如何获得在的的确切部署状态*。耳?

我知道我能做到这一点(使用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(); 

但是这会给我即使部署失败的所有绿色。例如 - 说我有@Startup @Singleton,谁是@PostConstruct方法(称为启动的一部分)引发异常。此时我的部署逻辑上已失败(初始化抛出异常),但jboss将标记为已部署的。 - 均使用部署目录中的标记文件( .isDeploying - > * .deployed)并使用来自上面的控制器。

JBoss的确实有一个ContainerStateMonitor类,保持服务的缺少依赖一个列表,它正是我所需要的 - 未能启动将导致一堆依赖于它的失败部署@EJBs的任何@Singletons - 但我不知道如何去做。

我发现的最接近的是:

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

这让我的ServerService实例,它具有保持数据控制器(瞬态)字段。但它的所有私人领域,我真的不想诉诸反思。

所以我的问题是 - 有没有办法得到这些数据? jboss显然知道@Singletons未能部署的是什么,@EJBs是否缺少依赖关系,哪些数据源无法连接等,但是有没有办法让我找到它?不必是MSC,可以是JMX(尽管我认为这只是在jboss 7中映射到MSC)或任何其他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(); 
     } 
    } 
} 

注意我用的应与旧版本的JBoss AS7时,JBoss EAP 6.x和WildFly的工作API的7.2.0.Final版本。

此输出,如

{ 
    "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)); 
} 
相关问题