It all depends ... In general state can be managed in many different ways. 
Prototype scope is too much in your face, too much boilerplate, that is why I 
avoid it. It works nicely behind the scenes though like DS and CDI. I do not 
think I've ever used them so far. (Which is a self perpetuating truth, I know.)

PK



> On 11 Mar 2020, at 13:26, Alain Picard <pic...@castortech.com> wrote:
> 
> Peter and Tim,
> 
> Thanks for the pointers. The error was caused by some invalid use of a 
> disposed object. This was using factory components and I switched all of it 
> to use prototype components instead which IMHO are easier to manage.
> 
> And Peter to your question about using prototype scope, those objects contain 
> state and it is my understanding that prototype scope is required in those 
> cases.
> 
> Thanks
> Alain
> 
> 
> On Mon, Mar 2, 2020 at 9:39 AM Peter Kriens <peter.kri...@aqute.biz 
> <mailto:peter.kri...@aqute.biz>> wrote:
> Some remarks:
> 
> * Yes, it is thread safe. In OSGi we mark all thread safe types with the 
> @ThreadSafe annotation.
> * The error message is not in the log you listed. Since the log contains a 
> deactivation message, I hope you're handling the case corrected that you're 
> being called after deactivation? Seems too simple, but anyway ... :-)
> 
> * And for something completely different, is there any reason you use the 
> prototype scope? You real code might need it but for this code it just looks 
> like making it accidentally complex?
> * And last but not least, you seem to be using slf4j? Did you wire up the 
> OSGi log to it? I've seen cases where the information was in the OSGi log but 
> those messages were discarded.
> 
> Kind regards,
> 
>       Peter Kriens
> 
> 
>> On 2 Mar 2020, at 12:03, Alain Picard via osgi-dev <osgi-dev@mail.osgi.org 
>> <mailto:osgi-dev@mail.osgi.org>> wrote:
>> 
>> Question: The method getDiagnosticForEObject can be called by different 
>> threads. Can this be the source of the issue? I see that 
>> ComponentServiceObject is tagged as ThreadSafe, but?
>> 
>> Alain
>> 
>> 
>> On Mon, Mar 2, 2020 at 5:47 AM Alain Picard <pic...@castortech.com 
>> <mailto:pic...@castortech.com>> wrote:
>> Tim,
>> 
>> I don't think so. BaValidationManagerExt is used in only 1 place and it is 
>> instantiated in activate and released in deactivate:
>> @Component(
>> factory = ValidationManager.CONFIG_FACTORY, 
>> service = ValidationManager.class
>> )
>> public final class CoreValidationManager extends 
>> CDODefaultTransactionHandler1 implements ValidationManager, 
>> CDOTransactionHandler2 {
>> ...
>> @Reference(scope=ReferenceScope.PROTOTYPE_REQUIRED)
>> private ComponentServiceObjects<ValidationManagerExt> extenderFactory;
>> private ValidationManagerExt extender;
>> 
>> @Activate
>> private void activate() {
>> log.trace("Activating {}", getClass()); //$NON-NLS-1$
>> 
>> extender = extenderFactory.getService();
>> }
>> 
>> @Deactivate
>> private void deactivate() {
>> log.trace("Deactivating {}", getClass()); //$NON-NLS-1$
>> extenderFactory.ungetService(extender);
>> }
>> 
>> Cheers,
>> Alain
>> 
>> Alain Picard
>> Chief Strategy Officer
>> Castor Technologies Inc
>> o:514-360-7208
>> m:813-787-3424
>> 
>> pic...@castortech.com <mailto:pic...@castortech.com>
>> www.castortech.com <http://www.castortech.com/>
>> 
>> On Mon, Mar 2, 2020 at 3:40 AM Tim Ward <tim.w...@paremus.com 
>> <mailto:tim.w...@paremus.com>> wrote:
>> Hi Alain,
>> 
>> Is it possible that someone has a reference to a BaValidationManagerExt 
>> service instance that they aren’t releasing after ungetting it (or that 
>> they’re holding onto after it has been unregistered)? It might be an SCR 
>> bug, but it’s more likely to be some code holding onto a component instance 
>> that it shouldn’t.
>> 
>> Best Regards,
>> 
>> Tim
>> 
>>> On 29 Feb 2020, at 13:29, Alain Picard via osgi-dev <osgi-dev@mail.osgi.org 
>>> <mailto:osgi-dev@mail.osgi.org>> wrote:
>>> 
>>> Hi
>>> 
>>> I am having a very intermittent issue with getService on a prototype 
>>> component. This is called hundreds of times and I put a breakpoint a few 
>>> weeks ago and have now gotten the error.
>>> 
>>> I have this class:
>>> @Component(scope=ServiceScope.PROTOTYPE,
>>> property= org.osgi.framework.Constants.SERVICE_RANKING + ":Integer=10"
>>> )
>>> public final class BaValidationManagerExt implements ValidationManagerExt {
>>> private final Logger log = LoggerFactory.getLogger(getClass());
>>> 
>>> @Reference(scope = ReferenceScope.PROTOTYPE_REQUIRED)
>>> private ComponentServiceObjects<Validator> validatorFactory;
>>> 
>>> @Activate
>>> private void activate() {
>>> log.trace("Activating {}/{}", getClass(), System.identityHashCode(this)); 
>>> //$NON-NLS-1$
>>> }
>>> 
>>> @Deactivate
>>> private void deactivate() {
>>> log.trace("Deactivating {}/{}", getClass(), System.identityHashCode(this)); 
>>> //$NON-NLS-1$
>>> }
>>> ....
>>> @Override
>>> public Diagnostic getDiagnosticForEObject(EObject eObj) {
>>> log.trace("Getting diagnostic for {}", eObj); //$NON-NLS-1$
>>> Validator validator = validatorFactory.getService();
>>> 
>>> if (validator != null) {
>>> try {
>>> return validator.runValidation(false, Collections.singletonMap(eObj, new 
>>> HashSet<>()),
>>> new NullProgressMonitor()).getB();
>>> }
>>> finally {
>>> validatorFactory.ungetService(validator);
>>> }
>>> }
>>> else {
>>> log.error("Validator Service not found for {}", eObj, new Throwable()); 
>>> //$NON-NLS-1$
>>> return Diagnostic.CANCEL_INSTANCE;
>>> }
>>> }
>>> }
>>> 
>>> and the validator:
>>> @Component(
>>> scope = ServiceScope.PROTOTYPE,
>>> property= org.osgi.framework.Constants.SERVICE_RANKING + ":Integer=10"
>>> )
>>> public final class BaValidator implements Validator {
>>> private final Logger log = LoggerFactory.getLogger(getClass());
>>> 
>>> private Map<EObject, Set<EObject>> elementsToValidate;
>>> private Set<EObject> validated = Sets.newHashSet();
>>> private boolean batch;
>>> 
>>> private EditingDomain domain;
>>> private AdapterFactory adapterFactory;
>>> 
>>> @Reference
>>> private volatile List<ValidationProvider> validationProviders;  //NOSONAR 
>>> as per OSGi 112.3.9.1 
>>> 
>>> @Reference
>>> private ValidationUtils validationUtils;
>>> 
>>> @Activate
>>> private void activate() {
>>> log.trace("Activating {}/{}", getClass(), System.identityHashCode(this)); 
>>> //$NON-NLS-1$
>>> }
>>> 
>>> @Deactivate
>>> private void deactivate() {
>>> log.trace("Deactivating {}/{}", getClass(), System.identityHashCode(this)); 
>>> //$NON-NLS-1$
>>> }
>>> ...
>>> } 
>>> 
>>> The error is on the highlighted line, which happens since getService 
>>> returns null.
>>> 
>>> As can be seen here, ValidatorFactory serviceObjects is null which seems to 
>>> be what makes it return null:
>>> ComponentServiceObjectsImpl [instances=[], serviceObjects=null, 
>>> deactivated=false, hashCode=301166435]
>>> 
>>> I am not seeing any special in the logs (tracing is on). Just before I see 
>>> a number of successful call to the same code with the last one being:
>>> just before in the logs:
>>> 08:00:45.854 [Worker-1: Create Diagram] TRACE c.c.i.v.b.p.BaValidator - 
>>> Activating class 
>>> com.castortech.iris.validation.ba.provider.BaValidator/1297753057
>>> 08:00:45.857 [Worker-1: Create Diagram] TRACE c.c.i.v.b.p.BaValidator - 
>>> Notify 4 listeners with diagnostics ([Diagnostic OK 
>>> source=com.castortech.iris.ba.validation code=0  
>>> data=[RadialDiagramImpl{[cdoID->6558b1f9-dbcf-4e9d-b7b8-73779b5ada8f]
>>> 08:00:45.858 [Worker-1: Create Diagram] TRACE c.c.i.v.b.p.BaValidator - 
>>> Deactivating class 
>>> com.castortech.iris.validation.ba.provider.BaValidator/1297753057
>>> 
>>> 
>>> Has anyone seen this before or can provide some pointers to address and/or 
>>> debug this.
>>> 
>>> Thanks
>>> Alain
>>> 
>>> _______________________________________________
>>> OSGi Developer Mail List
>>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>
>>> https://mail.osgi.org/mailman/listinfo/osgi-dev 
>>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>
>> _______________________________________________
>> OSGi Developer Mail List
>> osgi-dev@mail.osgi.org <mailto:osgi-dev@mail.osgi.org>
>> https://mail.osgi.org/mailman/listinfo/osgi-dev 
>> <https://mail.osgi.org/mailman/listinfo/osgi-dev>

_______________________________________________
OSGi Developer Mail List
osgi-dev@mail.osgi.org
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to