I've learned that Google calendar API delete event method is not reliable, so other people advised that it is best to loop a few times to ensure all events are deleted. I only loop until the events are deleted.
Also, I had to add a request counter. After every 3 requests, i do a while true until 5 seconds later (using joda time library), reset request counter, and continue processing. That method is called before every delete or add request. That method also checks if last request was more than 5 seconds ago; if more than 5 seconds ago, then no need to while true for 5 seconds. All of this was added within the last week and contributed to the solution of the duplicates issue. ActiveMQ/MDB was only added, so user don't have to wait for Google Calendar to be updated. The stack is really fast; seem to take seconds to update. I'm seeing no more duplicates on the dates that have many events. Still loving TomEE! I consideted ActiveMQ some time ago but finally decided to give it a go and was quite easy to add, all because of TomEE. :-) I get motivated by listening to other people questions, so I'm glad someone asked about ActiveMQ in TomEE, recently. On Mar 12, 2013 3:40 AM, "James Green" <[email protected]> wrote: > Obvious question: if Google rate-limited you, how did you end up posting > duplicates? > > > > On 12 March 2013 01:57, Howard W. Smith, Jr. <[email protected]> > wrote: > > > Wanted to share... > > > > 1. I recently added ActiveMQ logic and dependency (TomEE's simple MDB > > example) to update Google Calendar with data from database as user is in > > web app modifying data; the non-MDB logic worked, but duplicates existed > on > > the Google Calendar, since Google Calendar has limits on # of requests > per > > user (within a matter of seconds) > > > > 2. The new simple MDB implementation resulted in many more duplicate > events > > on the Google Calendar, since messages were processed, asynchronously > > > > 3. This morning, I (FINALLY) fixed the 'duplicate events issue' by > marking > > the GoogleCalendarUtil bean as @Singleton with @Lock(WRITE), adding one > > point of entry (deleteAndAddEvents method marked with @AccessTimeout), > > defined 'deleteEvents' and 'addEventToCalendar' method as private (since > > they were defined as 'public' methods, ever since 'birth'), and > refactored > > throughout the app, accordingly. > > > > Was this the most appropriate fix? Probably not, but I was happy to > develop > > some code based on recommendation(s) that David Blevins shared months > ago. > > :) > > > > > > > > On Fri, Mar 8, 2013 at 9:25 AM, Howard W. Smith, Jr. < > > [email protected] > > > wrote: > > > > > +1 to any/all David Blevin's responses...and of course, the same for > all > > > of Romain's responses as well! > > > > > > Just to share... I remember I used to see a bunch of LOCK exceptions in > > > server log with @Singleton after David advised me to use @Singleton, > but > > I > > > kept tuning the implementation. Now, I have not seen those exceptions > any > > > more in server log. I don't know if it was just a TomEE 1.5.1 bug that > > got > > > fixed in 1.5.2-SNAPSHOT, but recently, I decreased the # of minutes on > > the > > > @Schedule method defined on the only 2 @Singleton beans I have, and > > still, > > > it is performing (very) well and no exceptions in server log. > > > > > > I know this may be a bit unrelated, but still thought I might share. > I'm > > > hoping to add more @Singleton for @Schedule tasks. > > > > > > My code has been working well with @Stateless for the design, which is > > > evident when web application code is generated by NetBeans from > database > > > schema. > > > > > > Entity bean > @Stateless EJB for the entity bean > JSF managed bean > which > > > references @Stateless EJB and entity bean > xhtml page, which > references > > > the JSF managed bean > > > > > > Of course, I have done refactoring to meet requirements. :) > > > > > > This design/implementation has worked for me, in production, while the > > app > > > was running on Glassfish 3.1+ and now with TomEE. > > > > > > > > > On Thu, Mar 7, 2013 at 7:10 PM, David Blevins <[email protected] > > >wrote: > > > > > >> I'd also recommend @Singleton in conjunction with @Lock(READ). > > >> > > >> The @Stateless bean type is good when you explicitly need to limit the > > >> number of instances/concurrent calls. If this sort of limiting is > not a > > >> critical part of the design, then likely @Stateless was used because > > this > > >> is the bean type people tend to use by default. > > >> > > >> Really, @Singleton with @Lock(READ) should be used by default and > other > > >> bean types used only when there is a specific design goal you need to > > >> achieve. > > >> > > >> > > >> -David > > >> > > >> On Mar 6, 2013, at 10:19 AM, Romain Manni-Bucau < > [email protected]> > > >> wrote: > > >> > > >> > In very very heavy load and for a simple app it can be as much as > your > > >> http > > >> > request thread pool size (200 by default) > > >> > > > >> > Note: using @Singleton can help too if you can > > >> > Le 6 mars 2013 18:51, "José Luis Cetina" <[email protected]> a > > >> écrit : > > >> > > > >> >> Really im not sure how many users the webapp could handle, because > > is a > > >> >> public webapp, i will increase the MaxSize to 50 or 100, but for > any > > >> >> "unexpected > > >> >> overload" i will let StrictPooling to false. > > >> >> > > >> >> Do you consider its to much to increase to 50/100 to maxsize?? > > >> >> > > >> >> > > >> >> > > >> >> 2013/3/6 Jean-Louis MONTEIRO <[email protected]> > > >> >> > > >> >>> José, > > >> >>> > > >> >>> The MinSize is not the problem IMO. > > >> >>> The MaxSize is definitely the issue. Do you have more than 10 > > (default > > >> >>> value) simultaneous users? > > >> >>> > > >> >>> The StrictPooling is great to be able to always answer in case of > > >> small > > >> >>> over load. > > >> >>> But, you have to know that after being used, instances will be > > removed > > >> >> and > > >> >>> garbage collected. > > >> >>> > > >> >>> Also, creating instances can be consuming depending on the bean. > > >> >>> > > >> >>> I would recommend not only to set it to true, but before, trying > to > > >> >> define > > >> >>> as much as possible the correct value for MaxSize depending on > your > > >> SLAs. > > >> >>> > > >> >>> Hope it helps > > >> >>> JLouis > > >> >>> > > >> >>> > > >> >>> > > >> >>> > > >> >>> 2013/3/6 José Luis Cetina <[email protected]> > > >> >>> > > >> >>>> Im using 1.6.0-SNAPSHOT. > > >> >>>> > > >> >>>> I will change > > >> >>>> > > >> >>>> StrictPooling = true ==> false > > >> >>>> MinSize = 0 ==> 2 > > >> >>>> > > >> >>>> In stateless section and let you know. > > >> >>>> > > >> >>>> > > >> >>>> > > >> >>>> 2013/3/6 Howard W. Smith, Jr. <[email protected]> > > >> >>>> > > >> >>>>> José, > > >> >>>>> > > >> >>>>> I'm sure the others will ask, are you seeing this with tomee > 1.5.2 > > >> or > > >> >>>> 1.6.0 > > >> >>>>> snapshot? or only seeing on your production server running > tomee > > >> >> 1.5.1 > > >> >>>> or > > >> >>>>> 1.5.2 / 1.6.0 snapshot? > > >> >>>>> > > >> >>>>> Wow, Jean-Louis beat me to it...asking for the TOMEE version. :) > > >> >>>>> > > >> >>>>> Also, i searched google for the following: > > >> >>>>> > > >> >>>>> No instances available in Stateless Session Bean pool > > >> >>>>> > > >> >>>>> and found the following (which is definitely related to > Jean-Louis > > >> >>>>> response): > > >> >>>>> > > >> >>>>> [1] > > >> >>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > http://apache-geronimo.328035.n3.nabble.com/jira-Created-GERONIMO-5455-quot-No-instances-available-in-Stateless-Session-Bean-pool-quot-error-wher-td978236.html > > >> >>>>> > > >> >>>>> [2] > > >> >>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > http://openejb.979440.n4.nabble.com/Query-Regarding-Stateless-Session-Bean-Instance-Pool-Configuration-td980239.html > > >> >>>>> > > >> >>>>> [3] > > >> http://docs.oracle.com/cd/E15051_01/wls/docs103/ejb/session.html > > >> >>>>> > > >> >>>>> > > >> >>>>> Howard > > >> >>>>> > > >> >>>>> > > >> >>>>> On Wed, Mar 6, 2013 at 10:46 AM, José Luis Cetina < > > >> >>> [email protected] > > >> >>>>>> wrote: > > >> >>>>> > > >> >>>>>> Hi im gettin *ConcurrentAccessTimeoutException: No instances > > >> >>> available > > >> >>>> in > > >> >>>>>> Stateless Session Bean pool. Waited 30 SECONDS....* > > >> >>>>>> > > >> >>>>>> Here is the complete log: http://pastebin.ca/2328770 > > >> >>>>>> > > >> >>>>>> Any advice, what could be? Do i have to configure something in > > >> >>>>> tomee.xml?? > > >> >>>>>> > > >> >>>>>> Part of the log: > > >> >>>>>> > > >> >>>>>> > > >> >>>>>> *Mar 05, 2013 9:38:20 PM > > >> >> org.apache.openejb.cdi.CdiAppContextsService > > >> >>>>>> lazyStartSessionContext > > >> >>>>>> WARNING: Could NOT lazily initialize session context because of > > >> >> null > > >> >>>>>> RequestContext > > >> >>>>>> javax.ejb.ConcurrentAccessTimeoutException: No instances > > available > > >> >> in > > >> >>>>>> Stateless Session Bean pool. Waited 30 SECONDS > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.openejb.core.stateless.StatelessInstanceManager.getInstance(StatelessInstanceManager.java:190) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:186) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:256) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:251) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:85) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:279) > > >> >>>>>> at sun.proxy.$Proxy245.getExamenAplicado(Unknown Source) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > com.grupokx.preparatorianos.controller.examendiagnostico.ExamenDiagnosticoMBean.mypostconstruct(ExamenDiagnosticoMBean.java:63) > > >> >>>>>> at sun.reflect.GeneratedMethodAccessor800.invoke(Unknown > Source) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > >> >>>>>> at java.lang.reflect.Method.invoke(Method.java:601) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.tomee.catalina.JavaeeInstanceManager.postConstruct(JavaeeInstanceManager.java:132) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.tomee.catalina.JavaeeInstanceManager.newInstance(JavaeeInstanceManager.java:69) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.config.annotation.Tomcat7AnnotationLifecycleProvider.postConstruct(Tomcat7AnnotationLifecycleProvider.java:94) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.config.ManagedBeanBuilder.buildManagedBean(ManagedBeanBuilder.java:213) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.createManagedBean(ManagedBeanResolver.java:333) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.el.unified.resolver.ManagedBeanResolver.getValue(ManagedBeanResolver.java:296) > > >> >>>>>> at > > >> >> javax.el.CompositeELResolver.getValue(CompositeELResolver.java:58) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.el.unified.resolver.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:179) > > >> >>>>>> at > > >> >> org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:72) > > >> >>>>>> at org.apache.el.parser.AstValue.getValue(AstValue.java:161) > > >> >>>>>> at org.apache.el.parser.AstEqual.getValue(AstEqual.java:38) > > >> >>>>>> at > > >> >>>>> > > >> >>> > > >> > org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:185) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.webbeans.el.WrappedValueExpression.getValue(WrappedValueExpression.java:68) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.view.facelets.el.ContextAwareTagValueExpression.getValue(ContextAwareTagValueExpression.java:96) > > >> >>>>>> at > > >> >>>>> > > >> >>> > > >> > javax.faces.component._DeltaStateHelper.eval(_DeltaStateHelper.java:266) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > javax.faces.component.UIComponentBase.isRendered(UIComponentBase.java:1187) > > >> >>>>>> at > > >> >>>>>> > > >> >>>> > > >> >> > > >> > > javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:494) > > >> >>>>>> at > > >> >>>>>> > > >> >>>> > > >> >> > > >> > > javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541) > > >> >>>>>> at > > >> >>>>>> > > >> >>>> > > >> >> > > >> > > javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541) > > >> >>>>>> at > > >> >>>>>> > > >> >>>> > > >> >> > > >> > > javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:541) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1981) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:285) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116) > > >> >>>>>> at > > >> >>>>>> > > >> >>>> > > >> >> > > >> > > org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:241) > > >> >>>>>> at > javax.faces.webapp.FacesServlet.service(FacesServlet.java:199) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) > > >> >>>>>> at > > >> >>> > org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) > > >> >>>>>> at > > >> >>>>>> > > >> >>>> > > >> >> > > >> > > org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) > > >> >>>>>> at > > >> >> org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > > >> >>>>>> at > > >> >>>>>> > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>> > > >> >> > > >> > > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > > >> >>>>>> at java.lang.Thread.run(Thread.java:722) > > >> >>>>>> * > > >> >>>>>> > > >> >>>>> > > >> >>>> > > >> >>>> > > >> >>>> > > >> >>>> -- > > >> >>>> > ------------------------------------------------------------------- > > >> >>>> *SCJA. José Luis Cetina* > > >> >>>> > ------------------------------------------------------------------- > > >> >>>> > > >> >>> > > >> >>> > > >> >>> > > >> >>> -- > > >> >>> Jean-Louis > > >> >>> > > >> >> > > >> >> > > >> >> > > >> >> -- > > >> >> ------------------------------------------------------------------- > > >> >> *SCJA. José Luis Cetina* > > >> >> ------------------------------------------------------------------- > > >> >> > > >> > > >> > > > > > >
