OSGi簡介–模塊化Java

OSGi聯盟是這一擱淺的管理機構,它始于1999年。其最初目標是為網絡設備創建開放擱淺。 基于此思想,此規范也針對Java引入。 Eclipse在Java中是第一個。 他們于2004年6月推出了基于OSGi的Eclipse IDE。

OSGi是在Java中定義動態模塊的方法。 主要為Java實現的三個OSGi容器是Apache Felix , Eclipse Equinox和Knopflefish 。

為什么選擇OSGi? 因為OSGi提供了將應用程序劃分為多個模塊的能力,并且那些模塊易于與其他依賴項一起管理。 除此之外,它非常容易安裝,更新,停止和刪除沒有停止引擎的模塊(例如:Tomcat Web應用程序容器)。 我們可以使用多種實現方式來影響其他參考。

基于Web的Java框架主要有3個層(表示層,業務層和DAO層)。 在那里,我們可以將其分為三個基于OSGi的模塊。 那么我們可以很容易地將錯誤修復到一層,而不會影響其他錯誤并重新啟動我們的Web容器。 只是我們需要更新模塊。

在OSGi世界中,輸出是捆綁包,可以是Jar或War文件。 捆綁軟件由Java類和其他資源以及一些其他元數據組成(向其他捆綁軟件提供服務和軟件包)。

我將使用Eclipse IDE創建我的第一個捆綁軟件。 因為Eclipse IDe內置了Equinox容器(每個eclipse插件都是OSGi捆綁包)。

創建Eclipse插件項目

  • 轉到新建–>其他–>插件項目 ,然后單擊下一步,將出現新項目創建對話框
  • 提供項目名稱和目標平臺,如下所示。 然后點擊下一步

項目名稱: com.chandana.Hello.HelloWorld
目標平臺:選擇Stranded OSGi

  • 在下一個屏幕中,您可以更改捆綁包信息(這些信息可在MANIFEST.MF中找到,稍后我會提供詳細信息),然后單擊“下一步”按鈕。
  • 之后將出現OSGi項目模板選擇對話框。選擇Hello OSGi Bundle,然后單擊Finish。

幾秒鐘后,Eclipse將生成Hello World Plug-In-Project(我幾秒鐘沒有響應:))

在我的項目結構中是這樣的:

Activator.java

package com.chandana.hello.helloworld;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;public class Activator implements BundleActivator {/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {System.out.println("Hello World!!");}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {System.out.println("Goodbye World!!");}}

Activator是實現BundleActivator的 接口。 它已經停了 然后開始 方法。 ? 當捆綁包啟動或停止時,將調用這些方法 。 此束激活器類在MENIFEST.MF文件( 束激活器條目)中指定。

啟動方法:
捆綁包啟動時,OSGi容器將調用start方法。 我們可以使用此啟動方法進行初始化的數據庫連接,注冊服務以供其他捆綁使用。 停止方式: 捆綁包停止時,OSGi容器調用stop方法。 我們可以使用此方法從服務注冊表中刪除服務,例如清理過程

清單文件

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloWorld
Bundle-SymbolicName: com.chandana.Hello.HelloWorld
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.chandana.hello.helloworld.Activator
Bundle-Vendor: CHANDANA
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"

Bundle-ManifestVersion
Bundle-ManifestVersion標頭顯示OSGi容器,該捆綁包遵循OSGi規范的規則。 值為2表示捆綁軟件符合OSGi規范第4版。 值1表示它符合版本3或更早的版本。

捆綁名稱
Bundle-Name標頭定義捆綁的簡短可讀名稱。

Bundle-SymbolicName
Bundle-SymbolicName標頭指定捆綁包的唯一名稱。 這是您在從其他捆綁包中引用給定捆綁包時將使用的名稱。

捆綁版本
Bundle-Version標頭是捆綁軟件的版本號。

捆綁銷售商
Bundle-Vendor標頭是供應商的描述(例如,這是我的名字)。

進口包裝
Import-Package指示此捆綁包還需要其他Java捆綁包(OSGi)。 我們稱之為依賴性。

出口包裝
導出包指示什么是捆綁包中的公共包,那些導出包可以從其他捆綁包中導入。

運行捆綁包:

  • 對于“運行此項目”,請單擊“運行”->“運行配置”,在OSGi Framework中,右鍵單擊并創建新的“運行配置”。
  • 首先取消選中所有目標平臺,然后單擊“ 添加必需的捆綁包”
  • 之后,單擊“運行”按鈕,應用更改并運行項目。
  • 運行后,項目OSGi控制臺顯示如下。

OSGi終端命令:

開始–啟動指定的捆綁包
停止–停止指定的捆綁包
卸載–卸載指定的捆綁軟件
更新–更新指定的捆綁包
刷新–刷新指定捆綁包的軟件包
b –顯示指定捆綁商品的詳細信息
標頭–打印包標頭
服務–顯示注冊的服務詳細信息

源代碼

接下來,我將描述如何創建基于依賴的OSGi捆綁軟件。

OSGi服務是一個Java對象實例,已向OSGi框架注冊了一組屬性。 可以通過服務注冊表(通過類BundleContext執行)訪問服務。 BundleActivator將在啟動和停止時調用。 當BundleActivator調用start方法時,我們將注冊我們的服務。 之后,任何捆綁包都可以訪問該服務。

服務包:

在服務包中,您需要導出服務,并需要通過服務注冊表進行注冊。 當我們導出服務時,我們僅導出接口包。 與往常一樣,這是從其他捆綁包中隱藏實現。

我已經創建了一個名為HelloService的示例OSGi項目。

清單文件

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: HelloService
Bundle-SymbolicName: com.chandana.hello.HelloService
Bundle-Version: 1.0.0
Bundle-Activator: com.chandana.hello.helloservice.Activator
Bundle-Vendor: CHANDANA
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.3.0"
Export-Package: com.chandana.hello.service
Bundle-ActivationPolicy: lazy

服務接口:

public interface  HelloService {    public String helloMethods();
}

服務實施:

public class HelloServiceImpl implements HelloService {@Overridepublic String helloMethods() {String retValue = "Inside Hello Service method";return retValue;}
}

邊界激活劑:

public class Activator implements BundleActivator {ServiceRegistration serviceRegistration;/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {System.out.println("Bundle Started.....!!!!!");HelloService service = new HelloServiceImpl();serviceRegistration = context.registerService(HelloService.class.getName(), service,null);}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {System.out.println("Bundle Stoped.....!!!!!");serviceRegistration.unregister();}
}

使用發布的服務時,可以從另一個捆綁包中導入它。 因此需要為HelloClient創建另一個插件項目

捆綁內容

捆綁包上下文是OSGi運行時中單個捆綁包的上下文,它是在捆綁包啟動時創建的。 捆綁包上下文可用于安裝新捆綁包,通過其他捆綁包獲取注冊的服務以及在框架中注冊服務。

清單文件

Import-Package: org.osgi.framework;version="1.3.0",com.chandana.hello.service

導入捆綁軟件后,您可以訪問該服務。 重要的是只能通過bundle上下文訪問服務。 您可以通過BundleContext.getService()方法獲取實際的服務對象。

激活器類:

public class Activator implements BundleActivator {ServiceReference serviceReference;     /** (non-Javadoc)* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)*/public void start(BundleContext context) throws Exception {serviceReference= context.getServiceReference(HelloService.class.getName());HelloService helloService =(HelloService)context.getService(serviceReference);System.out.println(helloService.helloMethods());}/** (non-Javadoc)* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)*/public void stop(BundleContext context) throws Exception {context.ungetService(serviceReference);}
}

context.getServiceReference()方法返回HelloService OSGi服務引用,使用該服務引用可以訪問實際的服務對象。

對于“運行此項目”,請單擊“ 運行”->“運行配置” ,在OSGi Framework中,右鍵單擊并創建新的“運行配置” 。 確保HelloServiceHelloClient

問題
如果客戶端訪問服務時未啟動服務,會發生什么情況?
如果您停止了該服務捆綁包,會發生什么?

代碼倉庫
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloService
http://code.google.com/p/osgi-world/source/browse/#svn/trunk/com.chandana.hello.HelloClient

參考:來自JCG合作伙伴的 OSGi(Java模塊化) 簡介和OSGi – 2(OSGi服務)簡介 ? Chandana Napagoda博客上的Chandana Napagoda 。


翻譯自: https://www.javacodegeeks.com/2012/01/introduction-to-osgi-modular-java.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373420.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373420.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373420.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HDU FatMouse's Speed 基本DP

題意:要求找到的體重遞增,速度遞減的老鼠,并且輸出最長的長度數,而且輸出各自的序列數。Special Judge 思路:先按體重由小到大排序,再找最長速度遞減序列。 轉移方程:mou[i].w>mou[j].w&am…

java xmpp openfire_搭建Xmpp服務器Openfire

step1、 安裝java環境這里是檢測是否安裝java的網頁如沒有安裝則進行以下步驟1、下載jdk7的mac版:jdk-7u79-macosx-x64.dmg2、安裝好之后,在命令行進入以下路徑查看#cd /Library/Java/JavaVirtualMachines/3、再查看你自己安裝的版本#ls版本為jdk-8u171-…

JavaFX移動應用程序最佳實踐,第1部分

到現在為止,所有對JavaFX感興趣的人都會知道,JavaFX Mobile發行了不久 前。 可以肯定的是,這真是令人難以置信。 我感到筋疲力盡,在發行期間我什至沒有精力去寫博客…… 但是到目前為止,我感到很恢復,并且希…

Spark程序運行報錯解決(1)

報錯內容:System memory 259522560 must be at least 4.718592E8. Please use a larger heap size. 解決:Window——Preference——Java——Installed JREs——選中一個Jre 后 Edit 在Default VM arguments 里加入:-Xmx512M 轉載于:https://w…

java setsolinger_java socket 的參數選項解讀(轉)

在MulticastSocket的源代碼里有設置多播的方法:public void setInterface(InetAddress inf) throwsSocketException {if(isClosed()) {throw new SocketException("Socket is closed");}checkAddress(inf, "setInterface");synchronized(infLoc…

【轉】Linux終端下 dstat 監控工具

轉自https://linux.cn/article-3215-1.html dstat 是一個可以取代vmstat,iostat,netstat和ifstat這些命令的多功能產品。dstat克服了這些命令的局限并增加了一些另外的功能,增加了監控項,也變得更靈活了。dstat可以很方便監控系統…

Tomcat和IntelliJ –在webapps文件夾之外部署war文件

目前,我正在開發一個Android應用程序,該應用程序需要云中托管的大量REST服務來支持。 我基于對Java,Groovy以及最重要的Spring的支持選擇了Google App Engine 。 我開發了一個基于Spring MVC的REST應用程序,并使用ContentNegotiat…

[HDU1232] 暢通工程 (并查集 or 連通分量)

Input 測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數&#xff0c;分別是城鎮數目N ( < 1000 )和道路數目M&#xff1b;隨后的M行對應M條道路&#xff0c;每行給出一對正整數&#xff0c;分別是該條道路直接連通的兩個城鎮的編號。為簡單起見&#xff0c;城鎮…

java jdbc連接db2數據庫_Java連接db2數據庫(常用數據庫連接五)

1.安裝好db2數據庫&#xff0c;并建立表如下&#xff1a;2.eclipse或myeclipse中建立工程并導入java連接db2所需要的jar包db2java.jar 下載地址&#xff1a;http://download.csdn.net/detail/whzhaochao/64149813.建立iConn接口&#xff0c;代碼如下&#xff1a;package com.zh…

在Windows上,遷移VisualSVN server

最近在搭建自動化測試框架&#xff0c;順便了解了一下SVN的搭建。對于一般的使用場景&#xff0c;VisualSVN還是挺方便的&#xff0c;而且上手特別快。 由于是第一個demo&#xff0c;后期要遷移到其他服務器上面&#xff0c;所以就熟悉了一下server的遷移。以下是一些記錄信息&…

練習腳本三:日志清除

日志清除 #!/bin/bash #清除日志腳本&#xff0c;版本2 LOG_DIR/var/logROOT_UID0 #$UID為0的時候&#xff0c;用戶才具有root用戶的權限#判斷是否使用root用戶來運行 if [ "$UID" -ne "$ROOT_UID" ];thenecho "Must be root to run this script.&qu…

Oracle通過邀請Weaver和Chin推動JavaFX向前發展

我昨天發布了愚人節帖子&#xff0c;內容涉及加入NASA協助探索紅色大行星。 那個帖子與事實相距不遠... NASA開發的技術的所有細節都是100&#xff05;準確的。 哎呀&#xff0c;即使我辭職也是事實&#xff01; 唯一不正確的部分是我將加入的公司。 在NASA協助探索火星的工作也…

java privilege的用法_java反射--注解的定義與運用以及權限攔截

自定義注解類編寫的一些規則:1. Annotation型定義為interface, 所有的Annotation會自動繼承java.lang.Annotation這一接口,并且不能再去繼承別的類或是接口.2. 參數成員只能用public或默認(default)這兩個訪問權修飾3. 參數成員只能用基本類型byte,short,char,int,long,float,d…

WinForm------TextEdit只能輸入數字

代碼: this.textEdit1.Properties.Mask.EditMask "\d"; this.textEdit1.Properties.Mask.MaskType MaskType.RegEx; 轉載于:https://www.cnblogs.com/tianhengblogs/p/6093634.html

mysql使用隨筆

mysql 刪除語句 &#xff1a;delete from 表名 where 條件; 例如 delete from tbuserinfo where id 2;mysql 查詢語句 &#xff1a;select * 列名 from 表名 where 條件;mysql 模糊查詢 &#xff1a; SELECT * FROM 表名 WHERE 列名 LIKE "3%&qu…

JavaFX:創建Sprite動畫

到目前為止&#xff0c;盡管我的大多數文章都涉及JavaFX屬性和綁定&#xff0c;但今天我想寫一講我也致力于JavaFX運行時的另一部分&#xff1a;動畫API。 在本文中&#xff0c;我將解釋如何在JavaFX中編寫自定義動畫&#xff0c;以及如何使用這種方法為Sprite動畫創建類。 &am…

java tick_Java中的Clock tick()方法

可以使用tick()Java中Clock類中的方法在所需的時間范圍內舍入基本時鐘的瞬間。此方法需要兩個參數&#xff0c;即基本時鐘和滴答的持續時間。同樣&#xff0c;返回在所需持續時間內四舍五入的基本時鐘時刻。演示此的程序如下所示-示例import java.time.*;public class Main {pu…

JAVA 常用框架和工具

集成開發工具&#xff08;IDE&#xff09;&#xff1a;Eclipse、MyEclipse、Spring Tool Suite&#xff08;STS&#xff09;、Intellij IDEA、NetBeans、JBuilder、JCreator JAVA服務器&#xff1a;tomcat、jboss、websphere、weblogic、resin、jetty、apusic、apache 負載均衡…

MySQL Doublewrite Buffer及業務評估

1. 關于Doublewrite Buffe的總結 Doublewrite Buffer&#xff1a;Doublewrite Buffer出現的初衷是防止buffer pool中的臟頁刷新到磁盤中&#xff0c;出現部分寫的問題&#xff0c;innodb頁大小一般為16k&#xff0c;而Linux操作系統的block size一般為4k。這樣在刷新的過程中&a…

使用UIBinder的GWT自定義按鈕

這是一個有關如何在GWT上使用UIBinder創建自定義按鈕的示例。 public class GwtUIBinderButton implements EntryPoint {public void onModuleLoad() {Button button new Button();button.setText("Button");button.addClickHandler(new ClickHandler(){Overridepub…