服务osgi
为了使开发有趣,我们将创建两个捆绑包:
- 提供HelloWorld服务的捆绑包
- 消耗该服务以定期间隔打个招呼的捆绑软件。
因此,让我们从第一个捆绑包开始。 我们首先需要的是一个非常简单的服务,在控制台中提供简单的打印:
package com.bw.osgi.provider.able;public interface HelloWorldService {void hello();
}
package com.bw.osgi.provider.impl;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldServiceImpl implements HelloWorldService {@Overridepublic void hello(){System.out.println("Hello World !");}
}
我们再简单不过了。 然后,我们需要使用激活器导出服务:
package com.bw.osgi.provider;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;import com.bw.osgi.provider.able.HelloWorldService;
import com.bw.osgi.provider.impl.HelloWorldServiceImpl;public class ProviderActivator implements BundleActivator {private ServiceRegistration registration;@Overridepublic void start(BundleContext bundleContext) throws Exception {registration = bundleContext.registerService(HelloWorldService.class.getName(),new HelloWorldServiceImpl(),null);}@Overridepublic void stop(BundleContext bundleContext) throws Exception {registration.unregister();}
}
这里有很多代码。 对于那些对OSGi不确定的人,可以做一些解释。 当模块启动时将调用start方法,而在模块停止时将调用stop方法。 在start方法中,我们使用接口名称作为导出服务的名称在包上下文中注册我们的服务。 第三个参数null表示我们不为此服务提供任何配置。 在stop方法中,我们只是取消注册服务。
现在,我们的第一个捆绑包已准备就绪。 我们可以建立它。 为此,我们将使用Maven和maven-bundle-plugin直接构建OSGi Bundle。 这是项目的pom.xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>OSGiDmHelloWorldProvider</groupId><artifactId>OSGiDmHelloWorldProvider</artifactId><version>1.0</version><dependencies><dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.4.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>OSGiDmHelloWorldProvider</Bundle-SymbolicName><Export-Package>com.bw.osgi.provider.able</Export-Package><Bundle-Activator>com.bw.osgi.provider.ProviderActivator</Bundle-Activator><Bundle-Vendor>Baptiste Wicht</Bundle-Vendor></instructions></configuration></plugin></plugins></build>
</project>
然后,使用mvn install进行构建。
我们将在一个名为osgi的文件夹中工作,因此我们会将这个新捆绑包复制到osgi文件夹中。
我们已经可以在OSGi容器中对其进行测试。 如果您还没有Felix,请在这里下载。 您必须选择“ Felix分布”。
然后将其解压缩到我们之前创建的osgi文件夹中。 现在,您必须具有以下文件夹结构:
osgi- felix- OSGiDmHelloWorldProvider-1.0.jar
这样我们就可以进入felix文件夹并启动Felix:
wichtounet@Linux-Desktop:~/Desktop/osgi/felix$ java -jar bin/felix.jar
_______________
Welcome to Apache Felix Gogog!
并安装我们的捆绑包:
g! install file:../OSGiDmHelloWorldProvider-1.0.jar
Bundle ID: 5
该安装已正确安装,我们可以尝试启动它并查看其状态:
g! start 5
g! bundle 5
Location file:../OSGiDmHelloWorldProvider-1.0.jar
State 32
Version 1.0.0
LastModified 1279124741320
Headers [Tool=Bnd-0.0.357, Bundle-Activator=com.bw.osgi.provider.ProviderActivator, Export-Package=com.bw.osgi.provider.able, Build-Jdk=1.6.0_20, Bundle-Version=1.0.0, Created-By=Apache Maven Bundle Plugin, Bundle-ManifestVersion=2, Manifest-Version=1.0, Bundle-Vendor=Baptiste Wicht, Bnd-LastModified=1279124686551, Bundle-Name=Unnamed - OSGiDmHelloWorldProvider:OSGiDmHelloWorldProvider:bundle:1.0, Built-By=wichtounet, Bundle-SymbolicName=OSGiDmHelloWorldProvider, Import-Package=com.bw.osgi.provider.able,org.osgi.framework;version="1.5"]
BundleContext org.apache.felix.framework.BundleContextImpl@2353f67e
BundleId 5
SymbolicName OSGiDmHelloWorldProvider
RegisteredServices [HelloWorldService]
ServicesInUse null
一切都很好。 我们的服务注册良好
现在,我们将尝试在第二个捆绑包中使用此服务。 我们的消费者类别将非常简单:
package com.bw.osgi.consumer;import javax.swing.Timer;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldConsumer implements ActionListener {private final HelloWorldService service;private final Timer timer;public HelloWorldConsumer(HelloWorldService service) {super();this.service = service;timer = new Timer(1000, this);}public void startTimer(){timer.start();}public void stopTimer() {timer.stop();}@Overridepublic void actionPerformed(ActionEvent e) {service.hello();}
}
现在,我们必须创建激活器以获取服务,然后将其提供给消费者。 这将使使用类似这样的东西:
package com.bw.osgi.consumer;import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;import com.bw.osgi.provider.able.HelloWorldService;public class HelloWorldActivator implements BundleActivator {private HelloWorldConsumer consumer;@Overridepublic void start(BundleContext bundleContext) throws Exception {ServiceReference reference = bundleContext.getServiceReference(HelloWorldService.class.getName());consumer = new HelloWorldConsumer((HelloWorldService) bundleContext.getService(reference));consumer.startTimer();}@Overridepublic void stop(BundleContext bundleContext) throws Exception {consumer.stopTimer();}
}
我们使用类的名称从捆绑软件上下文中获得服务引用。 之后,我们从包上下文获取服务实例。
我们还创建了一个小的pom.xml文件来构建捆绑包:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>OSGiDmHelloWorldConsumer</groupId><artifactId>OSGiDmHelloWorldConsumer</artifactId><version>1.0</version><packaging>bundle</packaging><dependencies><dependency><groupId>org.apache.felix</groupId><artifactId>org.osgi.core</artifactId><version>1.0.0</version></dependency><dependency><groupId>OSGiDmHelloWorldProvider</groupId><artifactId>OSGiDmHelloWorldProvider</artifactId><version>1.0</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.0.2</version><configuration><source>1.6</source><target>1.6</target></configuration></plugin><plugin><groupId>org.apache.felix</groupId><artifactId>maven-bundle-plugin</artifactId><extensions>true</extensions><configuration><instructions><Bundle-SymbolicName>OSGiDmHelloWorldConsumer</Bundle-SymbolicName><Bundle-Activator>com.bw.osgi.consumer.HelloWorldActivator</Bundle-Activator><Bundle-Vendor>Baptiste Wicht</Bundle-Vendor></instructions></configuration></plugin></plugins></build>
</project>
然后,我们使用mvn install创建捆绑包,并将其安装在容器中:
g! start 6
g! Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
Hello World !
g! stop 6
至此,我们已经使用OSGi创建了第一个应用程序。 使用该技术,您可以构建真正独立的模块。
在有关OSGi的下一篇文章中,我们将看到如何使用Spring来简化OSGi的开发,并将精力集中在应用程序而非OSGi上。
这两个捆绑包的来源可在此处获取:
- OSGiDmHelloWorldProvider来源
- OSGiDmHelloWorldConsumer
参考: OSGi –简单的Hello World,由JCG合作伙伴 Baptiste Wicht在@Blog(“ Baptiste Wicht”)提供服务 。
- OSGi将Maven与Equinox结合使用
- 真正的模块化Web应用程序:为什么没有开发标准?
- Java模块化方法–模块,模块,模块
翻译自: https://www.javacodegeeks.com/2011/11/osgi-simple-hello-world-with-services.html
服务osgi