well from the implementaiton point of the view the difference is:
if (async) {
thread.call(new Runnable() {
public voi run() { business();}
} else {
business();
}
the pooling is the exact same one
Romain Manni-Bucau
Twitter: @rmannibucau
Blog: http://rmannibucau.wordpress.com/
LinkedIn: http://fr.linkedin.com/in/rmannibucau
Github: https://github.com/rmannibucau
2014/1/7 Stuart Easterling <[email protected]>:
> Hi Romain, I think I may need to do that (my current workaround is to use a
> singleton bean and many threads, but I'd like to get my pool working too :
> ). And also I greatly appreciate your providing that sample code, thank you.
>
> There is one other behavior which might shed some light on this: I just
> tried my test code using asynchronous invocation of the business method (as
> you do) and here's what's odd: my container always gives me the 100th
> (last) bean instantiated -- which makes sense to me, since that bean is
> available. Your container, though, seems to grab beans at random from the
> pool.
>
> Does anything pop out to you that might explain this divergent behavior?
> (This seems like two different implementations of the pooling behavior...?)
>
> Best,
> Stuart
>
>
> On Tue, Jan 7, 2014 at 9:35 AM, Romain Manni-Bucau
> <[email protected]>wrote:
>
>> if called through the proxy (as an ejb clientà @Async does the same
>> but in its own threads.
>>
>> Maybe start from my setup and add slowly elements until you hit your
>> setup to find the issue?
>> Romain Manni-Bucau
>> Twitter: @rmannibucau
>> Blog: http://rmannibucau.wordpress.com/
>> LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> Github: https://github.com/rmannibucau
>>
>>
>>
>> 2014/1/7 Stuart Easterling <[email protected]>:
>> > Hi Romain, many thanks for your reply.
>> >
>> > So I have a similar setup (assigning an integer value to each bean
>> > instance, and sleeping the thread in the business method), although I am
>> > looking up and invoking the beans from a commonj WorkManager which is
>> kept
>> > in the ServletContext, and my pool settings are set in tomee.xml. (As
>> in, I
>> > am running from within a web app, using Struts actually.)
>> >
>> > Also it does appear that my TestBean is assigned to the container 'foo'
>> as
>> > the number of bean instances increase and decrease when I adjust the
>> > min/max size of the bean pool and restart the server. However the pool
>> only
>> > provides the last three beans that were instantiated for use by the
>> client.
>> >
>> > One difference -- would this be significant? -- is my business method is
>> > annotated as @Asynchronous.
>> >
>> > Best,
>> > Stuart
>> >
>> >
>> >
>> > On Tue, Jan 7, 2014 at 5:01 AM, Romain Manni-Bucau <
>> [email protected]>wrote:
>> >
>> >> if you have this main:
>> >>
>> >> package org;
>> >>
>> >> import java.util.Properties;
>> >> import java.util.concurrent.ExecutorService;
>> >> import java.util.concurrent.Executors;
>> >> import java.util.concurrent.TimeUnit;
>> >> import javax.ejb.embeddable.EJBContainer;
>> >> import javax.naming.Context;
>> >> import javax.naming.NamingException;
>> >>
>> >> public class Main {
>> >> public static void main(String[] args) throws
>> >> InterruptedException, NamingException {
>> >> final EJBContainer c = EJBContainer.createEJBContainer(new
>> >> Properties() {{
>> >> setProperty("Default Stateless Container.MaxSize", "100");
>> >> }});
>> >> final Context ctx = c.getContext();
>> >> final TestBean bean =
>> >> TestBean.class.cast(ctx.lookup("java:global/test/TestBean"));
>> >>
>> >> final ExecutorService es = Executors.newFixedThreadPool(100);
>> >> for (int i = 0; i < 100; i++) {
>> >> es.submit(new Runnable() {
>> >> @Override
>> >> public void run() {
>> >> bean.foo();
>> >> }
>> >> });
>> >> }
>> >> es.shutdown();
>> >> es.awaitTermination(1, TimeUnit.DAYS);
>> >> c.close();
>> >> }
>> >> }
>> >>
>> >>
>> >> with this TestBean:
>> >>
>> >> package org;
>> >>
>> >> import java.util.concurrent.atomic.AtomicInteger;
>> >> import javax.ejb.Stateless;
>> >>
>> >> @Stateless
>> >> public class TestBean {
>> >> private static final AtomicInteger id = new AtomicInteger(1);
>> >>
>> >> private int i = id.getAndIncrement();
>> >> private boolean done = false;
>> >>
>> >> public void foo() {
>> >> if (!done) {
>> >> System.out.println(">>> " + i);
>> >> }
>> >> try {
>> >> Thread.sleep(200);
>> >> } catch (InterruptedException e) {
>> >> e.printStackTrace();
>> >> }
>> >> }
>> >> }
>> >>
>> >> you get:
>> >>
>> >> >>> 27
>> >> >>> 7
>> >> >>> 35
>> >> >>> 74
>> >> >>> 34
>> >> >>> 88
>> >> >>> 64
>> >> >>> 21
>> >> >>> 63
>> >> >>> 24
>> >> >>> 99
>> >> >>> 57
>> >> >>> 78
>> >> >>> 3
>> >> >>> 36
>> >> >>> 97
>> >> >>> 20
>> >> >>> 86
>> >> >>> 92
>> >> >>> 4
>> >> >>> 96
>> >> >>> 61
>> >> >>> 49
>> >> >>> 47
>> >> >>> 93
>> >> >>> 9
>> >> >>> 22
>> >> >>> 60
>> >> >>> 29
>> >> >>> 13
>> >> >>> 46
>> >> >>> 11
>> >> >>> 66
>> >> >>> 95
>> >> >>> 1
>> >> >>> 68
>> >> >>> 45
>> >> >>> 43
>> >> >>> 54
>> >> >>> 50
>> >> >>> 33
>> >> >>> 44
>> >> >>> 85
>> >> >>> 39
>> >> >>> 79
>> >> >>> 51
>> >> >>> 31
>> >> >>> 87
>> >> >>> 25
>> >> >>> 91
>> >> >>> 42
>> >> >>> 90
>> >> >>> 84
>> >> >>> 59
>> >> >>> 10
>> >> >>> 19
>> >> >>> 62
>> >> >>> 56
>> >> >>> 53
>> >> >>> 6
>> >> >>> 5
>> >> >>> 69
>> >> >>> 83
>> >> >>> 30
>> >> >>> 41
>> >> >>> 26
>> >> >>> 71
>> >> >>> 40
>> >> >>> 67
>> >> >>> 72
>> >> >>> 75
>> >> >>> 23
>> >> >>> 48
>> >> >>> 37
>> >> >>> 38
>> >> >>> 32
>> >> >>> 14
>> >> >>> 8
>> >> >>> 16
>> >> >>> 17
>> >> >>> 12
>> >> >>> 77
>> >> >>> 82
>> >> >>> 89
>> >> >>> 76
>> >> >>> 18
>> >> >>> 70
>> >> >>> 52
>> >> >>> 2
>> >> >>> 100
>> >> >>> 58
>> >> >>> 65
>> >> >>> 94
>> >> >>> 73
>> >> >>> 80
>> >> >>> 55
>> >> >>> 28
>> >> >>> 98
>> >> >>> 15
>> >> >>> 81
>> >>
>> >> Romain Manni-Bucau
>> >> Twitter: @rmannibucau
>> >> Blog: http://rmannibucau.wordpress.com/
>> >> LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> >> Github: https://github.com/rmannibucau
>> >>
>> >>
>> >>
>> >> 2014/1/7 Romain Manni-Bucau <[email protected]>:
>> >> > Hi
>> >> >
>> >> > did you check in the log your container 'foo' is used for TestBean?
>> >> > can you share a project showing this behavior?
>> >> > Romain Manni-Bucau
>> >> > Twitter: @rmannibucau
>> >> > Blog: http://rmannibucau.wordpress.com/
>> >> > LinkedIn: http://fr.linkedin.com/in/rmannibucau
>> >> > Github: https://github.com/rmannibucau
>> >> >
>> >> >
>> >> >
>> >> > 2014/1/6 Stuart Easterling <[email protected]>:
>> >> >> Hi, I am new to Tomee / OpenEJB.
>> >> >>
>> >> >> I am trying to create a pool of 100 stateless local session beans. I
>> >> have
>> >> >> the following in tomee.xml:
>> >> >>
>> >> >> <Container id="foo" type="STATELESS">
>> >> >> minSize = 100
>> >> >> maxSize = 100
>> >> >> </Container>
>> >> >>
>> >> >> In ejb-jar.xml:
>> >> >>
>> >> >> <enterprise-beans>
>> >> >> <session>
>> >> >> <ejb-name>TestBean</ejb-name>
>> >> >> <local-bean/>
>> >> >> <ejb-class>com.foo.test.TestFooBean</ejb-class>
>> >> >> <session-type>Stateless</session-type>
>> >> >> <transaction-type>Bean</transaction-type>
>> >> >> </session>
>> >> >> </enterprise-beans>
>> >> >>
>> >> >> It appears that all 100 beans are properly instantiated.
>> >> >>
>> >> >> However, when I attempt to access them, only three bean instances are
>> >> being
>> >> >> provided by the container, even when the invoking code must wait to
>> gain
>> >> >> access to an instance.
>> >> >>
>> >> >> I have looked through and searched the documentation but haven't been
>> >> able
>> >> >> to resolve the problem. Any insights would be greatly appreciated !
>> >> >>
>> >> >> Best,
>> >> >> Stuart
>> >>
>>