You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@aries.apache.org by "Guillaume Nodet (JIRA)" <ji...@apache.org> on 2018/01/30 23:17:00 UTC
[jira] [Resolved] (ARIES-1248) Unable to create bean when passing
subclass of BlockingQueue where argument is of type BlockingQueue and takes
generics.
[ https://issues.apache.org/jira/browse/ARIES-1248?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Guillaume Nodet resolved ARIES-1248.
------------------------------------
Resolution: Fixed
Assignee: Guillaume Nodet
Fix Version/s: blueprint-core-1.9.0
Committing to https://svn.apache.org/repos/asf/aries/trunk ...
A blueprint/blueprint-core/src/test/resources/test-threadpool.xml
M blueprint/blueprint-core/src/test/java/org/apache/aries/blueprint/WiringTest.java
Committed r1822717
> Unable to create bean when passing subclass of BlockingQueue where argument is of type BlockingQueue and takes generics.
> ------------------------------------------------------------------------------------------------------------------------
>
> Key: ARIES-1248
> URL: https://issues.apache.org/jira/browse/ARIES-1248
> Project: Aries
> Issue Type: Bug
> Components: Blueprint
> Reporter: Andrew
> Assignee: Guillaume Nodet
> Priority: Major
> Fix For: blueprint-core-1.9.0
>
>
> Here's a damn silly problem. Given the following code:
> {code:xml}
> <bean id="executorService" class="java.util.concurrent.ThreadPoolExecutor">
> <argument>
> <value>10</value>
> </argument>
> <argument>
> <value>10</value>
> </argument>
> <argument>
> <value>10</value>
> </argument>
> <argument value="SECONDS" />
> <argument>
> <bean class="java.util.concurrent.LinkedBlockingQueue" />
> </argument>
> </bean>
> {code}
> I get the following exception (in part):
> {code}
> Caused by: java.lang.IllegalArgumentException: argument type mismatch
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)[:1.7.0_67]
> at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)[:1.7.0_67]
> at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[:1.7.0_67]
> at java.lang.reflect.Method.invoke(Method.java:606)[:1.7.0_67]
> at org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:297)
> at org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:958)
> at org.apache.aries.blueprint.container.BeanRecipe.getInstance(BeanRecipe.java:313)
> {code}
> Why? Because it's trying to pass a {{LinkedList}} to the method! Given a signature of
> {code:java}
> public ThreadPoolExecutor(int corePoolSize,
> int maximumPoolSize,
> long keepAliveTime,
> TimeUnit unit,
> BlockingQueue<Runnable> workQueue)
> {code}
> That obviously won't work.
> It appears that this is showing up in {{org.apache.aries.blueprint.container.AggregateConverter#convertToCollection}} - line 326, where it creates a *new* collection, rather than using the one I've passed in. Ruh-roh - I've configured a few things on this collection that I don't want to lose, like the maximum size of the queue.
> At a minimum, a few more cases need to be added to CollectionRecipe, plus it needs to accommodate Concurrent collections more - they have a lot of initial configuration, potentially, that needs to be kept. If I specify a maximum queue size of 10 as an argument to LinkedBlockingQueue, but you return a brand-new LinkedBlockingQueue, that will be unbounded - not what I want!
> I can see why you're doing it this way, but it seems like a very, very bad idea. Could it not be modified to return the original collection if it's empty, say?
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)