JBoss Community

Adjust / reduce MDB bean pool

created by Alexander Hartner in EJB 3.0 - View the full discussion

I am trying to reduce the MDB bean pool to limit the concurrency of my application. I know I can do this via the ActivationSpecification as well as via the deployment descriptor. However I would like to do this outside the EAR file and be able to adjust it at the application server level. I have found the suggestion to edit maxSize=5 in ejb3-interceptors-aop.xml.

 

 

      <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))">
         <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>
      </bind>
      <bind pointcut="execution(public * *->*(..))">
         <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/>
         <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/>
         <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/>
         <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>
         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>
      </bind>
      <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)">
         @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=5, timeout=10000)
      </annotation>
   </domain>

   <domain name="Message Driven Bean">

      <bind pointcut="execution(public * @javax.annotation.security.RunAs->*(..))">

         <interceptor-ref name="org.jboss.ejb3.security.RunAsSecurityInterceptorFactory"/>

      </bind>

      <bind pointcut="execution(public * *->*(..))">

         <interceptor-ref name="org.jboss.ejb3.stateless.StatelessInstanceInterceptor"/>

         <interceptor-ref name="org.jboss.ejb3.tx.TxInterceptorFactory"/>

         <interceptor-ref name="org.jboss.ejb3.AllowedOperationsInterceptor"/>

         <interceptor-ref name="org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor"/>

         <interceptor-ref name="org.jboss.ejb3.interceptor.EJB3InterceptorsFactory"/>

      </bind>

      <annotation expr="!class(@org.jboss.annotation.ejb.PoolClass)">

         @org.jboss.annotation.ejb.PoolClass (value=org.jboss.ejb3.StrictMaxPool.class, maxSize=5, timeout=10000)

      </annotation>

   </domain>

 

Yet this resulted the following exception:

 

javax.ejb.EJBException: Failed to acquire the pool semaphore, strictTimeout=10000

        at org.jboss.ejb3.StrictMaxPool.get(StrictMaxPool.java:122)

        at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:54)

        at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)

        at org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:249)

        at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:268)

        at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:138)

        at $Proxy158.onMessage(Unknown Source)

        at org.jboss.resource.adapter.jms.inflow.JmsServerSession.onMessage(JmsServerSession.java:178)

        at org.jboss.jms.client.container.ClientConsumer.callOnMessageStatic(ClientConsumer.java:160)

        at org.jboss.jms.client.container.SessionAspect.handleRun(SessionAspect.java:831)

        at org.jboss.aop.advice.org.jboss.jms.client.container.SessionAspect14.invoke(SessionAspect14.java)

        at org.jboss.jms.client.delegate.ClientSessionDelegate$run_N8003352271541955702.invokeNext(ClientSessionDelegate$run_N8003352271541955702.java)

        at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)

        at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:105)

        at org.jboss.jms.client.delegate.ClientSessionDelegate$run_N8003352271541955702.invokeNext(ClientSessionDelegate$run_N8003352271541955702.java)

        at org.jboss.jms.client.delegate.ClientSessionDelegate.run(ClientSessionDelegate.java)

        at org.jboss.jms.client.JBossSession.run(JBossSession.java:199)

        at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:237)

        at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:204)

        at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:275)

        at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:756)

        at java.lang.Thread.run(Thread.java:619)


Further reading brought me on to this link : http://community.jboss.org/wiki/ConfigJBossMDB as well as other forum posts which suggests adding <strictTimeout>forever</strictTimeout> to conf/standardjboss.xml as in:


  <container-configuration>

      <container-name>Standard Message Driven Bean</container-name>

      <call-logging>false</call-logging>

      <invoker-proxy-binding-name>message-driven-bean</invoker-proxy-binding-name>

      <container-interceptors>

        <interceptor>org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor</interceptor>

        <interceptor>org.jboss.ejb.plugins.LogInterceptor</interceptor>

        <interceptor>org.jboss.ejb.plugins.RunAsSecurityInterceptor</interceptor>

        <!-- CMT -->

        <interceptor transaction="Container">org.jboss.ejb.plugins.TxInterceptorCMT</interceptor>

        <interceptor transaction="Container">org.jboss.ejb.plugins.CallValidationInterceptor</interceptor>

        <interceptor transaction="Container">org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</interceptor>

        <!-- BMT -->

        <interceptor transaction="Bean">org.jboss.ejb.plugins.MessageDrivenInstanceInterceptor</interceptor>

        <interceptor transaction="Bean">org.jboss.ejb.plugins.MessageDrivenTxInterceptorBMT</interceptor>

        <interceptor transaction="Bean">org.jboss.ejb.plugins.CallValidationInterceptor</interceptor>

        <interceptor>org.jboss.resource.connectionmanager.CachedConnectionInterceptor</interceptor>

      </container-interceptors>

      <instance-pool>org.jboss.ejb.plugins.MessageDrivenInstancePool</instance-pool>

      <instance-cache></instance-cache>

      <persistence-manager></persistence-manager>

      <container-pool-conf>

           <MaximumSize>100</MaximumSize>

           <strictTimeout>forever</strictTimeout>

      </container-pool-conf>

    </container-configuration>

 

Any suggestion on how I to change the pool size used for MDBs using JBoss 4.2.3 correctly.

 

Kind regards

Alex

Reply to this message by going to Community

Start a new discussion in EJB 3.0 at Community