This page explains how you can create an OSGi bundle that contains both Java code and a Spring XML file with the endpoints definition. The example shows a file poller endpoint with a servicemix-bean POJO
Creating the Maven project
First, create and empty directory and add the following pom.xml file. We add the bundle plugin and configure it to import the servicemix-file and servicemix-bean packages as well as the org.apache.servicemix.common.osgi
package
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.apache.servicemix</groupId> <artifactId>osgi-sample</artifactId> <packaging>bundle</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.apache.servicemix</groupId> <artifactId>servicemix-bean</artifactId> <version>2009.01</version> </dependency> </dependencies> <build> <plugins> <!-- configure the bundle plugin with some additional imports --> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.0.0</version> <extensions>true</extensions> <configuration> <instructions> <Import-Package> org.apache.servicemix.file,org.apache.servicemix.bean,org.apache.servicemix.common.osgi,* </Import-Package> </instructions> </configuration> </plugin> <!-- let's use Java 5 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>1.5</target> </configuration> </plugin> </plugins> </build> </project>
Adding the Java source files in src/main/java
We create the Java source files under the src/main/java
folder as usual:
package org.apache.servicemix.pojo; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.servicemix.bean.Property; public class Pojo { private static final Log LOG = LogFactory.getLog(Pojo.class); public void handleFile(@Property(name="org.apache.servicemix.file.name") String name) { LOG.info("Handling file " + name); } }
Adding the Spring XML file to META-INF/spring
in src/main/resources
Any Spring XML file in the META-INF/spring
folder will be automatically loaded and started upon deployment. We add a Spring XML file with our endpoint definitions to this folder. Make sure it includes the org.apache.servicemix.common.osgi.EndpointExporter
that registers the endpoints with the NMR.
<?xml version="1.0" encoding="utf-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:file="http://servicemix.apache.org/file/1.0" xmlns:bean="http://servicemix.apache.org/bean/1.0" xmlns:ns="urn:test:example" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://servicemix.apache.org/file/1.0 http://servicemix.apache.org/file/1.0/servicemix-file.xsd http://servicemix.apache.org/bean/1.0 http://servicemix.apache.org/bean/1.0/servicemix-bean.xsd" > <file:poller service="ns:poller" endpoint="endpoint" targetService="ns:bean" targetEndpoint="endpoint" file="/home/gert/test/poller"/> <bean:endpoint service="ns:bean" endpoint="endpoint" beanClassName="org.apache.servicemix.pojo.Pojo"/> <!-- use this special class to register the endpoints with the NMR --> <bean class="org.apache.servicemix.common.osgi.EndpointExporter" /> </beans>
Build and test
Now, run a mvn clean install
from your project directory to start the Maven build.
[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Building test [INFO] task-segment: [clean, install] [INFO] ------------------------------------------------------------------------ [INFO] [clean:clean] [INFO] Deleting directory /home/gert/Projects/test/target [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. Downloading: http://repo1.maven.org/maven2/org/apache/ws/security/wss4j/1.5.2/wss4j-1.5.2.pom [INFO] [compiler:compile] [INFO] Compiling 1 source file to /home/gert/Projects/test/target/classes ... [INFO] [bundle:bundle] [INFO] [install:install] [INFO] Installing /home/gert/Projects/test/target/test-1.0-SNAPSHOT.jar to /home/gert/.m2/repository/org/apache/servicemix/test/1.0-SNAPSHOT/test-1.0-SNAPSHOT.jar [INFO] [bundle:install] [INFO] Parsing file:/home/gert/.m2/repository/repository.xml [INFO] Installing org/apache/servicemix/test/1.0-SNAPSHOT/test-1.0-SNAPSHOT.jar [INFO] Writing OBR metadata [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 12 seconds [INFO] Finished at: Mon Jun 01 09:05:29 CEST 2009 [INFO] Final Memory: 32M/192M [INFO] ------------------------------------------------------------------------
After the build has finished succesfully, just copy the JAR file you find in the target directory into the ServiceMix 4 deploy
directory. Afterwards, verify that the bundle has been started by typing the osgi/list
command in the ServiceMix 4 console.
smx@root:/> osgi/list START LEVEL 100 ID State Spring Level Name ... [ 158] [Active ] [Started] [ 60] test (1.0.0.SNAPSHOT)