Pergunta

O Servidor HTTP embutido no JDK 6 é uma grande ajuda para desenvolver serviços web, mas eu tenho situação onde eu publicou um Endpoint e, em seguida, o código caiu e deixou o servidor em execução.

Como você desligar o servidor incorporado uma vez que você perdeu a referência a ele (ou o Endpoint publicado)?

Nenhuma solução correta

Outras dicas

Eu uso o código abaixo para iniciá-lo

    this.httpServer = HttpServer.create(addr, 0);
    HttpContext context = this.httpServer.createContext("/", new DocumentProcessHandler());
    this.httpThreadPool = Executors.newFixedThreadPool(this.noOfThreads);
    this.httpServer.setExecutor(this.httpThreadPool);
    this.httpServer.start();

e abaixo do código de pará-lo

        this.httpServer.stop(1);
        this.httpThreadPool.shutdownNow();

Eu nunca usei este servidor antes e não consigo encontrar qualquer documentação boa. Talvez estas soluções menos elegantes ter ocorrido a você já, mas eu apenas pensei que eu iria mencioná-los.

Parece que com.sun.net.httpserver.HttpServer tem uma classe de implementação chamado HttpServerImpl. Ele tem um método chamado stop ().

Ou talvez você pode encontrar a escuta da linha no soquete do servidor e chamar interrupção ().

Sean

Como cerca de não perder a referência, então? Quando você dizer suas falhas no código, eu suponho que você obter um lugar exceção. Onde exatamente? Então, alguém capaz de interceptar essa exceção, obviamente, precisa também ter uma referência para o httpserver, que você pode ter que passar em torno de si mesmo.

Editar : Oh. Nesse caso, se você não quer matar toda a JVM com o httpserver nele, então você terá de oferecer algum tipo de IPC para o meio ambiente, por exemplo, um canal de comando através de RMI que pode ser invocada a partir de um programa Java (e, portanto, Ant).

Outra solução seria a de ter o servidor escutar alguma consulta cookie "segredo", onde por exemplo imprimir / salvar o cookie no arranque para que o script Ant pode recuperar o cookie, e você pode disparar uma consulta para o seu URL "segredo" sobre a qual o servidor irá sair-se graciosamente.

Eu iria com uma solução RMI rápida.

netstat -a

para encontrar o pid do processo que tem o aberto porta (supondo que você sabe o porto), e

kill -9 $pid

para matar o processo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top