Hi David,

In addition to interrupting the worker thread (which is a good idea). There are 
a couple of useful things that you can do using the support from 
java.util.concurrent. For example, setting a closed state:


@Component
public class MyClass {

    private final AtomicBoolean closed = new AtomicBoolean();

    @Activate
    void start() {
        new Thread(this::longStart).run()
    }


    @Deactivate
    void stop() {
        closed.set(true);
    }

    void longStart() {
        for(int i = 0; i < 1000000; i++) {
            if(closed.get()) {
                break;
            }
            doSomething();
        }
    }
}

Also if your references are dynamic then you should treat them carefully

@Component
public class MyClass implements MySlowService {

    private final AtomicReference<MyService> myRef = new AtomicReference<>();

    @Reference(policy=DYNAMIC)
    void setReference(MyService service) {
        myRef.set(service)
    }

    void unsetReference(MyService service) {
        // Note that it is *not* safe to just do a set null, see Compendium 
112.5.12
        myRef.compareAndSet(service, null);
    }

    public void longRunningTask() {
        for(int i = 0; i < 1000000; i++) {
            // This only works if the service object is not stateful, otherwise 
we need
            // to do a check and throw away an intermediate invalidated result
            
            MyService myService = myRef.get();
            doSomethingWithMyService(myService);
        }
    }
}

I hope you find these helpful.

Tim

> On 1 Aug 2018, at 05:44, David Leangen via osgi-dev <osgi-dev@mail.osgi.org> 
> wrote:
> 
> 
> Hi!
> 
> I am running into a situation where, what I think is happening is:
> 
> Component A gets instantiated
> Component B
>  - references A
>  - gets satisfied once A is satisfied 
>  - kicks off a long-running process when one of its methods are called
>  - the long-running process is run in a different thread, with a Promise
> Component A is no longer satisfied
> But
>  - the long-running process is still running
>  - the long-running process now references an invalid Component A
>  - the long-running thread fails because of the invalid state of Component A
> Component B is no longer satisfied
> 
> 
> So, the long-running component messes things up, but its component has not 
> yet shut down even though its process is still happily running in another 
> thread.
> 
> I can think of two possible solutions, but not sure which is best and not 
> sure how to implement:
> 
> 1) Figure out a way to share an ExecutorService between “related” components 
> so that when one component 
>      shuts down it will signal to the other related components that their 
> threads are now interrupted
> 
> 2) In the long-running process, determine if the component that provides the 
> required service
>       is still active before continuing with the havoc-wreaking process
> 
> 
> Does this sound about right?
> 
> How would I actually accomplish either of these?
> 
> 
> Thanks!
> =David
> 
> 
> _______________________________________________
> 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