If you’re stuck with the async startup then the best way to approach this sort 
of thing is to take the “service” bit out of the component and manage the 
service registration lifecycle yourself. It is much less pretty, but at least 
DS can manage the service and configuration dependencies for you.

@Component
public class MyComponent {

  AtomicBoolean active = new AtomicBoolean(false);
  AtomicReference<ServiceRegistration<MyService>> reg = new AtomicReference<>();

  @Reference
  MyDependency myDep;

  @Activate
  BundleContext ctx;
  
  @Activate
  Map<String, Object> config;

  @Activate
  void start() {
    active.set(true);
    new Thread(this::asyncStart).run();
  }

  void asyncStart() {
    MyServiceImpl impl = new MyServiceImpl(myDep);
    impl.longRunningSetup();
    If(active.get()) {
      reg.set(ctx.registerService(MyService.class, impl, new 
Hashtable(config)));
      if(!active.get()) {
        ServiceRegistration sReg = reg.getAndSet(null);
        if(sReg != null) { sReg.unregister(); }
      }
    }
  }

  @Deactivate
  Void stop() {
    active.set(false);
    ServiceRegistration sReg = reg.getAndSet(null);
    if(sReg != null) { sReg.unregister(); }
  }
}


Tim

> On 29 Aug 2020, at 20:16, Steinar Bang <s...@dod.no> wrote:
> 
>>>>>> Steinar Bang <s...@dod.no>:
>> Or maybe I don't have to involve the PreHook at all?
> 
>> The data liquibase file doesn't have to be loaded at the same time as
>> the schema, it can be loaded later.
> 
>> But: the schema must be in place before the data is attempted loaded.
> 
> Not a problem: I can create a separate DS component that listens for the
> DataSource produced by jdbc-config, because that won't become active
> until after the PreHook has done its job.
> 

Reply via email to