Hi Ancoron, Thanks for takin time to answer me.
using bundle as fragment is really new for me, i did not know that exists so I don't know if it is complicated to set. For your question : Doesn't Activiti pick up OSGi services registered as a TaskListener? Yes , but it it should set as "delegate expression" and oviously exposed by blueprint as service, so activiti will pick it up . But in my case it is declard as "class" it means it will be instantiated by activiti at runtime, and this is because this class has attributes which will be set at runtime , I mean during workflow excution. Regards Mohamed 2018-09-24 22:02 GMT+02:00 Ancoron Luciferis < ancoron.lucife...@googlemail.com>: > Hi, > > although this is rather off-topic and should be discussed inside the > Activiti community rather than the general OSGi development list, I > personally have worked with Activiti inside OSGi. > > The key is to get your classes "visible" to the bundle that created the > Job Executor (so most likely the engine). > > A simple way is to provide your classes as Fragment Bundle(s) and attach > them to the engine Bundle as the host. This way, the engine class-loader > will get expanded with your classes. > > Alternatively, you'd have to modify the engine Bundle and add > Dynamic-Imports (which are really deprecated) and have your Bundle > export the packages of your listener classes. > > Doesn't Activiti pick up OSGi services registered as a TaskListener? > That would actually be the proper way of integrating inside a > service-oriented platform like OSGi. > > > Cheers, > > Ancoron > > > On 24/09/18 18:49, Mohamed AFIF via osgi-dev wrote: > > Hello ALL, > > > > I'm facing an issue, and I don't know how to solve it, indeed In our > > project we 're using activiti in karaf , and this is my problematic, > > > > 1- I have bundle A who exposes a webservice using cxf say that the > > webservice class is MyAWebService, and we have a bundle B which contains > > class MyBWebService the sub class of MyAWebService > > (MyAWebService extends MyBWebService ). > > > > 2- in our activiti process we define a Listner > > MyTaskListner(implementing TaskListner) as Class it means it will be > > instanciated by Activiti engine. > > the class listner islocated in bundle B. > > > > Thus when I run my workflow, and when activiti try to instanciate > > MyTaskListner, it throws "can't instanciate...." which is in the real > > NoClassFoundException, > > because the classloader trying to load this class cna not get it, and > > this is why, indeed activiti , because of the ClassDelegate of activit > > when it runs its method > > notify, it trys to instanciate MyTaskListner, and thus to load it using > > the org.activiti.engine.impl.util.ReflectUtil.loadClass() method (code > > below) > > so my problem is that Thread.currentThread().getContextClassLoader() > > returns a BundleDelegatingClassLoader on bundle A , which not contains > > MyTaskListner class. > > > > 1-so my first question is what BundleDelegatingClassLoader does really? > > 2- which workaround could I use to force the > > BundleDelegatingClassLoader to looks to my bundle B > > > > Thanks a lot for your Help > > > > public static Class<?> loadClass(String className) { > > Class<?> clazz = null; > > ClassLoader classLoader = getCustomClassLoader(); > > > > // First exception in chain of classloaders will be used as cause > > when no class is found in any of them > > Throwable throwable = null; > > > > if(classLoader != null) { > > try { > > LOG.trace("Trying to load class with custom classloader: {}", > > className); > > clazz = loadClass(classLoader, className); > > } catch(Throwable t) { > > throwable = t; > > } > > } > > if(clazz == null) { > > try { > > LOG.trace("Trying to load class with current thread context > > classloader: {}", className); > > clazz = loadClass(Thread.currentThread().getContextClassLoader(), > > className); > > } catch(Throwable t) { > > if(throwable == null) { > > throwable = t; > > } > > } > > if(clazz == null) { > > try { > > LOG.trace("Trying to load class with local classloader: {}", > > className); > > clazz = loadClass(ReflectUtil.class.getClassLoader(), > className); > > } catch(Throwable t) { > > if(throwable == null) { > > throwable = t; > > } > > } > > } > > } > > > > if(clazz == null) { > > throw new ActivitiClassLoadingException(className, throwable); > > } > > return clazz; > > } > > > > > > > > > > _______________________________________________ > > OSGi Developer Mail List > > osgi-dev@mail.osgi.org > > https://mail.osgi.org/mailman/listinfo/osgi-dev > > > > -- Cdt Mohamed AFIF
_______________________________________________ OSGi Developer Mail List osgi-dev@mail.osgi.org https://mail.osgi.org/mailman/listinfo/osgi-dev