Shutdown um contêiner OSGi depois de algum código foi executado (para criar uma ferramenta de linha de comando)

Jmini:

Eu gostaria de criar uma ferramenta de linha de comando que inicia uma estrutura OSGi, para reutilização de código que está confiando em OSGi.

Na resposta acessando argumentos de linha de comando do pacote OSGi , eu tenho como posso ler os argumentos de linha de comando:

@Component
public class Example {

    String[] args;

    @Activate
    void activate() {
        System.out.println("Hello World");
        System.out.println(args.length + " args:");
        for (String s : args) {
            System.out.println(" - " + s);
        }
    }

    @Reference(target = "(launcher.arguments=*)")
    void args(Object object, Map<String, Object> map) {
        if (map.containsKey("launcher.arguments")) {
            args = (String[]) map.get("launcher.arguments");
        } else {
            args = new String[] {};
        }
    }
}

Mas agora quando eu executo o frasco montado ( bnd-export-maven-plugin) como este:

java -jar <path-to>/application.jar lorem ipsum

Eu obter o resultado esperado, mas a aplicação não termina.

Depois de ter lido 4.2.6 Parando um quadro , eu estava pensando que eu preciso chamar stop()o pacote do sistema. Tentei alterar o código para:

@Activate
void activate(BundleContext bundleContext) {
    System.out.println("Hello World");
    System.out.println(args.length + " args:");
    for (String s : args) {
        System.out.println(" - " + s);
    }
    try {
        bundleContext.getBundle().stop();
    } catch (BundleException e) {
        e.printStackTrace();
    }
}

Mas isso não parece funcionar assim.

Peter Kriens:

Se quiser que o pacote sistema pare você deve fazer (notar a 0):

 bundleContext.getBundle(0).stop();

Para fazer isso hiper corretamente, você deve fazer isso em outro segmento.

@Component
public class ServiceComponent {

    @Activate
    void activate(BundleContext c) {
        CompletableFuture.runAsync( ()-> {
            try {
                c.getBundle(0).stop();
            } catch (BundleException e) {
                e.printStackTrace();
            }
        } );        
    }
}

Este é, naturalmente, um componente de suicídio ...

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=363905&siteId=1
Recomendado
Clasificación