7 Replies Latest reply on Jul 18, 2007 5:29 AM by mbroons

    PojoCache with Compile Time Weaving on JBoss 4.2.0 ?

    mbroons

      I'm facing some trouble trying to use PojoCache with Compile Time Weaving on JBoss 4.2.0.

      I have a DemoService exposing a DemoServiceRemote interface. The interface allows a client application to subscribe/unsubscribe to the service (subscribe, unSubscribe methods) and to invoke a method on the service (invoke method)

      The service stores the client sessions into Arralist attribute where ClientSession is defined as follow:

      @PojoCacheable
      public class ClientSession {
      String sessionId = null;
      ...

      The DemoService works fine as long as i use Load Time Weaving on JBoss AS, although Load Time Weaving seems to really slow down the application server start up.

      I did not manage to make it work using Compile Time Weaving.
      I followed the procedure described here:
      http://wiki.jboss.org/wiki/Wiki.jsp?page=PojoCacheAS405

      I "aopc" compiled My ClientSession class to create the instrumented version of the class.
      I packaged all class files (original classes + generated classes) in a
      single DemoService.jar file. (My service is built using the EJB 3.0 @Service but the same behavior was experimented when building my service as a mbean service)

      When the service.subscribe() method is called from the client the following exception is raised:

      javax.ejb.EJBException: java.lang.ClassCastException: pojo.ClientSession
      at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:63)
      at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
      at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
      at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:106)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.service.ServiceContainer.dynamicInvoke(ServiceContainer.java:353)
      at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
      at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
      at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:734)
      at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:560)
      at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:369)
      at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:165)
      Caused by: java.lang.ClassCastException: pojo.ClientSession
      at org.jboss.aspects.patterns.observable.SubjectInterceptor.invoke(SubjectInterceptor.java:50)
      at pojo.ClientSession$sessionId_Set.invokeNext(ClientSession$sessionId_Set.java)
      at pojo.ClientSession.sessionId_w_$aop(ClientSession.java)
      at pojo.ClientSession.(ClientSession.java:11)
      at ejbservice.DemoService.subscribe(DemoService.java:67)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:585)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
      at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
      at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
      at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:76)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77)
      at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:106)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.service.ServiceContainer.dynamicInvoke(ServiceContainer.java:353)
      at org.jboss.aop.Dispatcher.invoke(Dispatcher.java:106)
      at org.jboss.aspects.remoting.AOPRemotingInvocationHandler.invoke(AOPRemotingInvocationHandler.java:82)
      at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:734)
      at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:560)
      at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:369)
      at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:165)
      at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:163)
      at org.jboss.remoting.Client.invoke(Client.java:1550)
      at org.jboss.remoting.Client.invoke(Client.java:530)
      at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:62)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.service.ServiceRemoteProxy.invoke(ServiceRemoteProxy.java:94)
      at $Proxy7.subscribe(Unknown Source)
      at client.DemoServiceDelegate.subscribe(DemoServiceDelegate.java:33)
      at client.DemoServiceDelegateTest.testSubscribe(DemoServiceDelegateTest.java:30)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
      at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
      at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
      at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
      at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
      at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
      at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
      at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
      at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
      at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
      at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:32)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
      at org.jboss.aspects.remoting.InvokeRemoteInterceptor.invoke(InvokeRemoteInterceptor.java:74)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.tx.ClientTxPropagationInterceptor.invoke(ClientTxPropagationInterceptor.java:61)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.aspects.security.SecurityClientInterceptor.invoke(SecurityClientInterceptor.java:53)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.remoting.IsLocalInterceptor.invoke(IsLocalInterceptor.java:72)
      at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
      at org.jboss.ejb3.service.ServiceRemoteProxy.invoke(ServiceRemoteProxy.java:94)
      at $Proxy7.subscribe(Unknown Source)
      at client.DemoServiceDelegate.subscribe(DemoServiceDelegate.java:33)
      at client.DemoServiceDelegateTest.testSubscribe(DemoServiceDelegateTest.java:30)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
      at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
      at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
      at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
      at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
      at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
      at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
      at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
      at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
      at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
      at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:32)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

      Is the problem due to the way i package my service ?

        • 1. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?
          jason.greene

           

          "mbroons" wrote:
          I'm facing some trouble trying to use PojoCache with
          I packaged all class files (original classes + generated classes) in a
          single DemoService.jar file


          Are you really combining both classes directories? Compile-time weaving modifies the classes, so you do not want the originals around, else you end up with duplicate classes which could cause the problem you describe.

          -Jason

          • 2. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?
            mbroons

            Sorry i did not describe correctly what i did.
            No original class is packaged in the final jar...

            The original class is:

            ClientSession.class (non instrumented)

            which becomes after aopc compilation:

            ClientSession.class (instrumented)
            ClientSession$sessionId_Get.class
            ClientSession$sessionId_Set.class

            Only instrumented and generated classes are packaged in the DemoService.jar. Here is the full jar content

            D:\ProjetJ\CounterService>jar tvf DemoService.jar

            META-INF/
            META-INF/MANIFEST.MF
            cachemgnt/
            cachemgnt/CacheEngine.class
            ejbservice/
            ejbservice/DemoService.class
            ejbservice/DemoServiceMgnt.class
            interfaces/
            interfaces/DemoServiceRemote.class
            pojo/
            pojo/ClientSession$sessionId_Get.class
            pojo/ClientSession$sessionId_Set.class
            pojo/ClientSession.class

            Another exception is also raised when i stop the Jboss instance.
            It may help to understand what i did wrong
            Here it is:

            java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: javassist.NotFoundException: pojo.ClientSession
            at org.jboss.aop.ClassAdvisor.rebuildInterceptors(ClassAdvisor.java:979)
            at org.jboss.aop.ClassAdvisor.removeAdviceBindings(ClassAdvisor.java:421
            at org.jboss.aop.AspectManager.removeBindings(AspectManager.java:1355)
            at org.jboss.aop.AspectXmlLoader.bulkUndeploy(AspectXmlLoader.java:1103)
            at org.jboss.aop.AspectXmlLoader.undeployXML(AspectXmlLoader.java:1094)
            at org.jboss.aop.AspectXmlLoader.undeploy(AspectXmlLoader.java:1216)
            at org.jboss.aop.AspectXmlLoader.undeployXML(AspectXmlLoader.java:1251)
            at org.jboss.aop.deployment.AspectDeployer.stop(AspectDeployer.java:241)
            at org.jboss.deployment.MainDeployer.stop(MainDeployer.java:667)
            at org.jboss.deployment.MainDeployer.stop(MainDeployer.java:659)
            at org.jboss.deployment.MainDeployer.undeploy(MainDeployer.java:638)
            at org.jboss.deployment.MainDeployer.shutdown(MainDeployer.java:516)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:585)
            at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
            at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
            at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
            at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
            at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
            at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
            at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
            at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
            at org.jboss.system.server.ServerImpl$ShutdownHook.shutdownDeployments(ServerImpl.java:1058)
            at org.jboss.system.server.ServerImpl$ShutdownHook.shutdown(ServerImpl.java:1033)
            at org.jboss.system.server.ServerImpl$ShutdownHook.run(ServerImpl.java:996)
            Caused by: java.lang.RuntimeException: java.lang.RuntimeException: javassist.NotFoundException: pojo.ClientSession
            at org.jboss.aop.pointcut.MethodMatcher.visit(MethodMatcher.java:130)
            at org.jboss.aop.pointcut.ast.ASTAll.jjtAccept(ASTAll.java:41)
            at org.jboss.aop.pointcut.MatcherHelper.visit(MatcherHelper.java:88)
            at org.jboss.aop.pointcut.MatcherHelper.matches(MatcherHelper.java:83)
            at org.jboss.aop.pointcut.PointcutExpression.matchesExecution(PointcutExpression.java:124)
            at org.jboss.aop.Advisor.resolveMethodPointcut(Advisor.java:628)
            at org.jboss.aop.ClassAdvisor.createInterceptorChains(ClassAdvisor.java:607)
            at org.jboss.aop.ClassAdvisor.rebuildInterceptors(ClassAdvisor.java:974)

            ... 26 more
            Caused by: java.lang.RuntimeException: javassist.NotFoundException: pojo.ClientSession
            at org.jboss.aop.Advisor.hasAnnotation(Advisor.java:392)
            at org.jboss.aop.pointcut.MethodMatcher.visit(MethodMatcher.java:126)
            ... 33 more
            Caused by: javassist.NotFoundException: pojo.ClientSession
            at javassist.ClassPool.get(ClassPool.java:417)
            at org.jboss.aop.util.ReflectToJavassist.classToJavassist(ReflectToJavassist.java:49)
            at org.jboss.aop.util.ReflectToJavassist.methodToJavassist(ReflectToJavassist.java:116)
            at org.jboss.aop.annotation.PortableAnnotationElement.isAnyAnnotationPresent(PortableAnnotationElement.java:120)
            at org.jboss.aop.Advisor.hasAnnotation(Advisor.java:388)
            ... 34 more



            D:\ProjetJ\CounterService>jar tvf DemoService.jar

            0 Mon Jun 25 09:41:52 CEST 2007 META-INF/
            106 Mon Jun 25 09:41:50 CEST 2007 META-INF/MANIFEST.MF
            0 Mon Jun 25 09:09:40 CEST 2007 cachemgnt/
            2218 Mon Jun 25 09:09:40 CEST 2007 cachemgnt/CacheEngine.class
            0 Mon Jun 25 09:09:40 CEST 2007 ejbservice/
            3897 Mon Jun 25 09:09:56 CEST 2007 ejbservice/DemoService.class
            194 Mon Jun 25 09:09:40 CEST 2007 ejbservice/DemoServiceMgnt.class
            0 Mon Jun 25 09:09:40 CEST 2007 interfaces/
            309 Mon Jun 25 09:09:40 CEST 2007 interfaces/DemoServiceRemote.class
            0 Mon Jun 25 09:11:50 CEST 2007 pojo/
            1738 Mon Jun 25 09:09:56 CEST 2007 pojo/ClientSession$sessionId_Get.class
            2011 Mon Jun 25 09:09:56 CEST 2007 pojo/ClientSession$sessionId_Set.class
            3786 Mon Jun 25 09:09:56 CEST 2007 pojo/ClientSession.class



            • 3. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?
              jason.greene

              Are you certain that there is no other pojo.ClienSession class in the entire system?

              • 4. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?
                mbroons

                The pojo/ClientSession class is only shipped in DemoService.jar
                I use the farm directory to deploy the service in my two-node cluster.

                If the problem is due to class loading, is there a way to enable classloader traces in JBoss ?

                • 5. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?

                  I think there is a conflict with jboss-aop.xml from tc5 (used for field session replication). There we introduced SubjectInterceptor for the POJO.

                  I'd suggest you try first by running in default mode (i.e., no clustering). If it is working, and you don't need tc5, then remove tc5-clsuter.sar. Then give it another try.

                  -Ben

                  • 6. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?
                    jason.greene

                    You could also make them compatible by adding the following to your compile time aop config:

                     <introduction class="@org.jboss.cache.aop.annotation.PojoCacheable">
                     <mixin>
                     <interfaces>org.jboss.aspects.patterns.observable.Subject</interfaces>
                     <class>org.jboss.aspects.patterns.observable.SubjectImpl</class>
                     <construction>new org.jboss.aspects.patterns.observable.SubjectImpl(this)</construction>
                     </mixin>
                     </introduction>
                    


                    -Jason

                    • 7. Re: PojoCache with Compile Time Weaving on JBoss 4.2.0 ?
                      mbroons

                      1) I removed jboss-web-cluster.sar from the distribution and it
                      worked fine.

                      2) I used the following jboss-aop.xml for aopc compilation and it worked fine.

                      <?xml version="1.0" encoding="UTF-8"?>
                      <aop>
                      
                       <!-- If a POJO has JDK5 PojoCacheable annotation, it will be aspectized. -->
                       <prepare expr="field(* @org.jboss.cache.aop.annotation.PojoCacheable->*)" />
                      
                       <!-- Make any POJO with a JDK5 PojoCacheable annotation as a Subject/Observerable -->
                       <bind pointcut="set(* @org.jboss.cache.aop.annotation.PojoCacheable->*)">
                       <interceptor class="org.jboss.aspects.patterns.observable.SubjectInterceptor"/>
                       </bind>
                      
                       <introduction class="@org.jboss.cache.aop.annotation.PojoCacheable">
                       <mixin>
                       <interfaces>org.jboss.aspects.patterns.observable.Subject</interfaces>
                       <class>org.jboss.aspects.patterns.observable.SubjectImpl</class>
                       <construction>new org.jboss.aspects.patterns.observable.SubjectImpl(this)</construction>
                       </mixin>
                       </introduction>
                      
                       <!-- If a POJO has JDK5 InstanceOfPojoCacheable annotation, it will be aspectized. -->
                       <prepare expr="field(* $instanceof{@org.jboss.cache.aop.annotation.InstanceOfPojoCacheable}->*)" />
                      
                       <!-- Make any POJO with a JDK5 InstanceOfPojoCacheable annotation as a Subject/Observerable -->
                       <bind pointcut="set(* @org.jboss.cache.aop.annotation.InstanceOfPojoCacheable->*)">
                       <interceptor class="org.jboss.aspects.patterns.observable.SubjectInterceptor"/>
                       </bind>
                      
                       <introduction class="@org.jboss.cache.aop.annotation.InstanceOfPojoCacheable">
                       <mixin>
                       <interfaces>org.jboss.aspects.patterns.observable.Subject</interfaces>
                       <class>org.jboss.aspects.patterns.observable.SubjectImpl</class>
                       <construction>new org.jboss.aspects.patterns.observable.SubjectImpl(this)</construction>
                       </mixin>
                       </introduction>
                      
                      </aop>



                      Thanks