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
www.castortech.com


On Mon, Mar 2, 2020 at 3:40 AM Tim Ward <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> 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
> 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