openejb-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From David Blevins <david.blev...@gmail.com>
Subject Re: Number of simultaneous @Asynchronous threads
Date Mon, 20 Aug 2012 19:33:51 GMT

On Aug 20, 2012, at 10:55 AM, Romain Manni-Bucau wrote:

> that's because we use a linked blocking queue
> 
> maybe we should make it configurable, not sure...


Made it configurable.  Code is basically:

    public static AsynchronousPool create(AppContext appContext) {
        final Options options = appContext.getOptions();

        final String id = appContext.getId();
        final int corePoolSize = options.get("AsynchronousPool.CorePoolSize", 10);
        final int maximumPoolSize = Math.max(options.get("AsynchronousPool.MaximumPoolSize",
20), corePoolSize);
        final Duration keepAliveTime = options.get("AsynchronousPool.KeepAliveTime", new Duration(60,
TimeUnit.SECONDS));
        final BlockingQueue queue = options.get("AsynchronousPool.QueueType", QueueType.LINKED).create(options);

        return new AsynchronousPool(id, corePoolSize, maximumPoolSize, keepAliveTime, queue);
    }

    private static enum QueueType {
        ARRAY,
        DELAY,
        LINKED,
        PRIORITY,
        SYNCHRONOUS;

        public BlockingQueue create(Options options) {
            switch (this) {
                case ARRAY: {
                    return new ArrayBlockingQueue(options.get("AsynchronousPool.QueueSize",
100));
                }
                case DELAY: {
                    return new DelayQueue();
                }
                case LINKED: {
                    return new LinkedBlockingQueue(options.get("AsynchronousPool.QueueSize",
Integer.MAX_VALUE));
                }
                case PRIORITY: {
                    return new PriorityBlockingQueue();
                }
                case SYNCHRONOUS: {
                    return new SynchronousQueue(options.get("AsynchronousPool.QueueFair",
false));
                }
                default: {
                    // The Options class will throw an error if the user supplies an unknown
enum string
                    // The only way we can reach this is if we add a new QueueType element
and forget to
                    // implement it in the above switch statement.
                    throw new IllegalArgumentException("Unknown QueueType type: " + this);
                }
            }
        }
    }




> 
> 2012/8/20 David Blevins <david.blevins@gmail.com>
> 
>> 
>> On Aug 20, 2012, at 9:23 AM, Bjorn Danielsson wrote:
>> 
>>> I found out that this setting is what causes the exception:
>>> 
>>> AsynchronousPool.KeepAliveTime = 60
>>> 
>>> Without it, everything is fine!
>>> 
>>> I simply added all three properties for testing, though I really
>>> have no need to tweak KeepAliveTime. But just for the sake of
>>> completeness: what's the intended format for that property?
>> 
>> Should be fixed now.  Forgot that the default TimeUnit needed to be
>> supplied in code in case the user did not supply it.  The format looks like
>> this:
>> 
>> http://tomee.apache.org/configuring-durations.html
>> 
>>> Another strange thing that you mentioned earlier Romain, is
>>> that in my tests the pool size never grows to MaximumPoolSize.
>>> It always stays at CorePoolSize. I use test methods that sleep
>>> for 10 seconds and log the timestamps and the Thread names,
>>> and the results are consistent. I even tried spinning instead
>>> of sleeping, but it made no difference.
>> 
>> I've noticed that too in the past.  These arguments go straight into this
>> object:
>> 
>> 
>> http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
>> 
>> The section on "Core and maximum pool sizes" seems to imply that it can
>> grow and shrink, however, I've only ever noticed fixed pool size behavior.
>> 
>> 
>> -David
>> 
>>> Romain Manni-Bucau <rmannibucau@gmail.com> wrote:
>>>> i don't manage to reproduce it,
>>>> 
>>>> i simply put in conf/system.properties:
>>>> 
>>>> AsynchronousPool.CorePoolSize = 50
>>>> AsynchronousPool.MaximumPoolSize = 100
>>>> 
>>>> 
>>>> and in the log i get:
>>>> 
>>>> INFO: Using 'AsynchronousPool.CorePoolSize=50'
>>>> 20 août 2012 16:21:40 org.apache.openejb.util.OptionsLog info
>>>> INFO: Using 'AsynchronousPool.MaximumPoolSize=100'
>>>> 
>>>> and no exception,
>>>> 
>>>> maybe you are not completely up to date?
>>>> 
>>>> *Romain Manni-Bucau*
>>>> *Twitter: @rmannibucau*
>>>> *Blog: http://rmannibucau.wordpress.com*
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 2012/8/20 Bjorn Danielsson <bjorn-apache@lists.cuspycode.com>
>>>> 
>>>>> I built from the latest source (r1374989) and tried the new
>>>>> configuration, but I get strange errors. Just by placing the
>>>>> default values in system.properties in a freshly unpacked
>>>>> TomEE-plus, I got this exception:
>>>>> 
>>>>> INFO: Assembling app: openejb
>>>>> Aug 20, 2012 3:56:28 PM org.apache.openejb.util.OptionsLog info
>>>>> INFO: Using 'AsynchronousPool.CorePoolSize=10'
>>>>> Aug 20, 2012 3:56:28 PM org.apache.openejb.util.OptionsLog info
>>>>> INFO: Using 'AsynchronousPool.MaximumPoolSize=20'
>>>>> Aug 20, 2012 3:56:28 PM org.apache.openejb.util.OptionsLog info
>>>>> INFO: Using 'AsynchronousPool.KeepAliveTime=60'
>>>>> Aug 20, 2012 3:56:28 PM org.apache.openejb.assembler.classic.Assembler
>>>>> destroyApplication
>>>>> INFO: Undeploying app: openejb
>>>>> Aug 20, 2012 3:56:29 PM org.apache.openejb.assembler.classic.Assembler
>>>>> buildContainerSystem
>>>>> SEVERE: Application could not be deployed:  openejb
>>>>> org.apache.openejb.OpenEJBException: Creating application failed:
>> openejb:
>>>>> null
>>>>>       at
>>>>> 
>> org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:929)
>>>>>       at
>>>>> 
>> org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:521)
>>>>>       at
>>>>> 
>> org.apache.openejb.assembler.classic.Assembler.buildContainerSystem(Assembler.java:422)
>>>>>       at
>>>>> 
>> org.apache.openejb.assembler.classic.Assembler.build(Assembler.java:330)
>>>>>       at org.apache.openejb.OpenEJB$Instance.<init>(OpenEJB.java:144)
>>>>>       at org.apache.openejb.OpenEJB.init(OpenEJB.java:290)
>>>>>       at
>>>>> 
>> org.apache.tomee.catalina.TomcatLoader.initialize(TomcatLoader.java:231)
>>>>>       at
>>>>> org.apache.tomee.catalina.TomcatLoader.init(TomcatLoader.java:131)
>>>>>       at
>>>>> 
>> org.apache.tomee.catalina.ServerListener.lifecycleEvent(ServerListener.java:113)
>>>>>       at
>>>>> 
>> org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
>>>>>       at
>>>>> 
>> org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
>>>>>       at
>>>>> 
>> org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:401)
>>>>>       at
>>>>> org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:110)
>>>>>       at org.apache.catalina.startup.Catalina.load(Catalina.java:624)
>>>>>       at org.apache.catalina.startup.Catalina.load(Catalina.java:649)
>>>>>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>>       at
>>>>> 
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
>>>>>       at
>>>>> 
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>>>>       at java.lang.reflect.Method.invoke(Method.java:601)
>>>>>       at
>> org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:281)
>>>>>       at
>> org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
>>>>> Caused by: java.lang.NullPointerException
>>>>>       at
>>>>> 
>> java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:1281)
>>>>>       at
>>>>> 
>> java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:1198)
>>>>>       at
>>>>> 
>> org.apache.openejb.async.AsynchronousPool.<init>(AsynchronousPool.java:51)
>>>>>       at
>>>>> 
>> org.apache.openejb.async.AsynchronousPool.create(AsynchronousPool.java:66)
>>>>>       at
>>>>> 
>> org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:589)
>>>>>       ... 20 more
>>>>> 
>>>>> I also tried deploying my webapp and moved the properties to
>>>>> WEB-INF/application.properties, and that produced a similar
>>>>> exception with the same cause, but for my app instead of openejb
>>>>> and with some differences in the lifecycle call chain.
>>>>> 
>>>>> --
>>>>> Björn Danielsson
>>>>> Cuspy Code AB
>>>>> 
>>>>> 
>>>>> Romain Manni-Bucau <rmannibucau@gmail.com> wrote:
>>>>>> FYI, with last David refactoring the config is a bit different from
>> the
>>>>> one
>>>>>> i did, just to keep a track in this thread (jira is up to date),
>>>>> properties
>>>>>> are and can be put in application.properties (META-INF or WEB-INF):
>>>>>> 
>>>>>> AsynchronousPool.CorePoolSize
>>>>>> AsynchronousPool.MaximumPoolSize
>>>>>> AsynchronousPool.KeepAliveTime
>>>>>> 
>>>>>> *Romain Manni-Bucau*
>>>>>> *Twitter: @rmannibucau*
>>>>>> *Blog: http://rmannibucau.wordpress.com*
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 2012/8/20 zeeman <hamzah0@fastmail.us>
>>>>>> 
>>>>>>> Great, thanks.
>>>>>>> 
>>>>>>> 
>>>>>>> 
>>>>>>> --
>>>>>>> View this message in context:
>>>>>>> 
>>>>> 
>> http://openejb.979440.n4.nabble.com/Number-of-simultaneous-Asynchronous-threads-tp4656891p4656908.html
>>>>>>> Sent from the OpenEJB User mailing list archive at Nabble.com.
>>>>>>> 
>>>>> 
>>> 
>> 
>> 


Mime
View raw message