Rule throws java.lang.ClassCastException
radek.koubsky Oct 8, 2015 8:03 PMHi,
one of my rules throws java.lang.ClassCastException when it is triggered.
Byteman 3.0.2-SNAPSHOT
wildfly-8.2.0.Final
Method:
@Override public Object processInvocation(final InterceptorContext context) throws Exception { final StatefulSessionComponent component = getComponent(context, StatefulSessionComponent.class); final StatefulSessionComponentInstance instance = getComponentInstance(context); final OwnableReentrantLock lock = instance.getLock(); final Object threadLock = instance.getThreadLock(); final TransactionSynchronizationRegistry transactionSynchronizationRegistry = component.getTransactionSynchronizationRegistry(); final Object lockOwner = getLockOwner(transactionSynchronizationRegistry); lock.pushOwner(lockOwner); try { final AccessTimeoutDetails timeout = component.getAccessTimeout(context.getMethod()); if (ROOT_LOGGER.isTraceEnabled()) { ROOT_LOGGER.trace("Trying to acquire lock: " + lock + " for stateful component instance: " + instance + " during invocation: " + context); } // we obtain a lock in this synchronization interceptor because the lock needs to be tied to the synchronization // so that it can released on the tx synchronization callbacks boolean acquired = lock.tryLock(timeout.getValue(), timeout.getTimeUnit()); if (!acquired) { throw MESSAGES.failToObtainLock(context, timeout.getValue(), timeout.getTimeUnit()); } synchronized (threadLock) { if (ROOT_LOGGER.isTraceEnabled()) { ROOT_LOGGER.trace("Acquired lock: " + lock + " for stateful component instance: " + instance + " during invocation: " + context); } Object currentTransactionKey = null; boolean wasTxSyncRegistered = false; try { //we never register a sync for bean managed transactions //the inner BMT interceptor is going to setup the correct transaction anyway //so enrolling in an existing transaction is not correct if(containerManagedTransactions) { if (!instance.isSynchronizationRegistered()) { // get the key to current transaction associated with this thread currentTransactionKey = transactionSynchronizationRegistry.getTransactionKey(); final int status = transactionSynchronizationRegistry.getTransactionStatus(); // if this SFSB instance is already associated with a different transaction, then it's an error // if the thread is currently associated with a tx, then register a tx synchronization if (currentTransactionKey != null && status != Status.STATUS_COMMITTED && status != Status.STATUS_ROLLEDBACK) { // register a tx synchronization for this SFSB instance final Synchronization statefulSessionSync = new StatefulSessionSynchronization(instance, lockOwner); transactionSynchronizationRegistry.registerInterposedSynchronization(statefulSessionSync); wasTxSyncRegistered = true; if (ROOT_LOGGER.isTraceEnabled()) { ROOT_LOGGER.trace("Registered tx synchronization: " + statefulSessionSync + " for tx: " + currentTransactionKey + " associated with stateful component instance: " + instance); } // invoke the afterBegin callback on the SFSB instance.afterBegin(); instance.setSynchronizationRegistered(true); context.putPrivateData(StatefulTransactionMarker.class, StatefulTransactionMarker.of(true)); } } else { context.putPrivateData(StatefulTransactionMarker.class, StatefulTransactionMarker.of(false)); } } // proceed with the invocation return context.proceed(); } finally { // if the current call did *not* register a tx SessionSynchronization, then we have to explicitly mark the // SFSB instance as "no longer in use". If it registered a tx SessionSynchronization, then releasing the lock is // taken care off by a tx synchronization callbacks. if (!wasTxSyncRegistered && !instance.isSynchronizationRegistered()) { releaseInstance(instance); } else if (!wasTxSyncRegistered) { //if we don't release the lock here then it will be acquired multiple times //and only released once releaseLock(instance); //we also call the cache release to decrease the usage count if (!instance.isDiscarded()) { instance.getComponent().getCache().release(instance); } } } } } finally { lock.popOwner(); } }
Rule:
#Log StatefulSessionSynchronizationInterceptor - lock acquired RULE logStatefulSessionSynchronizationInterceptor.processInvocation.lockAcquired CLASS org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor METHOD processInvocation(InterceptorContext) AFTER WRITE $acquired IF $acquired DO log($CLASS, "DEBUG", "(Method processInvocation) The lock is acquired, entering synchronized block with thread lock as monitor object.") ENDRULE
When rule is triggered, it throws class cast exception.
I have similar rule which uses AFTER WRITE $acquired:
#Log StatefulSessionSynchronizationInterceptor - trying to acquire a lock RULE logStatefulSessionSynchronizationInterceptor.processInvocation.tryAcquire CLASS org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor METHOD processInvocation(InterceptorContext) AFTER WRITE $acquired IF true DO log($CLASS, "DEBUG", "(Method processInvocation) Trying to acquire the lock within given time, time: " + $timeout.getValue() + "; unit: " + $timeout.getTimeUnit()) ENDRULE
Only difference is that the class cast exception rule uses "IF $acquired".
Stacktrace from class cast exception:
01:57:17,565 INFO [stdout] (default task-7) cast exception org.jboss.byteman.koubsky.LogHelper_HelperAdapter_Interpreted_13
01:57:17,565 INFO [stdout] (default task-7) java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Boolean
01:57:17,566 INFO [stdout] (default task-7) at org.jboss.byteman.rule.Condition.interpret(Condition.java:116)
01:57:17,566 INFO [stdout] (default task-7) at org.jboss.byteman.koubsky.LogHelper_HelperAdapter_Interpreted_13.test(ejb.btm)
01:57:17,566 INFO [stdout] (default task-7) at org.jboss.byteman.koubsky.LogHelper_HelperAdapter_Interpreted_13.execute0(ejb.btm)
01:57:17,567 INFO [stdout] (default task-7) at org.jboss.byteman.koubsky.LogHelper_HelperAdapter_Interpreted_13.execute(ejb.btm)
01:57:17,567 INFO [stdout] (default task-7) at org.jboss.byteman.rule.Rule.execute(Rule.java:684)
01:57:17,567 INFO [stdout] (default task-7) at org.jboss.byteman.rule.Rule.execute(Rule.java:653)
01:57:17,568 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.stateful.StatefulSessionSynchronizationInterceptor.processInvocation(StatefulSessionSynchronizationInterceptor.java:87)
01:57:17,568 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,568 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext$Invocation.proceed(InterceptorContext.java:407)
01:57:17,568 INFO [stdout] (default task-7) at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:46)
01:57:17,569 INFO [stdout] (default task-7) at org.jboss.as.weld.ejb.EjbRequestScopeActivationInterceptor.processInvocation(EjbRequestScopeActivationInterceptor.java:83)
01:57:17,569 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,569 INFO [stdout] (default task-7) at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45)
01:57:17,570 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,570 INFO [stdout] (default task-7) at org.jboss.invocation.InitialInterceptor.processInvocation(InitialInterceptor.java:21)
01:57:17,570 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,570 INFO [stdout] (default task-7) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
01:57:17,571 INFO [stdout] (default task-7) at org.jboss.as.ee.component.interceptors.ComponentDispatcherInterceptor.processInvocation(ComponentDispatcherInterceptor.java:53)
01:57:17,571 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,571 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.stateful.StatefulComponentInstanceInterceptor.processInvocation(StatefulComponentInstanceInterceptor.java:66)
01:57:17,572 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,572 INFO [stdout] (default task-7) at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:273)
01:57:17,573 INFO [stdout] (default task-7) at org.jboss.as.ejb3.tx.CMTTxInterceptor.required(CMTTxInterceptor.java:340)
01:57:17,573 INFO [stdout] (default task-7) at org.jboss.as.ejb3.tx.CMTTxInterceptor.processInvocation(CMTTxInterceptor.java:239)
01:57:17,573 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,574 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
01:57:17,574 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,574 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.invocationmetrics.WaitTimeInterceptor.processInvocation(WaitTimeInterceptor.java:43)
01:57:17,574 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,575 INFO [stdout] (default task-7) at org.jboss.as.ejb3.security.SecurityContextInterceptor.processInvocation(SecurityContextInterceptor.java:95)
01:57:17,575 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,575 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.interceptors.ShutDownInterceptorFactory$1.processInvocation(ShutDownInterceptorFactory.java:64)
01:57:17,575 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,576 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.interceptors.LoggingInterceptor.processInvocation(LoggingInterceptor.java:59)
01:57:17,576 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,576 INFO [stdout] (default task-7) at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
01:57:17,576 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,577 INFO [stdout] (default task-7) at org.jboss.as.ejb3.component.interceptors.AdditionalSetupInterceptor.processInvocation(AdditionalSetupInterceptor.java:55)
01:57:17,577 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,577 INFO [stdout] (default task-7) at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64)
01:57:17,577 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,577 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:326)
01:57:17,578 INFO [stdout] (default task-7) at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:448)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.invocation.AccessCheckingInterceptor.processInvocation(AccessCheckingInterceptor.java:61)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:326)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
01:57:17,578 INFO [stdout] (default task-7) at org.jboss.as.ee.component.ViewService$View.invoke(ViewService.java:185)
01:57:17,579 INFO [stdout] (default task-7) at org.jboss.as.ee.component.ViewDescription$1.processInvocation(ViewDescription.java:182)
01:57:17,579 INFO [stdout] (default task-7) at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:309)
01:57:17,579 INFO [stdout] (default task-7) at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
01:57:17,579 INFO [stdout] (default task-7) at org.jboss.as.ee.component.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:73)
01:57:17,579 INFO [stdout] (default task-7) at org.jboss.as.quickstarts.ear.ejb.GreeterEJB$$$view2.sayHello(Unknown Source)
01:57:17,579 INFO [stdout] (default task-7) at org.jboss.as.quickstarts.ear.controller.Greeter.setName(Greeter.java:55)
01:57:17,579 INFO [stdout] (default task-7) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
01:57:17,579 INFO [stdout] (default task-7) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
01:57:17,580 INFO [stdout] (default task-7) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
01:57:17,580 INFO [stdout] (default task-7) at java.lang.reflect.Method.invoke(Method.java:606)
01:57:17,580 INFO [stdout] (default task-7) at javax.el.ELUtil.invokeMethod(ELUtil.java:308)
01:57:17,580 INFO [stdout] (default task-7) at javax.el.BeanELResolver.invoke(BeanELResolver.java:537)
01:57:17,580 INFO [stdout] (default task-7) at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256)
01:57:17,580 INFO [stdout] (default task-7) at com.sun.el.parser.AstValue.invoke(AstValue.java:286)
01:57:17,580 INFO [stdout] (default task-7) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
01:57:17,580 INFO [stdout] (default task-7) at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
01:57:17,581 INFO [stdout] (default task-7) at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
01:57:17,581 INFO [stdout] (default task-7) at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
01:57:17,581 INFO [stdout] (default task-7) at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
01:57:17,581 INFO [stdout] (default task-7) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
01:57:17,581 INFO [stdout] (default task-7) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
01:57:17,581 INFO [stdout] (default task-7) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
01:57:17,581 INFO [stdout] (default task-7) at javax.faces.component.UICommand.broadcast(UICommand.java:315)
01:57:17,582 INFO [stdout] (default task-7) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
01:57:17,582 INFO [stdout] (default task-7) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
01:57:17,582 INFO [stdout] (default task-7) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
01:57:17,582 INFO [stdout] (default task-7) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
01:57:17,582 INFO [stdout] (default task-7) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
01:57:17,582 INFO [stdout] (default task-7) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
01:57:17,582 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
01:57:17,582 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
01:57:17,583 INFO [stdout] (default task-7) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:56)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45)
01:57:17,583 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:63)
01:57:17,584 INFO [stdout] (default task-7) at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
01:57:17,584 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
01:57:17,584 INFO [stdout] (default task-7) at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
01:57:17,584 INFO [stdout] (default task-7) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
01:57:17,584 INFO [stdout] (default task-7) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
01:57:17,584 INFO [stdout] (default task-7) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
01:57:17,584 INFO [stdout] (default task-7) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
01:57:17,585 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
01:57:17,585 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:247)
01:57:17,585 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:76)
01:57:17,585 INFO [stdout] (default task-7) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:166)
01:57:17,586 INFO [stdout] (default task-7) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:197)
01:57:17,586 INFO [stdout] (default task-7) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:759)
01:57:17,586 INFO [stdout] (default task-7) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
01:57:17,586 INFO [stdout] (default task-7) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
01:57:17,587 INFO [stdout] (default task-7) at java.lang.Thread.run(Thread.java:745)
Thank you for help.