12 Replies Latest reply on May 30, 2016 4:13 AM by ion_mayank

    @Management in JBoss 6: don't work ?

    vandfr

      Hello,

       

      I am currently migrating my application from JBoss 5.1 to JBoss 6.0.Final.

      And I can't make the @Management annotation work like under JBoss 5.1:

      -> no managed MBean appears in the JBoss JMX Console.

       

      I have done a HelloWorld sample.

      This sample is made up with one single ear called "SIS_Sample.ear" which contains only one class called "HelloWorld"

       

      package com.sample;

       

      import javax.annotation.PostConstruct;

      import javax.ejb.Singleton;

      import javax.ejb.Startup;

       

      import org.jboss.ejb3.annotation.Management;

       

      @Singleton

      @Startup

      @Management

      public class HelloWorld {

       

          @PostConstruct

          public void start() {

              System.out.println(">>> HelloWorld bean starts <<<");

          }

       

          public String displayHelloWorld() {

              return "HelloWorld";

          }

       

      }

       

      Nothing weird appears in the server log.

      If anyone could tell me where I have done wrong ?

      Thanks.

       

      Ce message a été modifié par: Laurent Vandwalle

        • 1. Re: @Management in JBoss 6: don't works ?
          vandfr

          The workaround I found -> programmaticaly register an MBean in the JBoss MBean server

           

          package com.sample;

           

          import javax.annotation.PostConstruct;

          import javax.ejb.Singleton;

          import javax.ejb.Startup;

          import javax.management.MBeanServer;

          import javax.management.ObjectName;

           

          import org.jboss.mx.util.MBeanServerLocator;

           

          @Singleton

          @Startup

          public class HelloWorld implements HelloWorldMBean {

           

              @PostConstruct

              public void start() {

                  System.out.println(">>> HelloWorld bean starts <<<");

           

                  MBeanServer server = MBeanServerLocator.locateJBoss();

                  try {

                      ObjectName name = new ObjectName("HelloWorld:agent=MyHelloWorldBean");

                      server.registerMBean(this, name);

                  } catch (Exception e) {

                      e.printStackTrace();

                  }

              }

           

              public String displayHelloWorld() {

                  return "HelloWorld";

              }

           

          }

          ---------------------------------

          package com.sample;

           

          public interface HelloWorldMBean {

              String displayHelloWorld();

          }

           

          And then it works(around):

          helloWolrdManagement.png

          • 2. @Management in JBoss 6: don't works ?
            jaikiran

            JBoss specific @Management is not supported with Java EE6 specified @Singleton.

            • 3. @Management in JBoss 6: don't works ?
              vandfr

              OK.

              That's what I feared.

               

              So how can I suppress the JBoss specific "@Service" by the new standard annotation "@Singleton",

              if I lose the benefit of the JBoss specific @Management annotation.

               

              Don't you that it can be reported as a bug in JBoss 6.0 ?

              • 4. @Management in JBoss 6: don't work ?
                jaikiran

                Laurent Vandwalle wrote:

                 

                So how can I suppress the JBoss specific "@Service" by the new standard annotation "@Singleton",

                if I lose the benefit of the JBoss specific @Management annotation.

                 

                 

                Currently there's no inbuilt way of doing this. As you found, you can do it yourself via some code.

                 

                 

                Laurent Vandwalle wrote:

                 


                Don't you that it can be reported as a bug in JBoss 6.0 ?

                @Management for @Singleton was never a planned feature. So it isn't a bug. If you want some similar functionality then that might be considered for the upcoming JBoss AS7 release. You'll have to file a feature request JIRA for the same.

                • 5. @Management in JBoss 6: don't work ?
                  vandfr

                  OK Sorry.

                   

                  I just found the new standard annotation "@ManagedBean" that seems to replace the JBoss specific annotation "@Management".

                   

                  Thanks for your help.

                  • 6. @Management in JBoss 6: don't work ?
                    jaikiran

                    Laurent Vandwalle wrote:

                     

                     

                     

                    I just found the new standard annotation "@ManagedBean" that seems to replace the JBoss specific annotation "@Management".

                     

                     

                    Actually @ManagedBean is not a replacement for JBoss specific @Management. Those are 2 completely different annotations with different semantics.

                    • 7. Re: @Management in JBoss 6: don't work ?
                      vandfr
                      Actually @ManagedBean is not a replacement for JBoss specific @Management. Those are 2 completely different annotations with different semantics.

                       

                      Yes, indeed.

                      @ManagedBean has nothing to do with JMX Management.

                      According to the JSR 316, it is for beans managed by the container.

                       

                      So I will try another strategy: I will test if the "old" association of annotations "@Service + @Management" is still working under JBoss 6...

                      If not, I will use my workaround.

                      • 8. Re: @Management in JBoss 6: don't work ?
                        vandfr

                        Finally, I choose to keep the @Service annotation when used in association with @Management.

                        And I replaced  @Service by @Singleton when it was possible (ie: when there was no @Management annotation).

                        Even if it is a workaround, it works well.

                         

                        I have created a bug on JBoss 6.0 Final in order to signal that @Singleton + @Management don't work -> https://issues.jboss.org/browse/JBAS-9276

                        • 9. @Management in JBoss 6: don't work ?
                          javacoryd

                          Does this work in JBoss 6 Final?  I've tried this and my @PostConstruct method never gets called on startup of the server.

                           

                          Thanks,

                           

                          Cory.

                          • 10. @Management in JBoss 6: don't work ?
                            vandfr
                            Does this work in JBoss 6 Final?  I've tried this and my @PostConstruct method never gets called on startup of the server.

                            What I have experienced with JBoss 6 Final:

                            - @Singleton bean (and his @PostConstruct and @PreDestroy methods)  -> works (you can have look on the boot.log file in the first post of this discussion thread and see the log "[STDOUT] >>> HelloWorld bean starts <<<")

                            - @Service bean with @Management annotation -> works

                            - @Singleton bean with @Management annotation -> don't work (the JMX Management don't work but the behaviour of the @Singleton annotation is OK)

                            • 11. Re: @Management in JBoss 6: don't work ?
                              legae

                              In jboss 6.1 I have @Startup @Singleton class that need to be managable through jmx-console. So I did as it is suggested to register bean by hand. Registration is ok, but when I want to invoke method through jmx-console exception is thrown

                               

                              package com.test.service;
                              
                              import java.util.Timer;
                              import java.util.TimerTask;
                              
                              import javax.annotation.PostConstruct;
                              import javax.annotation.PreDestroy;
                              import javax.ejb.EJB;
                              import javax.management.InstanceAlreadyExistsException;
                              import javax.management.MBeanServer;
                              import javax.management.MalformedObjectNameException;
                              import javax.management.ObjectName;
                              
                              import org.jboss.mx.util.MBeanServerLocator;
                              
                              import com.test.bean.TestLocal;
                              import com.test.util.StackTrace;
                              
                              @javax.ejb.Startup
                              @javax.ejb.Singleton
                              public class DependsService implements DependsServiceMBean {
                              
                                  @EJB
                                  TestLocal                tl;
                              
                                  private Timer            timer = null;
                                  private static final int delay = 10000;
                              
                                  @PostConstruct
                                  public void create() {
                              
                                      StackTrace.info(this, "create: ", tl);
                                      try {
                                          ObjectName name = new ObjectName("logic:service=DependsService");
                              
                                          try {
                                              MBeanServer server = MBeanServerLocator.locateJBoss();
                                              server.registerMBean(this, name);
                                          }catch (InstanceAlreadyExistsException e) {
                                              StackTrace.debug(this, "instance alreay registered");
                                          } catch (Exception e) {
                                              StackTrace.error(this, "locateJboss: ", e);
                                          }
                              
                                      } catch (MalformedObjectNameException e) {
                                          StackTrace.error(this, "ObjectName: ", e);
                                      }
                                      start();
                                  }
                              
                                  public void start(){
                                      timer = new Timer();
                                      timer.scheduleAtFixedRate(new TimerTask() {
                                          @Override
                                          public void run() {
                                              try {
                                                  doIt();                    
                                              } catch (Exception e) {
                                                  StackTrace.error(e);
                                              }
                                          }
                                      }, 1000, DependsService.delay);
                                  }
                              
                                  private void doIt() {
                                      tl.doSth();
                                  }
                              
                                  public void stop(){
                                      StackTrace.info(this, "stop: ", tl);
                                      timer.cancel();
                                      tl.doSth2();
                                  }
                              
                              
                                  @PreDestroy
                                  public void destroy() {
                                      timer.cancel();
                                  }
                              }
                              

                               

                               

                              package com.test.service;
                              
                              public interface DependsServiceMBean {
                              
                                  public void start();
                                  public void stop();
                              }
                              

                               

                              doSth() and doSth2() methods just print a message. When this service starts everything is ok. I see in jmx-console domain "logic" and both start and stop methods can be invoked. When I invoke "stop" method this is what I see in jboss logs

                               

                              2011-07-05 11:05:56,331 INFO [com.test.service.DependsService] 37:DependsService#stop():stop: Proxy to jboss.j2ee:ear=SimpleTests.ear,jar=SimpleTests.jar,name=TestBean,service=EJB3 implementing [interface com.test.bean.TestLocal]

                              11:05:56,331 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/jmx-console].[HtmlAdaptor]] Servlet.service() for servlet HtmlAda

                              ptor threw exception: java.lang.ClassNotFoundException: com.test.bean.TestLocal

                                      at java.net.URLClassLoader$1.run(URLClassLoader.java:202) [:1.6.0_21]

                                      at java.security.AccessController.doPrivileged(Native Method) [:1.6.0_21]

                                      at java.net.URLClassLoader.findClass(URLClassLoader.java:190) [:1.6.0_21]

                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:307) [:1.6.0_21]

                                      at java.lang.ClassLoader.loadClass(ClassLoader.java:248) [:1.6.0_21]

                                      at java.lang.Class.forName0(Native Method) [:1.6.0_21]

                                      at java.lang.Class.forName(Class.java:247) [:1.6.0_21]

                                      at org.jboss.ejb3.common.classloader.util.PrimitiveClassLoadingUtil.loadClass(PrimitiveClassLoadingUtil.java:99) [:]

                                      at org.jboss.ejb3.common.lang.SerializableMethod.getClassFromName(SerializableMethod.java:307) [:1.0.2]

                                      at org.jboss.ejb3.common.lang.SerializableMethod.getClassType(SerializableMethod.java:282) [:1.0.2]

                                      at org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:233) [:1.0.2]

                                      at org.jboss.ejb3.common.lang.SerializableMethod.toMethod(SerializableMethod.java:220) [:1.0.2]

                                      at org.jboss.ejb3.proxy.impl.handler.session.SessionProxyInvocationHandlerBase.invoke(SessionProxyInvocationHandlerBase.java:178) [:]

                                      at $Proxy183.doSth2(Unknown Source)     at com.test.service.DependsService.stop(DependsService.java:77)

                                      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [:1.6.0_21]

                                      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [:1.6.0_21]

                                      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [:1.6.0_21]

                                      at java.lang.reflect.Method.invoke(Method.java:597) [:1.6.0_21]

                                      at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157) [:6.0.0.GA]

                                      at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96) [:6.0.0.GA]

                                      at org.jboss.mx.server.Invocation.invoke(Invocation.java:88) [:6.0.0.GA]

                                      at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:271) [:6.0.0.GA]

                                      at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:670) [:6.0.0.GA]

                                      at org.jboss.jmx.adaptor.control.Server.invokeOpByName(Server.java:258) [:]

                                      at org.jboss.jmx.adaptor.control.Server.invokeOp(Server.java:223) [:]

                                      at org.jboss.jmx.adaptor.html.HtmlAdaptorServlet$3.run(HtmlAdaptorServlet.java:380) [:]

                                      at org.jboss.jmx.adaptor.html.HtmlAdaptorServlet$3.run(HtmlAdaptorServlet.java:377) [:]

                                      at java.security.AccessController.doPrivileged(Native Method) [:1.6.0_21]

                                      at org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.invokeOp(HtmlAdaptorServlet.java:376) [:]

                                      at org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.invokeOp(HtmlAdaptorServlet.java:287) [:]

                                      at org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.processRequest(HtmlAdaptorServlet.java:104) [:]

                                      at org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.doPost(HtmlAdaptorServlet.java:86) [:]

                                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) [:1.0.0.Final]

                                      at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) [:1.0.0.Final]

                                      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:324) [:]

                                      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:242) [:]

                                      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [:]

                                      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) [:]

                                      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:181) [:6.1.0-SNAPSHOT]

                                      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:88) [:6.1.0-SNAPSHOT]

                                      at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:100) [:6.1.0-SNAPSHOT]

                                      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) [:]

                                      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [:]

                                      at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158) [:6.1.0-SNAPSHOT]

                                      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [:]

                                      at org.jboss.web.tomcat.service.request.ActiveRequestResponseCacheValve.invoke(ActiveRequestResponseCacheValve.java:53) [:6.1.0-SNAPSHOT]

                                      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [:]

                                      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [:]

                                      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:654) [:]

                                      at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:951) [:]

                                      at java.lang.Thread.run(Thread.java:619) [:1.6.0_21]

                               

                              What is the reason of this ClassNotFoundException? Is there different class loading/classpath for jmx invoked methods? How can I fix my problem

                              • 12. Re: @Management in JBoss 6: don't work ?
                                ion_mayank

                                Hi Legae,

                                 

                                I am facing the same problem of ClassNotFoundException for EJB invocation from JMX. Did you got the solution for your problem?