如何关闭自托管的Apache CXF Web服务?

And*_*lov 1 java cxf

我有一个控制台应用程序,可以使用此代码简要描述:

public static void main(String[] args) throws InterruptedException {
    JAXRSServerFactoryBean sfb = new JAXRSServerFactoryBean();
    sfb.setResourceClasses(DummyService.class);
    sfb.setResourceProvider(DummyService.class, new SingletonResourceProvider(new DummyServiceImpl()));
    sfb.setProvider(new JacksonJaxbJsonProvider());
    sfb.setAddress("http://0.0.0.0:9000/");
    BindingFactoryManager manager = sfb.getBus().getExtension(BindingFactoryManager.class);
    JAXRSBindingFactory bindingFactory = new JAXRSBindingFactory();
    bindingFactory.setBus(sfb.getBus());
    manager.registerBindingFactory(JAXRSBindingFactory.JAXRS_BINDING_ID, bindingFactory);
    Server server = sfb.create();       
    server.stop(); // here
}
Run Code Online (Sandbox Code Playgroud)

我从Eclipse运行这个程序,我希望它能立即完成,因为我server.stop()最终都是正确的.这行代码由应用程序保持活动状态执行,因此我必须手动关闭它.这是日志CXF打印到控制台:

Aug 13, 2012 10:51:10 PM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the server's publish address to be http://0.0.0.0:9000/
2012-08-13 22:51:10.598:INFO:oejs.Server:jetty-7.5.3.v20111011
2012-08-13 22:51:10.646:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:9000 STARTING
2012-08-13 22:51:10.662:INFO:oejsh.ContextHandler:started o.e.j.s.h.ContextHandler{,null}
2012-08-13 22:51:10.663:INFO:oejsh.ContextHandler:stopped o.e.j.s.h.ContextHandler{,null}
Run Code Online (Sandbox Code Playgroud)

在对server.stop()应用程序的调用仍在运行之后,但是服务器没有响应任何请求,所以我觉得我需要关闭其他东西.

什么是阻止它的正确方法?

更新

server.stop();
server.destroy();
Run Code Online (Sandbox Code Playgroud)

也行不通.

更新

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-bundle-jaxrs</artifactId>
  <version>2.6.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

And*_*lov 7

固定的

server.stop();
server.destroy();
sfb.getBus().shutdown(true)
Run Code Online (Sandbox Code Playgroud)

感觉像脏黑客.

  • CXF 总线有点像一个单例,因此它会一直存在,所以非常小心,因为当您关闭总线时,您可能会关闭它,以便在您的 JVM 中使用它的其他 CXF 服务器。无论如何,上述 + 创建然后在 sfb 中设置我自己的总线修复了在同一个 JVM 实例中销毁和重新创建我的服务器时遇到的各种错误。 (2认同)