0 Replies Latest reply on Dec 13, 2010 4:15 AM by bdorninger

    Q: (JBoss 5.1.0GA) Service POJO cannot act as JMX notification listener?

    bdorninger

      Already posted this in the JMX section, but got no responses, so I am retrying here - I hope this is ok....

       

      I have an  application running on JBoss 5.1.0GA.Trying to establish a Service POJO, which also is a JMX MBean notification listener.

      I need this for periodic tasks, e.g. writing a statistic to the database.

       

      This won't work: When having a service xml file, I must omit the @Service annotation

      in the code. If I don't omit it I get a DuplicateBindException - even if service object

      names differ, but its the same code.

       

      When I omit the annotation, the POJO is not registered as EJB service - thus no

      objects are injected (@Depends, @Persistence context - whatsoever)

       

      Next I tried to skip the service.xml description and do the notification

      subscription by hand. But in that case, the class is not registered as mbean.

      This becomes obvious as the object name of the MBean Service is

      null causing the subscribe method of ListenerMBeanSupport to fail with a NPE (if .

      On the other hand, JBoss starts the MBean methods like startService or stopService.

       

      I am a little sceptical, if this behaviour is intended.

      Q: Is this intended? A service POJO cannot act as NotificationListener?

       

      So I have to do a workaround: Have two components: One MBean just acting listener and looking up the

      EJB POJO via Naming context.

      Q: Is there a better way to do this?

       

      Any help would be greatly appreciated.

       

      Below some code/xml snipptes:

       

       

      {code:xml}<!-- The hb-service.xml: -->

      <server> 

          <mbean code="util.HeartbeatListener" name="MyStatistics:service=HeartbeatListener">

              <attribute name="SubscriptionList">

                  <subscription-list>

                      <mbean name="jboss.monitor:name=Heartbeat,type=Timer"></mbean>             

                  </subscription-list>

              </attribute>     

          </mbean>  

      </server>{code}


       

      {code:java}

      // must skip either @Service annot. or the service file - otherwise Duplicate Bind ex

      @Service(name="HeartbeatListener", objectName = "trafficsoft.statistics:service=HeartbeatListener")

      @Management(HeartbeatListenerMBean.class)

      @Local(HeartbeatListenerLocal.class)

      public class HeartbeatListener extends ListenerServiceMBeanSupport implements

          HeartbeatListenerMBean, HeartbeatListenerLocal

      {

      .......

        // when having an xml service def, this EM is null

        @PersistenceContext

        private EntityManager em;

      ........

        @Override

        public void startService() throws Exception

        {

          //super.subscribe(true);// --> needs an XML description

          // subscr. by hand: super.subscribe throws NPE at line 277! in a debug statement

          // at this time this.getServiceName() returns null? Seems the object is not registered

          NotificationFilterSupport nfss=new NotificationFilterSupport();

          nfss.enableType("jboss.monitor.heartbeat");

          SubscriptionInfo subInfo=new SubscriptionInfo(

                      new ObjectName("jboss.monitor:name=Heartbeat,type=Timer"), null, nfss);

          ArrayList<SubscriptionInfo> slist=new ArrayList<SubscriptionInfo>();

          slist.add(subInfo); 

          super.subscribe(slist, true, this.serviceName);

          ............

          ......

        }

      ...

      }{code}