将Restlet配置为在OSGi中使用Jetty连接器(不是简单连接器)

激发

我想使用在restlet jar文件中作为扩展名提供的码头连接器。我将以下jar添加到Restlet应用程序捆绑包的类路径中。

org.restlet.ext.jetty.jar

我将Http或HTTPS服务器添加到如下组件中。

  private Component m_Component = new Component();


  private void addHTTPServer() throws Exception
  {
    m_Component.getServers().add( Protocol.HTTP, 8484 );

  }



  private void addHTTPsServer() throws Exception
  {
    File keystore = new File( m_KeyStoreFile );
    Server server = m_Component.getServers().add( Protocol.HTTPS, 8484 ); 

    Series<Parameter> parameters = server.getContext().getParameters();
    parameters.add( "keystorePath", keystore.toPath().toString() );
    parameters.add( "keystorePassword", "Localstorepass" );
    parameters.add( "keystoreType", "JKS" );
    parameters.add( "keyPassword", "Localkeypass" );
  }

这是服务器启动时的输出。

2015年12月8日,上午11:44:59 org.restlet.engine.connector.NetServerHelper开始

INFO:在端口8484上启动内部[HTTPS / 1.1]服务器

2015年12月8日,上午11:44:59 org.restlet。申请开始

INFO:启动de.hsag.services.restlet.application.RestletApplication应用程序

是否可以将其配置为直接使用Jetty作为服务器连接器?

更新:

正如在下面的答案中提到的那样,请确保在激活org.restlet.ext.jetty.jar捆绑包后初始化组件,从而达到了目的。因此,我使Restlet激活器类实现了BundleListener接口,并在BundleEvent向我显示码头扩展罐被激活时启动了该组件。

  @Override
  public void bundleChanged( BundleEvent event )
  {
    if( event.getBundle().getSymbolicName().equalsIgnoreCase( "org.restlet.ext.jetty" ) ) {
      if( event.getBundle().getState() == Bundle.ACTIVE ) {
          private Component m_Component = new Component();
          m_Component.getServers().add( Protocol.HTTP, 8484 );
          ...
      }
    }
  }

另外,我为码头添加了以下jar文件。

javax.servlet.jar

org.eclipse.jetty.http.jar

org.eclipse.jetty.io.jar

org.eclipse.jetty.server.jar

org.eclipse.jetty.util.jar

现在,我可以看到自动选择了码头:

> Dec 11, 2015 12:36:23 AM org.restlet.ext.jetty.JettyServerHelper start
> INFO: Starting the Jetty [HTTPS/1.1] server on port 8484
蒂埃里圣堂武士

实际上,将Restlet扩展jar放在应用程序类路径中时,Restlet引擎将自动注册其包含的元素(如服务器)。Jetty扩展就是这种情况,其他扩展也是如此。

Restlet将获得适用于特定协议的第一个可用连接器。

您可以使用以下代码查看注册的连接器:

List<ConnectorHelper<Server>> servers
        = Engine.getInstance().getRegisteredServers();
for (ConnectorHelper<Server> server : servers) {
    system.out.println(server);
}

就我而言,我添加了码头扩展JAR文件,并且具有以下输出:

org.restlet.ext.jetty.HttpServerHelper@12c042ba
org.restlet.ext.jetty.HttpsServerHelper@c5ccaf4
org.restlet.engine.local.RiapServerHelper@20105f83
org.restlet.engine.connector.HttpServerHelper@12eea1e7
org.restlet.engine.connector.HttpsServerHelper@70c74e66

如您所见,基于码头的服务器处于第一位置。因此,在启动组件时将使用Jetty:

2015-12-08 14:15:55.102:INFO::main: Logging initialized @178ms
Starting the Jetty [HTTP/1.1] server on port 8182
2015-12-08 14:15:55.163:INFO:oejs.Server:main: jetty-9.2.6.v20141205
2015-12-08 14:15:55.198:INFO:oejs.ServerConnector:main: Started ServerConnector@79a8885f{HTTP/1.1}{0.0.0.0:8182}
2015-12-08 14:15:55.198:INFO:oejs.Server:main: Started @276ms

在您的情况下,似乎使用了内部HTTP服务器。您以正确的方式配置了服务器,因此这似乎是服务器助手注册问题...

使用OSGi时,可能是入门级的问题。我的意思是,restlet捆绑包启动时码头扩展包未启动。您可以利用框架事件来启动组件。这样,您将确保每个捆绑包都已启动,因此每个restlet扩展也都将启动...

希望对您有帮助,蒂埃里

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章