在 OSGi 中配置 Restlet 以使用 Jetty 连接器(非简单连接器)

Posted

技术标签:

【中文标题】在 OSGi 中配置 Restlet 以使用 Jetty 连接器(非简单连接器)【英文标题】:Configure Restlet to use Jetty Connector (Not Simple Connector) in OSGi 【发布时间】:2016-03-13 07:00:34 【问题描述】:

我想使用在 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.Application 开始

信息:启动 de.hsag.services.restlet.application.RestletApplication 应用

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

更新:

正如下面的答案中提到的,确保在激活 org.restlet.ext.jetty.jar 包后初始化组件就可以了。 所以我让我的restlet激活器类实现了BundleListener接口并在BundleEvent告诉我码头扩展jar被激活时启动组件。

  @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 );
          ...
      
    
  

另外我为jetty添加了以下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

【问题讨论】:

【参考方案1】:

事实上,当将 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@79a8885fHTTP/1.10.0.0.0:8182
2015-12-08 14:15:55.198:INFO:oejs.Server:main: Started @276ms

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

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

希望对你有帮助 蒂埃里

【讨论】:

以上是关于在 OSGi 中配置 Restlet 以使用 Jetty 连接器(非简单连接器)的主要内容,如果未能解决你的问题,请参考以下文章

osgi (bndtools) 中的 Restlet 包无法启动。激活程序错误 com/sun/net/httpserver/HttpHandler

更改 Restlet 发回的状态码以进行身份​​验证

以编程方式使用 OSGi 中的组件

在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

我如何在RESTlet中加载和编辑客户资料?

Restlet DigestAuthenticator 散列本地密钥