On 8/9/15 2:08 PM, Phil Steitz wrote: > On 8/9/15 1:52 PM, James Carman wrote: >> Sorry, on my phone and can't see how to post online. My point is that it >> seems silly to reinvent the wheel when it comes to proxies and >> interceptors. That's precisely what Commons Proxy is designed to do. It >> already has pluggable proxy factories. Just use that. > I don't see (yet) how we need a lot more than we already have in > [pool]; but if you can, patches welcome! > > I will go ahead and try to get a simple extension of what we have > now to work so we have something concrete to talk about. > > Phil >> On Sun, Aug 9, 2015 at 4:46 PM Phil Steitz <phil.ste...@gmail.com> wrote: >> >>> Can we please not top-post. Gets hard to follow. >>> >>> On 8/9/15 10:17 AM, James Carman wrote: >>>> Okay, how about this for a proposal? We create a new module in >>>> commons-proxy called commons-proxy-pool which has a nice base class for >>>> folks to be able to create proxy objects to be members of their pool. We >>>> could call it ProxiedPoolableObjectFactory or something like that. >>> Have you looked at the ProxiedObjectPool already in [pool]. It >>> pretty much does what we need. >>> >>>> This >>>> class would have helper methods or whatever to make it easy to create >>> proxy >>>> objects which can include interceptors and what not. Then, commons-pool >>>> doesn't have to know anything about proxies at all. It just continues to >>>> manage a pool of objects of a certain type. The objects just happen to >>> be >>>> proxies that (may or may not) have interceptors. We don't have to worry >>>> about synchronization either. >>> I think there is value in having a configurable interceptor >>> construct integrated with the pool, having access to the pool as >>> well as the pooled object. Have a look at tomcat's jdbc-pool for >>> some examples. That pool *is* a proxy object pool (they don't use >>> delegatingXxx constructs like jdbc does). Sorry, s/jdbc/dbcp above.
Phil >>> For [pool] (and [dbcp]) I >>> would like to keep the proxying configurable (so no registered >>> interceptors means no proxies). >>>> As for the logging (and metrics, etc) solution, I still think a listener >>>> pattern is the way to go. Furthermore, I would suggest we deliver the >>>> "events" asynchronously to avoid slowing down the pool. The events would >>>> be stuff like "object borrowed", "object returned", etc. >>> Agreed, some of that is already in place. Some interceptors may >>> gather stats, though, as part of their function. >>>> On Sun, Aug 9, 2015 at 11:53 AM James Carman <ja...@carmanconsulting.com >>>> >>>> wrote: >>>> >>>>> If you want to decorate the calls to the pooled objects, then use >>> commons >>>>> proxy and a delegator proxy. Let's not bleed into other areas. Let pool >>>>> concentrate on what it does best. >>> Right now, the proxying in ProxiedObjectPool is done by a pluggable >>> proxy source. Currently, a jdk proxy source is provided and a >>> source based on cglib. If you think that the setup there could be >>> improved somehow using Commons Proxy, we can certainly look at it. >>> >>> Phil >>> >>> >>>>> On Sun, Aug 9, 2015 at 11:45 AM James Carman < >>> ja...@carmanconsulting.com> >>>>> wrote: >>>>> >>>>>> I lean toward listeners instead. Much simpler >>>>>> On Sun, Aug 9, 2015 at 11:35 AM Phil Steitz <phil.ste...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> On 8/9/15 8:07 AM, Oliver Heger wrote: >>>>>>>> On 09.08.2015 02:49, James Carman wrote: >>>>>>>>> Yep, same thing I said back in the day. Would we want it to be a >>>>>>>>> true >>>>>>>>> "interceptor" or more of a "listener"? >>>>>>>> Sounds like a usual and interesting feature. IIUC the proposal of >>>>>>>> Phil, it goes more in the direction of interceptors. >>>>>>>> >>>>>>>> A point to keep in mind is how does this feature impact >>>>>>>> synchronization? Can interceptors be invoked outside of >>>>>>>> synchronized blocks? Otherwise, there is a certain risk of >>>>>>>> introducing subtle bugs. Bloch calls this "calling an alien method >>>>>>>> with a lock held". >>>>>>> Thanks, Oliver and very good point on synchronization. This would >>>>>>> require care. The nice thing about pool2 is that we have vastly >>>>>>> reduced the scope of synchronization. Most importantly (actually >>>>>>> since about pool 1.5), factory methods are all outside of sync >>>>>>> blocks and no locks are held on objects checked out by the pool >>>>>>> [1]. That said, we would need to be careful not to create liveness >>>>>>> or performance issues and we would have to provide good >>>>>>> documentation on things to look out for when implementing >>> interceptors. >>>>>>> Phil >>>>>>> >>>>>>> [1] The pool maintenance thread and borrow / return operations do >>>>>>> acquire locks on the PooledObject wrappers used by the pool, but not >>>>>>> on the objects that the interceptors would be working with. >>>>>>> Thread-safety of pool methods should ensure that use of pool >>>>>>> references in interceptors would also be safe. >>>>>>> >>>>>>> >>>>>>>> My 2 cents >>>>>>>> Oliver >>>>>>>> >>>>>>>>> On Sat, Aug 8, 2015 at 8:18 PM Phil Steitz >>>>>>>>> <phil.ste...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> On 8/8/15 5:04 PM, James Carman wrote: >>>>>>>>>>> We talked about this a while back with respect to logging,, >>>>>>>>>>> having a >>>>>>>>>>> PoolListener interface or something. >>>>>>>>>> Right. That could be one use. The nice thing there is the >>>>>>>>>> interceptor could bring in whatever logging / event propagation >>>>>>>>>> infrastructure it wanted to use. >>>>>>>>>> >>>>>>>>>> Phil >>>>>>>>>>> On Sat, Aug 8, 2015 at 7:36 PM Phil Steitz <phil.ste...@gmail.com >>>>>>>>>> wrote: >>>>>>>>>>>> Tomcat's jdbc-pool has an interceptor feature that allows custom >>>>>>>>>>>> code to be inserted into methods called on connections managed by >>>>>>>>>>>> the pool. In [pool], we have the core infrastructure to support >>>>>>>>>>>> this in a generic way via the ProxiedObjectPool. I propose >>>>>>>>>>>> that we >>>>>>>>>>>> extend this to allow users to configure interceptors to be called >>>>>>>>>>>> when registered methods are invoked on checked out objects. I >>>>>>>>>>>> haven't really thought through how configuration would work, but >>>>>>>>>>>> basically clients would register methods and possibly interceptor >>>>>>>>>>>> properties and the interceptors would get references to the >>>>>>>>>>>> method, >>>>>>>>>>>> arguments, pool and pooled object. Configuring interceptors in a >>>>>>>>>>>> GOP or GKOP would cause it to be wrapped in a ProxiedObjectPool. >>>>>>>>>>>> Eventually, we could use this [pool] capability to enable the >>>>>>>>>>>> kind >>>>>>>>>>>> of thing that jdbc-pool provides with its interceptors in DBCP. >>>>>>>>>>>> With [pool] itself, I could see providing method stats >>>>>>>>>>>> collectors, >>>>>>>>>>>> abandoned timer reset (avoiding having to implement use()) and >>>>>>>>>>>> maybe >>>>>>>>>>>> a pooled object properties cache. If there are no objections, I >>>>>>>>>>>> will open a JIRA and start experimenting. >>>>>>>>>>>> >>>>>>>>>>>> Phil >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>>>>>>>> >>>>>>>>>>>> >>> --------------------------------------------------------------------- >>>>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>>>>>> >>>>>>>>>> >>>>>>>> --------------------------------------------------------------------- >>>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>>>> >>>>>>>> >>>>>>> --------------------------------------------------------------------- >>>>>>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>>>>>> For additional commands, e-mail: dev-h...@commons.apache.org >>>>>>> >>>>>>> >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org >>> For additional commands, e-mail: dev-h...@commons.apache.org >>> >>> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org