日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Karaf教程第2部分使用Configuration Admin服务

發布時間:2023/12/20 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Karaf教程第2部分使用Configuration Admin服务 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文地址? http://blog.csdn.net/wusandi/article/details/78172920

????

? 在Karaf教程的第1部分,我們學習了如何使用mavenblueprint提供和使用pojo服務,如何使用http服務發布servlet

????在第2部分,我們集中精力關注OSGi bundle的配置。不像servlet容器,OSGi容器包含一個非常好的配置規范:來自企業級規范的Config Admin服務。在本教程中,我們將在純OSGiblueprint使用Config Admin服務,學習如何在bundle自動部署配置文件。

????這個教程的練習可以在github上找到:https://github.com/cschneider/Karaf-Tutorial/tree/master/configadmin

2.1 Configuration?Admin服務規范

我們首先快速概覽一下Configuration Admin服務規范。對于我們來說,主要有兩個接口可以使用:

1ConfigurationAdmin:允許獲取和改變配置。這個服務由Config Admin服務實現提供。

2ManagedService:允許對配置改變產生影響。必須實現這個接口,并將它注冊給要被通知的服務。

????所以,基本上在Config Admin服務中的配置是一個字典,這個字典包含了屬性和他們的值。字典由持久性標識PID標識。PID就是一個簡單的字符串,它唯一標識了配置。

2.2 如何處理配置?

????雖然你可以使用ConfigurationAdmin.getConfiguration接口獲取配置,但是我不推薦你這么做。OSGi是動態的,所以有可能發生bundleConfig Admin服務之前啟動或者Config Admin服務還沒有讀取這個bundle的配置。所以有時候你獲取的配置可能為null

????所以,推薦的方式是使用ManagedService,并對更新做出反應。如果你的bundle沒有配置無法啟動,那么在收到第一個更新時創建一個要被配置的pojo類是個好主意。

2.3 介紹要被配置的非常簡單的類

????由于我們想要實現一個整潔風格的配置,那么要被配置的類應該是純pojo。雖然可以簡單的實現ManagedService接口,直接使用Dictionary,但這將使你依賴于OSGi和當前的Config Admin規范。所以,替代做法是我們使用一個具有title熟悉的簡單的bean類。另外,我增加了一個刷新方法,當配置發生改變的時候來調用刷新方法。

[java]?view plaincopy
  • public?class?MyApp?{??
  • ??
  • ????String?title;??
  • ??
  • ????public?void?setTitle(Stringtitle)?{??
  • ??
  • ????????this.title?=title;??
  • ??
  • ????}??
  • ??
  • ????public?void?refresh()?{??
  • ??
  • ?????????System.out.println("Configuration?updated?(title="?+title?+")");??
  • ???
  • ????}??
  • }??



  • 所以我們的目標就是當配置發生改變時,配置title,然后調用refresh方法。我們將在純OSGiblueprint中做這件事。

    2.4 練習一下:使用純OSGi接口處理配置

    ????本教程的第1個練習演示如何只用OSGi接口使用Config Admin服務。雖然這可能不是你以后使用的方式,但這種方式可以幫助你理解更深層次的東西。

    ????你可以在子目錄configapp中找到實現:(https://github.com/cschneider/Karaf-Tutorial/tree/master/configadmin/configapp)

    ????所以首先我們需要一個pom文件用于maven構建。你最好從configapp示例程序的pom文件開始。如果你新建了新的工程,你必須是使用maven-bundle-plugin插件使你的工程成為一個bundle,你需要添加兩個依賴:

    [html]?view plaincopy
  • <dependency>??
  • ??
  • ????<groupId>org.osgi</groupId>??
  • ??
  • ????<artifactId>org.osgi.compendium</artifactId>??
  • ??
  • ????<version>4.2.0</version>??
  • ??
  • </dependency>??
  • ??
  • <dependency>??
  • ??
  • ????<groupId>org.osgi</groupId>??
  • ??
  • ????<artifactId>org.osgi.core</artifactId>??
  • ??
  • ????<version>4.2.0</version>??
  • ??
  • </dependency>??


  • ?

    ????第一個依賴用于獲取config admin服務接口,第二個依賴用于創建Activator,它包含基本的OSGi接口。

    ????現在,我們關心如何更新MyApp類。下面這個類解決了這個問題。我們實現了ManagedService接口,來與Config Admin服務交互。所以無論什么時候,配置發生改變,我們的方法都會被調用。第一件事是檢查是否為null,當config被移除時這是有可能發生的。這時我們可以停止MyApp,但為了簡單起見,我們只是忽略它。下一步是創建MyApp類。通常你可能會在Activator中實例化它,但是你不得不處理空配置,這是我們不希望的。最后是簡單地用從config中獲取的值調用setter方法,在所有的設置完成后再調用refresh方法。

    [java]?view plaincopy
  • private?final?class?ConfigUpdaterimplements?ManagedService?{??
  • ??
  • ????@SuppressWarnings("rawtypes")??
  • ??
  • ????@Override??
  • ??
  • ????public?void?updated(Dictionaryconfig)?throws?ConfigurationException?{??
  • ??
  • ????????if?(config?==null)?{??
  • ??
  • ????????????return;??
  • ????
  • ????????}??
  • ??
  • ????????if?(app?==null)?{??
  • ??
  • ????????????app?=?new?MyApp();??
  • ??
  • ????????}??
  • ??
  • ????????app.setTitle((String)config.get("title"));??
  • ??
  • ????????app.refresh();??
  • ??
  • ????}??
  • ??
  • }??

  • ????當然,這還是什么事情都沒做。最后一步就是在Activator.start方法中注冊ConfigUpdater。我們簡單地使用registerService方法,就像每一個其他的服務一樣。唯一特殊的地方是你必須設置SERVICE_PIDconfig pid,這樣Config Admin服務就知道你想要監視的配置了。

    [java]?view plaincopy
  • Hashtable<String,?Object>?properties?=new?Hashtable<String,?Object>();??
  • ??
  • properties.put(Constants.SERVICE_PID,CONFIG_PID);??
  • ??
  • serviceReg?=?context.registerService(ManagedService.class.getName(),new?ConfigUpdater()?,properties);??

  • 2.5 運行這個簡單的示例

    ?mvn install命令構建這個工程

    ?啟動一個全新的karaf實例

    ?configapp.jartarget目錄復制到Karafdeploy目錄

    ????現在我們注意到似乎沒有發生任何事情。在Karaf控制臺調用list,你會看到這個bundle確實已經啟動了,但是它沒有任何輸出,因為它還沒有配置。我們仍然需要創建配置文件,并設置title

    ?復制已有的文件/configadmin-features/src/main/resources/ConfigApp.cfgKaraf/etc目錄

    ????這里重要的部分是文件名必須是<pid>.cfg。這樣config admin服務才能找到它。

    ????現在fileinstall bundle會在etc目錄檢測到新的文件。由于文件結尾是.cfg,它認為這是一個config admin資源,創建或更新由文件名確定的pidConfig Admin服務配置。

    所以現在在Karaf控制臺你應該能看到下面的打印。這個打印顯示了配置改變被正確地檢測和轉發。如果你現在用編輯器改變了這個文件并保存,那么這個變化也會被傳播。

    ?

    2.6 使用Karaf config命令探究配置

    Karaf控制臺鍵入如下命令:

    ?

    在其他的配置中,你應該找到上面的配置"ConfigApp"。這個配置顯示它從哪兒加載的,pid,當然還有在文件中設置的所有屬性。

    我們也可以改變這個配置:

    ?

    我們看到這個修改直接傳播到了我們的bundle。如果你看看etc下面的配置文件,你會發現這個改變已經持久化到了這個文件。所以如果我們重啟了Karaf,修改還是生效的。

    2.7 使用Blueprint配置

    ????在純OSGi環境中處理了Config Admin服務之后,現在我們將看一看如何在Blueprint中實現同樣的功能。幸運地是,這是相當容易,就Blueprint為我們做的大多數的工作一樣。

    ????我們僅僅定義了一個cm:property-placeholder元素。這個處理文件的屬性占位符的功能很相似,但是這里是處理Config Admin服務。我們需要提供一個配置的PID和更新策略。更新策略我們選擇“reload”。這意味著在配置改變之后,blueprint上下文會被重新加載或反射改變。我們也設置了默認的屬性,當配置的PID找不到或者屬性不存在的時候,就會使用這些默認值。

    ????集成我們的bean類通常是一個簡單的bean定義。在這個類中我們定義了title熟悉,分配一個占位符,這個占位符會使用config admin服務進行解析。唯一特別的是初始化方法。這個給了我們機會以便對配置改變之后做出反應,就像純OSGi示例中一樣。

    對于bluenprint來說,我們不需要任何maven的依賴,因為我們的Java代碼是純Java bean。只要將Blueprint上下文放在OSGI-INF/blueprint目錄中并且blueprint extender加載了,那么blueprint上下文就被會簡單地激活。由于As blueprint總是在Karaf中被加載,所以我們什么都不需要做。

    [html]?view plaincopy
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • ??
  • <blueprint?xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"??
  • ??
  • ?xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"??
  • ??
  • ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ??
  • ?xsi:schemaLocation="??
  • ??
  • ?http://www.osgi.org/xmlns/blueprint/v1.0.0?http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd??
  • ??
  • ?http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0?http://svn.apache.org/repos/asf/aries/trunk/blueprint/blueprint-cm/src/main/resources/org/apache/aries/blueprint/compendium/cm/blueprint-cm-1.1.0.xsd??
  • ??
  • ?">??
  • ??
  • <cm:property-placeholder?persistent-id="ConfigApp"?update-strategy="reload"?>??
  • ??
  • <cm:default-properties>??
  • ??
  • <cm:property?name="title"?value="Default?Title"/>??
  • ??
  • </cm:default-properties>??
  • ??
  • </cm:property-placeholder>??
  • ??
  • ???
  • ??
  • <bean?id="myApp"?class="net.lr.tutorial.configadmin.MyApp"?init-method="refresh">??
  • ??
  • <property?name="title"?value="${title}"></property>??
  • ??
  • </bean>??
  • ??
  • </blueprint>??

  • 2.8 Deploying config files

    在我們成功地使用了Config Admin服務之后,剩下要做的唯一一件事就是部署帶默認配置的bundle。這可以使用Karaf feature文件實現。我們定義一個feature,帶有它需要的bundle,簡單地添加一個configfile元素。這使得Karaf部署給定的文件到Karaf安裝位置的etc目錄。如果這個文件已經存在,那么它不會被覆蓋。

    [html]?view plaincopy
  • <feature?name="tutorial-configadmin"?version="${pom.version}">??
  • ??
  • <bundle>mvn:net.lr.tutorial.configadmin/configapp/${pom.version}</bundle>??
  • ??
  • <bundle>mvn:net.lr.tutorial.configadmin/configapp-blueprint/${pom.version}</bundle>??
  • ??
  • <configfile?finalname="/etc/ConfigApp.cfg">mvn:net.lr.tutorial.configadmin/configadmin-features/${pom.version}/cfg</configfile>??
  • ??
  • </feature>??

  • 這樣,最后一個問題是如何將配置部署到maven,讓configfileonfig元素能夠找到它。這好像屬于Karaf中的the build-helper-maven-plugin的特性。請參見pom文件了解使用細節。

    ?

    2.9 Summing it up and a look into the future

    ????在本教程中,我們學習了如何使用Config Admin服務以及如何在純OSGiblueprint中使用該服務。我們也看到了如何構建和部署我們的工程。

    ????雖然這已經很有用了,但在我看來,有一點點小問題。第一個問題是configfile似乎看起來與config admin不一致。實際上,Karaf不使用config admin服務部署文件。所以我想要看到的是已經存在的config元素不僅僅是為了寫入配置,而且還用于持久化。幸運地是,我的同事Jean Baptiste正在研究這個問題。參見https://issues.apache.org/jira/browse/KARAF-888

    ????另一個問題是對于企業級環境,需要具有附加特性的config admin服務。一件是要可能在整個服務器網絡中進行配置,具有配置的中心源和友好的UI。另一件事是你不僅想要部署默認的配置,而且要部署管理員真正想要為系統進行的配置。所以,我想你能夠定義一個部署計劃,不僅要安裝bundlefeature,還需要配置的改變。如果這個正確的完成,將允許部署、配置改變的良好檢查,也允許管理員一旦在出錯的情況下回滾配置的變化。我希望我們可以在下一個Talend ESB EE發布版中提供這樣的計劃。

    總結

    以上是生活随笔為你收集整理的Karaf教程第2部分使用Configuration Admin服务的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。