gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:06:43 31 4
gpt4 key购买 nike

我想使用在 reSTLet jar 文件中作为扩展提供的 jetty 连接器。我将以下 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" );
}

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

Dec 08, 2015 11:44:59 AM org.restlet.engine.connector.NetServerHelper start

INFO: Starting the internal [HTTPS/1.1] server on port 8484

Dec 08, 2015 11:44:59 AM org.restlet.Application start

INFO: Starting de.hsag.services.restlet.application.RestletApplication application

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

更新:

正如下面的答案中提到的那样,确保在激活 org.reSTLet.ext.jetty.jar 包后初始化组件就可以了。因此,我让我的 reSTLet 激活器类实现了 BundleListener 接口(interface),并在 BundleEvent 显示 jetty 扩展 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

现在我可以看到自动选择了 jetty :

> 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 将获得第一个可用于特定协议(protocol)的可用连接器。

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

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

在我的例子中,我添加了 jetty 扩展 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 的服务器位于第一位。所以启动组件时使用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 时,可能是起始级别的问题。我的意思是 jetty extension bundle 在 reSTLet bundle 启动时没有启动。您可以利用框架事件来启动您的组件。这样,您就可以确定每个 bundle 都已启动,因此每个 reSTLet 扩展也都已启动...

希望对你有帮助,蒂埃里

关于java - 配置 ReSTLet 以在 OSGi 中使用 Jetty 连接器(非简单连接器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34154515/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com