2015-04-22 92 views
3

我想將部署在karaf中的bundle的所有配置文件都部署在karaf文件夾中。我希望當捆綁conf文件發生變化時通知karf。如何在/ etc karaf文件夾中放置bundle配置/屬性文件

我有一個包含多個特徵的分佈,這個特徵是XML的一個特徵。我已經嘗試了幾個例子,我將這個conf文件添加到下面的功能中,但這不起作用。

<feature name="gc-backbone-mqtt" version="${linksmart.gc.version}"> 
    <feature version="${linksmart.gc.version}">gc-backbone-router</feature> 
    <bundle>mvn:org.eclipse.paho/org.eclipse.paho.client.mqttv3/1.0.0</bundle> 
    <feature version="${linksmart.gc.version}">gc-type-tunnelled</feature> 
    <configfile finalname="/etc/mqttBackboneProtocol.cfg">mvn:eu.linksmart.gc/backbone.mqtt.impl/${linksmart.gc.version}/mqttprotocol.properties</configfile> 
    <bundle>mvn:eu.linksmart.gc/backbone.mqtt.impl/${linksmart.gc.version}</bundle> 
</feature> 

一些我已經試過的東西:

http://karaf.922171.n3.nabble.com/OSGi-bundle-configuration-file-td4025438.html

http://www.liquid-reality.de/display/liquid/2011/09/23/Karaf+Tutorial+Part+2+-+Using+the+Configuration+Admin+Service

我不希望將文件與具體路徑複製爲如下所示:

有沒有人知道如何做到這一點?

UPDATE

爲了實現這個配置文件被部署在etc文件夾,以便捆可從外部重新配置,我在3個步驟完成的:

構建配置文件:(Works

爲了使配置文件可以被Maven尋址,我在bundle pom中添加了以下部分。這樣的配置文件是部署在存儲庫:

的pom.xml

<build> 
     <plugins> 
      <plugin> 
       <groupId>org.codehaus.mojo</groupId> 
       <artifactId>build-helper-maven-plugin</artifactId> 
       <executions> 
        <execution> 
         <id>attach-artifacts</id> 
         <phase>package</phase> 
         <goals> 
          <goal>attach-artifact</goal> 
         </goals> 
         <configuration> 
          <artifacts> 
           <artifact> 
            <file>src/main/resources/mqttprotocol.properties</file> 
            <type>cfg</type> 
            <classifier>configuration</classifier> 
           </artifact> 
          </artifacts> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 

     </plugins> 
    </build> 

文件部署在karaf etc工程

要在karaf部署配置文件etc文件夾我在功能文件中添加了<configfile>,如下所示:

features.xml

</feature> 
    <feature name="gc-backbone-mqtt" version="${linksmart.gc.version}"> 
     <feature version="${linksmart.gc.version}">gc-backbone-router</feature> 
     <bundle>mvn:org.eclipse.paho/org.eclipse.paho.client.mqttv3/1.0.0</bundle> 
     <bundle>mvn:org.apache.felix/org.apache.felix.fileinstall/3.2.8</bundle> 
     <configfile finalname="/etc/MQTTBackboneProtocol.cfg">mvn:eu.linksmart.gc/network.backbone.protocol.mqtt.impl/${linksmart.gc.version}/cfg/configuration</configfile> 
     <feature version="${linksmart.gc.version}">gc-type-tunnelled</feature>   <bundle>mvn:eu.linksmart.gc/network.backbone.protocol.mqtt.impl/${linksmart.gc.version}</bundle> 
    </feature> 

捕獲配置變化:(不工作

要捕獲配置文件我添加的代碼你的建議(@Donald_W)的變化。問題是我只得到文件的通知位於文件夾deploy,但不在etc。我調試這段代碼,我發現etc中的文件專門稱爲這些文件的「監聽者」。我不那麼知道我可以成爲部署在etc

回答

0

尤里卡!

正如我在UPDATE中提到的那樣,步驟1(使用maven構建配置文件)和2(部署conf文件etc)正在工作,但軟件包和配置文件未連接。顯然原因是配置文件安裝了另一個PID作爲註冊它的服務。爲了解決這個問題,我將ManageService註冊到部署的可配置文件的PID中。在我的情況看起來如下:

Hashtable <String, Object> properties = new Hashtable<String, Object>(); 
properties.put(Constants.SERVICE_PID, "MQTTBackboneProtocol"); 
context.registerService (ManagedService.class.getName(),this , properties); 

哪裏this是實現ManageService和PID必須是相同的部署配置在etc,在這種情況下"MQTTBackboneProtocol"由於特徵定義表明配置類文件爲:

<configfile finalname="/etc/MQTTBackboneProtocol.cfg">mvn:eu.linksmart.gc/network.backbone.protocol.mqtt.impl/${linksmart.gc.version}/cfg/configuration</configfile> 
2

您可以使用內置到Karaf Felix的文件安裝程序文件時,它會給你的回調文件時etc下更改的監聽器。

一旦你發佈了一個實現ArtifactInstaller到OSGi服務註冊表的服務,它將被FileInstaller - 即Whiteboard pattern檢測到。

<dependency> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>org.apache.felix.fileinstall</artifactId> 
    <version>3.4.2</version> 
    <scope>provided</scope> 
</dependency> 

示例代碼(使用iPojo但藍圖/ DS將工作一樣好)將是:

package com.example.deployer.internal; 

import org.apache.felix.fileinstall.ArtifactInstaller; 
import org.apache.felix.ipojo.annotations.Component; 
import org.apache.felix.ipojo.annotations.Instantiate; 
import org.apache.felix.ipojo.annotations.Provides; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 


@Instantiate() 
@Component(name = "propsDeployer") 
@Provides(specifications = ArtifactInstaller.class) 
public class PropsDeployer implements ArtifactInstaller { 
    Logger logger = LoggerFactory.getLogger(JsonDeployer.class); 

    @Override 
    public void install(File artifact) throws Exception { 
     logOutput("Installing",artifact); 
    } 

    @Override 
    public void update(File artifact) throws Exception { 
     logOutput("Updating",artifact); 
    } 

    @Override 
    public void uninstall(File artifact) throws Exception { 
     logger.info("Uninstalling artifact: {}", artifact.getName()); 
    } 

    @Override 
    public boolean canHandle(File artifact) { 
     return artifact.getName().endsWith(".props"); 
    } 

    private void logOutput(String action, File artifact) throws IOException { 
     logger.info(action + " artifact: {}", artifact.getName()); 
     Properties props = new Properties(); 
     FileReader in = null; 
     try { 
      in = new FileReader(artifact.getCanonicalFile()); 
      props.load(in); 
     } finally { 
      if (in != null) { 
       in.close(); 
      } 
     } 

     // Do whatever you want here: 

     for(Object key: props.keySet()) { 
      logger.info(action + " Property received: {} {}",key,props.get(key)); 
     } 
    } 
} 

應該給你的輸出是這樣的:

2015-04-27 20:16:53,726 | INFO | ime/karaf/deploy | PropsDeployer      | 101 - com.example.scratch.deployer - 1.0.0.SNAPSHOT | Updating artifact: my.json 
2015-04-27 20:16:53,728 | INFO | ime/karaf/deploy | PropsDeployer      | 101 - com.example.scratch.deployer - 1.0.0.SNAPSHOT | Updating Property received: myprop myval 
2015-04-27 20:16:53,728 | INFO | ime/karaf/deploy | PropsDeployer      | 101 - com.example.scratch.deployer - 1.0.0.SNAPSHOT | Updating Property received: hello world 

你需要獨特的文件擴展名。 .cfg將被您稱爲不想使用的ConfigurationAdmin服務捕獲。

.props(如上所述)會做的伎倆。

另外,你真的應該看看使用ConfigurationAdmin。它非常強大。有些命令內置在karaf中用於管理配置,並且您所做的任何更改都會持續到.cfg文件。

+0

它還沒有工作。但我認爲,我將在這方面朝着正確的方向前進。謝謝!儘快讓它工作我給你提問! –

+0

我已經添加了一個清晰的例子,你如何能夠實際訪問神器,它應該有希望幫助你。 –

+0

我試過了,但是得到這個錯誤信息:2015-04-28 09:37:41,105 | '錯誤| ix.fileinstall])| configadmin | 10 - org.apache.felix.configadmin - 1.6.0 |無法使用配置org.apache.felix.fileinstall.26c87fa4-697e-472d-9296-e8c4ab 8a9550 for [org.osgi.service.cm.ManagedServiceFactory,id = 445,bundle = 120/mvn:org.apache.felix/org.apache.felix.fileinstall/3.4.2]:無法識別綁定到mvn的配置:org.apache.felix/org.apache.felix.filein stall/3.2.8' –

相關問題