hmm,

on the jvm implementation i personnaly think it is a good implementation
but the unbounded linkedblockingqueue case is not the one for which the
impl was designed IMO that's why it sounds strange i think.

about the conf i prefer to not switch to synchrous queue too easily since
it can blocks too much (could be a pity for sthg asynchronous ;)).

finally between array or linked case the main difference will be the array
case is less tolerant but i agree in an application well configured it
shouldn't make any difference.

*Romain Manni-Bucau*
*Twitter: @rmannibucau*
*Blog: http://rmannibucau.wordpress.com*




2012/8/21 Bjorn Danielsson <bjorn-apa...@lists.cuspycode.com>

> In my opinion this is a bit overkill, at least the options for
> using DelayQueue and PriorityBlockingQueue. They require the
> Runnable queue elements to implement the Delayed and Comparable
> interfaces, respectively. I don't see how to make use of that in
> an EJB method call.
>
> I looked at the Sun ThreadPoolExecutor docs and have now played
> a little with it in a standalone program. I honestly think the
> design is a bit bizarre. I would expect the thread pool to expand
> to max capacity before tasks are put in the wait queue. For the
> purpose of optimizing CPU core utilization, the number of threads
> in the operating system run-queue is the only important number,
> not the number of provisioned threads in a JVM thread pool.
> But this is slightly off-topic here.
>
> I believe it's enough to have just one more configuration
> property for TomEE: AsynchronousPool.QueueSize. If this is 0,
> let the container use a SynchronousQueue. Otherwise use a
> LinkedBlockingQueue with the specified capacity. That way it's
> possible to have any of the three queueing strategies mentioned
> in the ThreadPoolExecutor javadocs. I can't imagine a situation
> where using an ArrayBlockingQueue instead of a bounded
> LinkedBlockingQueue in TomEE really makes a big difference,
> but I could be wrong about that.
>
> --
> Björn Danielsson
> Cuspy Code AB
>
>
> David Blevins <david.blev...@gmail.com> wrote:
> > 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);
> >                 }
> >             }
> >         }
> >     }
>

Reply via email to