Thank you Marcel This is helpful in getting me pointing in the right direction. So just to recap.
Option 1 in your email is the traditional approach where you have aop pointcuts, etc. defined Option 2 is intercepting the calls and dynamically weaves in code...something akin to asm bytecode weaving? Once again thankyou for your reply Ivanhoe On Wed, Mar 31, 2010 at 9:21 AM, Marcel Offermans < [email protected]> wrote: > Hello Ivanhoe, > > How to best do AOP in an OSGi environment in general is an interesting > question. I think there's two roads you can take here: > > 1) the more "traditional" way of doing AOP with tools like AspectJ, > instrumenting bundle implementations > > 2) AOP at the OSGi service level, "intercepting" existing services and > adding aspects that way > > Both have their advantages and disadvantages, but I am a big fan of doing > it the last way, because it seems more in touch with the OSGi way of doing > things: not exposing implementations, only sharing services and their > versioned packages. So using this mechanism, you can intercept existing > services and basically add a new service on top of it. By specifying > priorities you can even chain aspects and determine their ordering and best > of all, this process is completely dynamic: you can add or remove aspects > because they can be packaged as separate bundles and even when you update > underlying services, the aspects will just as happily work on top of the > updated services. > > Actually, I have recently been working on adding support for that form of > aspect orientation to the Dependency Manager so you can easily add aspects > to existing services (this is still only available in trunk, not in a > released version). > > An example, let's say use Servlets using the whiteboard pattern and want to > add an aspect that simply counts the number of invocations to each servlet, > you could set that up like this: > > /** The Bundle Activator for your aspect bundle. */ > public class Activator extends DependencyActivatorBase { > public void init(BundleContext bc, DependencyManager dm) throws Exception > { > dm.add(createAspectService(Servlet.class, null, 1, ServletAspect.class, > null)); > } > } > > Basically the code above says: for any Servlet service that appears in the > registry, create an aspect with a service ranking of 1 that is implemented > by an instance of ServletAspect (that is instantiated for every service). > > /** The aspect implementation. */ > public class ServletAspect implements Servlet { > volatile Servlet m_servlet; > > private long m_counter; > public void service(ServletRequest req, ServletResponse res) { > synchronized (this) { m_counter++; } > m_servlet.service(req, res); > } > /* implement the other methods of Servlet... */ > } > > And this part implements the aspect. It obviously needs to implement the > same service, and it gets injected with the real service so you can delegate > to it once you've added whatever you wanted to do in your aspect (such as > increment a counter in the example). > > That's all there is to it. > > Greetings, Marcel > > > On Mar 31, 2010, at 8:49 , Ivanhoe Abrahams wrote: > > > Hi Teemu > > > > Thank you for your reply > > > > To be honest, I have not started any experiments yet, > > No I do not want to instrument the container itself, > > My immediate experimnent would be to gather some performance > > metrics/monitoring using AspectJ for my bundles. > > I think forget about me mentioning dynamic proxies as this is NOT what I > > want. > > > > I was thinking more about problems that others might have encountered in > > this area, ESPECIALLY classloading restrictions. If any, if there are no > > real issues in this area the great. > > > > In some of the previous messages about this topic there was mention about > > possibly implementing something similar to the "Equinox-specific hooks to > > perform load-time weaving" as this was probably also needed for JPA > hooks. > > Any informatioon about this would be helpful. > > > > Once again, I have not started any experimentation yet. > > My question is more centered around how to go about this. What are > other's > > experience with AOP and OSGI. > > > > I am not sure how to start. I am dithering a bit. > > Ivanhoe > > > > > > On Tue, Mar 30, 2010 at 1:33 PM, teemu kanstren <[email protected]> > wrote: > > > >> Hello, > >> > >> What do you expect to be the difference? What are the results of your > >> experiments in this regard? Are you instrumenting the container or a set > of > >> bundles? You talk about possibility of using a Proxy, what do you plan > to > >> use it for? > >> > >> I guess some things can depend on your instrumentation code. My guess is > >> that you could have some classloader issues with multiple bundles > sharing > >> some global aspects if you want something like that. But depends on what > >> you > >> want to do and also trying it out will tell you the best.. > >> > >> Teemu > >> > >> > >> 2010/3/30 Ivanhoe Abrahams <[email protected]> > >> > >>> Hi all > >>> > >>> I am looking around for the "correct" way for using AOP in OSGI. > >>> I dont have concrete examples right yet, but basically I would > eventually > >>> want to use either Load time weaving OR dynamic proxies, > >>> preferably with AspectJ, but I dont mind using other AOP frameworks.... > >>> However I do want to use it in a way that is "standard", in other words > >> it > >>> should work in at least Felix and Equinox and others if possible. > >>> > >>> I see there is already a a thread discussing AOP and Felix but it does > >> not > >>> seem to give any answers. > >>> Google also does not provide any goodness on this topic. At lest not > that > >> I > >>> have found. > >>> > >>> So what would be the correct way to implement AOP in OSGI based an > >> system? > >>> > >>> Thank you in advance > >>> Ivanhoe > >>> > >> > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > >

