2015-12-08 28 views
2

我想使用在restlet jar文件中作爲擴展提供的jetty連接器。我將下面的jar添加到我的Restlet應用程序包的類路徑中。配置Restlet在OSGi中使用Jetty連接器(非簡單連接器)

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:啓動端口內部[HTTPS/1.1]服務器8484

十二月08,2015年上午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 

回答

3

事實上,把應用程序的類路徑內的的Restlet擴展jar的情況下,發動機的Restlet會自動登記它包含的元素(如服務器)。這是Jetty擴展的情況,也適用於其他擴展。

Restlet將獲得可用於特定協議的第一個可用連接器。

你可以看看使用此代碼註冊接口:

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

在我的情況下,我加入了碼頭擴展JAR文件,我有以下的輸出:

[email protected] 
[email protected] 
[email protected] 
[email protected] 
[email protected] 

正如你可以看到,基於碼頭的服務器處於第一位。因此,在啓動組件時使用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 [email protected]{HTTP/1.1}{0.0.0.0:8182} 
2015-12-08 14:15:55.198:INFO:oejs.Server:main: Started @276ms 

對於您的情況,似乎使用了內部HTTP服務器。你配置正確的方式你的服務器,所以它似乎是一個服務器幫手註冊問題...

當你使用OSGi,它可能是一個開始水平的問題。我的意思是,當restlet bundle啓動時,jetty擴展bundle不會啓動。您可以利用框架事件來啓動您的組件。這樣一來,你會確保每一個bundle啓動所以每次的Restlet擴展,以及...

希望它可以幫助你, 蒂埃裏