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 <[email protected]> wrote:
>
>>>>>> Steinar Bang <[email protected]>:
>> 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.
>