我想使用在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" );
}
这是服务器启动时的输出。
2015年12月8日上午11:44:59 org.restlet.engine.connector.NetServerHelper 启动
信息:在端口8484上启动内部[HTTPS / 1.1]服务器
2015年12月8日上午11:44:59 org.restlet.Application start
信息:启动de.hsag.services.restlet.application.RestletApplication 应用
是否有选项将其配置为直接将Jetty用作服务器连接器?
更新
正如在下面的答案中提到的那样,确保在激活org.restlet.ext.jetty.jar包之后初始化组件就可以了。 所以我让我的restlet激活器类实现了BundleListener接口,并在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
现在我可以看到自动选择了码头:
> Dec 11, 2015 12:36:23 AM org.restlet.ext.jetty.JettyServerHelper start
> INFO: Starting the Jetty [HTTPS/1.1] server on port 8484
答案 0 :(得分:3)
实际上,在应用程序类路径中放置Restlet扩展jar时,Restlet引擎将自动注册它包含的元素(如服务器)。这是Jetty扩展的情况,也适用于其他扩展。
Restlet将获得第一个可用于特定协议的连接器。
您可以使用以下代码查看已注册的连接器:
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:
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包开始时,不会启动jetty扩展束。您可以利用框架事件来启动组件。这样,你就可以确保每个包都被启动,所以每个restlet扩展也是如此......
希望它可以帮到你, 亨利