...
Note | ||
---|---|---|
| ||
This tutorial is a work in progress and the last parts is not yet complete. Please check back for updates |
Tip | ||
---|---|---|
| ||
NOTE: Before beginning this tutorial, please take the time to read the FAQ entry titled Should I Create My Own JBI Components?. It is very important that you understand the reason for developing a JBI service engine and this FAQ entry will explain this. |
This tutorial describes how to create a very simple Hello World style of JBI service engine. This tutorial is as minimalistic as possible so as to focus on key concepts and not drown in details. The Hello World component will respond to all requests with the message:
Panel | |
---|---|
|
The following sections will walk through the creation, packaging, testing and deployment of the Hello World service engine.
Prerequisites
- Maven 2.0.4 7 or higher
- If you have never used Maven previously the Maven Getting Started Guide explains some valuable concepts surrounding Maven
- ServiceMix 3.2.1 -incubating or higher
- See the ServiceMix downloads to grab a nightly build as ServiceMix 3.1 has not yet been released
- A broadband internet connection so Maven can automatically download dependencies
...
Panel |
---|
$ mvn archetype:create \ |
The command The command above will create a directory named hello-world-se
that houses a Maven project for the JBI service engine being created here. The name of the directory is taken from the artifactId
parameter.
The first three parameters to the mvn
command (-DarchetypeGroupId=org.apache.servicemix.tooling -DarchetypeArtifactId=servicemix-service-engine -DarchetypeVersion=3.2.1-incubating) identify which Maven archetype to use for the archetype:create
goal, while the last two parameters (-DgroupId=org.apache.servicemix.samples.helloworld.se -DartifactId=hello-world-se) uniquely identify the Maven project that is being generated. The groupId
is used as the Java package and the artifactId
is used as the project name. Therefore, only alphanumeric characters are valid values for the groupId
and artifactId
parameters. The very last parameter tells Maven to look at the Incubator repository at the ASF. Because Incubator policy disallows incubating projects to publish artifacts outside of the Incubator repository, the remoteRepositories
system property tells Maven to use the Incubator repository.
Tip |
---|
The value of the |
...
No Format |
---|
[INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'archetype'. [INFO] ---------------------------------------------------------------------------- [INFO] Building Maven Default Project [INFO] task-segment: [archetype:create] (aggregator-style) [INFO] ---------------------------------------------------------------------------- [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. [INFO] Setting property: velocimacro.messages.on => 'false'. [INFO] Setting property: resource.loader => 'classpath'. [INFO] Setting property: resource.manager.logwhenfound => 'false'. [INFO] ************************************************************** [INFO] Starting Jakarta Velocity v1.4 [INFO] RuntimeInstance initializing. [INFO] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties [INFO] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl) [INFO] Resource Loader Instantiated: org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader [INFO] ClasspathResourceLoader : initialization starting. [INFO] ClasspathResourceLoader : initialization complete. [INFO] ResourceCache : initialized. (class org.apache.velocity.runtime.resource.ResourceCacheImpl) [INFO] Default ResourceManager initialization complete. [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Literal [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Macro [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Parse [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Include [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach [INFO] Created: 20 parsers. [INFO] Velocimacro : initialization starting. [INFO] Velocimacro : adding VMs from VM library template : VM_global_library.vm [ERROR] ResourceManager : unable to find resource 'VM_global_library.vm' in any resource loader. [INFO] Velocimacro : error using VM library template VM_global_library.vm : org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'VM_global_library.vm' [INFO] Velocimacro : VM library template macro registration complete. [INFO] Velocimacro : allowInline = true : VMs can be defined inline in templates [INFO] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions [INFO] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed. [INFO] Velocimacro : initialization complete. [INFO] Velocity successfully started. [INFO] [archetype:create] [INFO] Defaulting package to group ID: org.apache.servicemix.samples.helloworld.se [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating Archetype: servicemix-service-engine:3.2.1-incubating [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: org.apache.servicemix.samples.helloworld.se [INFO] Parameter: packageName, Value: org.apache.servicemix.samples.helloworld.se [INFO] Parameter: basedir, Value: /Users/bsnyder/src/hello-world-smx [INFO] Parameter: package, Value: org.apache.servicemix.samples.helloworld.se [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] Parameter: artifactId, Value: hello-world-se [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 63,column 16] : ${servicemix-version} is not a valid reference. [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 68,column 16] : ${servicemix-version} is not a valid reference. [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 83,column 18] : ${servicemix-version} is not a valid reference. [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 94,column 18] : ${xbean-version} is not a valid reference. [INFO] ********************* End of debug info from resources from generated POM *********************** [INFO] Archetype created in dir: /Users/bsnyder/src/hello-world-smx/hello-world-se [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2 seconds [INFO] Finished at: Mon Jan 15 13:04:08 MST 2007 [INFO] Final Memory: 4M/8M [INFO] ------------------------------------------------------------------------ |
...
pom.xml
- This is the Maven POM] file. This XML file contains all the metadata related to the project so Maven can carry out its functionality.
MyBootstrap.java
- Implementsjavax.jbi.component.Boostrap
which is called by the JBI container as part of the component lifecycle (i.e.g, when the component is installed and uninstalled). This is where you place logic to set up and tear down things when the component is started and stopped. This class is not longer needed
MyComponent.java
- Extends theDefaultComponent
, a convenience class that makes creating JBI components much easier and provides some additional lifecycle management of components deployed to the JBI container. This class should be fleshed out by overriding methods in theDefaultComponent
to configure and initialize the component.
...
Code Block |
---|
public void process(MessageExchange exchange) throws Exception { // The component acts as a provider, this means that another component has requested our service // As this exchange is active, this is either an in or a fault (out are send by this component) if (exchange.getRole() == MessageExchange.Role.PROVIDER) { // Check here if the mep is supported by this component if (exchange instanceof InOut == false) { throw new UnsupportedOperationException("Unsupported MEP: " + exchange.getPattern()); } // InNOTE: message Added check for DONE/ERROR status -- Jeff Peterson if (exchange.getMessage("in") != null) { // TODO: FIX in archetype NormalizedMessage in = exchange.getMessage("in"); // Exchange is finished // TODO ... handle the in message if (exchange.getStatus() == ExchangeStatus.DONE) { return; // If the MEP is an InOnly, RobustInOnly, you have// toExchange sethas thebeen exchangeaborted towith DONEan statusexception } // else, you have to create an Out message and populate it if (exchange.getStatus() == ExchangeStatus.ERROR) { return; // For now, just echo back // Exchange is active NormalizedMessage out} = exchange.createMessage();else { out.setContent(in.getContent()); // In message if (exchange.setMessagegetMessage(out, "outin"); != channel.send(exchange);null) { // Fault message NormalizedMessage in } else if (= exchange.getFaultgetMessage("in"); != null) { // TODO ... handle the in faultmessage exchange.setStatus(ExchangeStatus.DONE); // If the MEP is an InOnly, RobustInOnly, you have to set the channel.send(exchange);exchange to DONE status // This is not compliant with the default MEPs // else, you have to create an Out message and populate it } else { throw new IllegalStateException("Provider exchange is ACTIVE, but no in or fault is provided"); // For now, just echo back } NormalizedMessage out = exchange.createMessage(); // The component acts as a consumer, this means this exchange is received because out.setContent(in.getContent()); // we sent it to another component. As it is active, this is either an exchange.setMessage(out or a fault , "out"); // If this component does not create / send exchanges, you may just throw an UnsupportedOperationException channel.send(exchange); } else if (exchange.getRole() == MessageExchange.Role.CONSUMER) { // Fault message // Exchange is finished } else if (exchange.getStatusgetFault() !== ExchangeStatus.DONEnull) { return; // TODO ... handle the fault // Exchange has been aborted with an exception } else if (exchange.getStatussetStatus(ExchangeStatus.DONE); == ExchangeStatus.ERROR) { returnchannel.send(exchange); // ExchangeThis is active not compliant with the default MEPs } else { // Out message throw new IllegalStateException("Provider exchange is ACTIVE, but no in or fault if (exchange.getMessage("outis provided"); != null) { } // TODO ... handle the response} // The component acts as a consumer, this means this exchange is exchange.setStatus(ExchangeStatus.DONE);received because // we sent it to another component. As it is channel.send(exchange); active, this is either an out or a fault // FaultIf message this component does not create / send exchanges, you may just throw an UnsupportedOperationException } else if (exchange.getFaultgetRole() !== nullMessageExchange.Role.CONSUMER) { // Exchange is finished // TODO ... handle the fault if (exchange.getStatus() == ExchangeStatus.DONE) { exchange.setStatus(ExchangeStatus.DONE)return; // Exchange has been aborted with channel.send(exchange);an exception } else if // This is not compliant with the default MEPs (exchange.getStatus() == ExchangeStatus.ERROR) { return; } else { // Exchange is active } throwelse new IllegalStateException("Consumer exchange is ACTIVE, but no out or fault is provided"); { // Out message }if (exchange.getMessage("out") != null) { } // Unknown role TODO ... handle the response } else { exchange.setStatus(ExchangeStatus.DONE); throw new IllegalStateException("Unkown role: " + exchangechannel.getRolesend(exchange)); } // Fault message } |
The implementation of the method above was provided by the servicemix-service-engine Maven archetype. This method is very generic and contains a conditional block for handling either a consumer or a provider role. But this method will still require us to make the decision of which style of Message Exchange Pattern (MEP) to handle. In the case of the Hello World SE, we know that it is a provider so it will need to send a return message. Therefore it will need to handle an In-Out MEP. So instead of having MyEndpoint
extend the very basic Endpoint
class and implement its own process()
method, we're going to extend a different class that is specifically for provider endpoints named
ProviderEndpoint
.
Notice the diagram above showing the class hierarchy of Endpoint
. The ProviderEndpoint
supplies some additional conveniences for provider components beyond what the Endpoint
class provides and will make the job of implementing MyEndpoint
as a provider much easier. So let's make some changes to the MyEndpoint
class. First remove the process()
method shown above. Second, change the definition of the MyEndpoint
class from this:
Code Block |
---|
public class MyEndpoint extends Endpoint implements ExchangeProcessor
|
to this:
Code Block |
---|
public class MyEndpoint extends ProviderEndpoint implements ExchangeProcessor
|
By the way, making this change will require the import of the full class (org.apache.servicemix.common.endpoints.ProviderEndpoint
). This class can be found in the servicemix-common project.
Third, because the ProviderEndpoint.process()
method already handles an In-Out MEP (and other MEPs), MyEndpoint
will simply need to override the ProviderEndpoint.processInOut()
method. Below is the content for implementing this method. Copy/paste this method:
Code Block |
---|
protected void processInOut(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws Exception {
SourceTransformer sourceTransformer = new SourceTransformer();
String inMessage = sourceTransformer.toString(in.getContent());
out.setContent(new StringSource("<hello>Hello World! Message [" + inMessage + "] contains [" + inMessage.getBytes().length + "] bytes</hello>."));
}
|
Adding this method will require the import of the following classes:
org.apache.servicemix.jbi.jaxp.SourceTransformer
org.apache.servicemix.jbi.jaxp.StringSource
These classes can be found in the servicemix-core project.
This method is the custom functionality for the Hello World SE. We're not doing anything complex here at all in order to keep this tutorial very simple. Apache Ode was mentioned earlier as an example of an engine that can be deployed as a JBI SE, this class is where Ode would be referenced and called. If you're interested to see how Ode is called, see the BPEEndpoint class for the details. Now it's time to test the Hello World SE.
Testing the Hello World Component
Thanks to the archetype, testing the component is very easy because it already created a test. The only change we'll make is to the string being sent by the client code. In the src/test/java
directory is the org.apache.servicemix.samples.helloworld.se.MySpringComponentTest
test. Simply open this test and change line #36 from this:
Code Block |
---|
me.getInMessage().setContent(new StringSource("<hello>world</hello>"));
|
to something more meaningful, like this:
Code Block |
---|
me.getInMessage().setContent(new StringSource("<hello>Ski Colorado!</hello>"));
|
To execute the test, simply run the Maven install
goal from within the hello-world-se
directory like so:
Code Block |
---|
$ mvn install
|
Below is the output that will print to the console:
...
else if (exchange.getFault() != null) {
// TODO ... handle the fault
exchange.setStatus(ExchangeStatus.DONE);
channel.send(exchange);
// This is not compliant with the default MEPs
} else {
throw new IllegalStateException("Consumer exchange is ACTIVE, but no out or fault is provided");
}
}
// Unknown role
} else {
throw new IllegalStateException("Unkown role: " + exchange.getRole());
}
}
|
The implementation of the method above was provided by the servicemix-service-engine Maven archetype. This method is very generic and contains a conditional block for handling either a consumer or a provider role. But this method will still require us to make the decision of which style of Message Exchange Pattern (MEP) to handle. In the case of the Hello World SE, we know that it is a provider so it will need to send a return message. Therefore it will need to handle an In-Out MEP. So instead of having MyEndpoint
extend the very basic Endpoint
class and implement its own process()
method, we're going to extend a different class that is specifically for provider endpoints named
ProviderEndpoint
.
Notice the diagram above showing the class hierarchy of Endpoint
. The ProviderEndpoint
supplies some additional conveniences for provider components beyond what the Endpoint
class provides and will make the job of implementing MyEndpoint
as a provider much easier. So let's make some changes to the MyEndpoint
class. First remove the process()
method shown above. Second, change the definition of the MyEndpoint
class from this:
Code Block |
---|
public class MyEndpoint extends Endpoint implements ExchangeProcessor
|
to this:
Code Block |
---|
public class MyEndpoint extends ProviderEndpoint implements ExchangeProcessor
|
By the way, making this change will require the import of the full class (org.apache.servicemix.common.endpoints.ProviderEndpoint
). This class can be found in the servicemix-common project.
Third, because the ProviderEndpoint.process()
method already handles an In-Out MEP (and other MEPs), MyEndpoint
will simply need to override the ProviderEndpoint.processInOut()
method. Below is the content for implementing this method. Copy/paste this method:
Code Block |
---|
protected void processInOut(MessageExchange exchange, NormalizedMessage in, NormalizedMessage out) throws Exception {
SourceTransformer sourceTransformer = new SourceTransformer();
String inMessage = sourceTransformer.toString(in.getContent());
out.setContent(new StringSource("<hello>Hello World! Message [" + inMessage + "] contains [" + inMessage.getBytes().length + "] bytes</hello>."));
}
|
Tip | ||
---|---|---|
| ||
NOTE: You may have problems running above code. In this case remove <? ... ?> string from inMessage. ServiceMix validates XML on every step. So simple concatenating of two xml message will not work. |
Adding this method will require the import of the following classes:
org.apache.servicemix.jbi.jaxp.SourceTransformer
org.apache.servicemix.jbi.jaxp.StringSource
These classes can be found in the servicemix-core project.
This method is the custom functionality for the Hello World SE. We're not doing anything complex here at all in order to keep this tutorial very simple. Apache Ode was mentioned earlier as an example of an engine that can be deployed as a JBI SE, this class is where Ode would be referenced and called. If you're interested to see how Ode is called, see the BPEEndpoint class for the details. Now it's time to test the Hello World SE.
Testing the Hello World Component
Thanks to the archetype, testing the component is very easy because it already created a test. The only change we'll make is to the string being sent by the client code. In the src/test/java
directory is the org.apache.servicemix.samples.helloworld.se.MySpringComponentTest
test. Simply open this test and change line #36 from this:
Code Block |
---|
me.getInMessage().setContent(new StringSource("<hello>world</hello>"));
|
to something more meaningful, like this:
Code Block |
---|
me.getInMessage().setContent(new StringSource("<hello>Ski Colorado!</hello>"));
|
To execute the test, simply run the Maven install
goal from within the hello-world-se
directory like so:
Code Block |
---|
$ mvn install
|
Below is the output that will print to the console:
No Format |
---|
[INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [install] [INFO] ---------------------------------------------------------------------------- [INFO] [xbean:mapping {execution: default}] Checking: org.apache.servicemix.samples.helloworld.se.MyComponent Checking: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld.se/1.0 for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 handler mapping: /1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Nothing to compile - all classes are up to date [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running xbean/META-INF/spring.handlers for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld.se/1.MySpringComponentTest <hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes</hello>. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.487 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar0 [INFO] Generating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd.html for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se-1.0-SNAPSHOT.jar [INFO] [jbi:jbi-component].xsd for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating installer WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.jar [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT-schema.html [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] ---------.xsd.wiki for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Nothing to compile - all classes are up to date [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/surefire-reports --------------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO] T E S T S ------------------------------------------------------------------------ [INFO] Total time: 16 seconds [INFO] Finished at: Mon Jan 15 13:19:51 MST 2007 [INFO] Final Memory: 13M/24M [INFO] ------------------------------------------------------------------------ |
Wiki Markup |
---|
Notice that not only do we see that the build was successful, but also note the text in the output above that was printed by the test (*<hello>Hello World! Message \[<hello>Ski Colorado!</hello>\] contains \[28\] bytes.</hello>*). This is the message we were expecting to be output from the test. So if you see this, you just wrote a JBI component and tested it successfully. Now this SU needs to be wrapped in a SA so it can be deployed to the JBI container. |
Deploying the Component
...
Running org.apache.servicemix.samples.helloworld.se.MySpringComponentTest <hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes</hello>. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.487 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT.jar [INFO] [jbi:jbi-component] [INFO] Generating installer /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.jar [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT-schema.html [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip |
...
to
/Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT-installer.zip
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 16 seconds
[INFO] Finished at: Mon Jan 15 13:19:51 MST 2007
[INFO] Final Memory: 13M/24M
[INFO] ------------------------------------------------------------------------
|
Notice that not only do we see that the build was successful, but also note the text in the output above that was printed by the test (<hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes.</hello>). This is the message we were expecting to be output from the test. So if you see this, you just wrote a JBI component and tested it successfully. Now this SU needs to be wrapped in a SA so it can be deployed to the JBI container.
Deploying the Component
Now it's time to deploy this component to the JBI container. Because the component was just built above, you should now see a filed named hello-world-se-1.0-SNAPSHOT-installer.zip
in the target directory of the project. This is the component all packaged up and ready to be deployed. To deploy the component, simply copy the ZIP file to the ServiceMix install
directory. You can do this before starting ServiceMix or while ServiceMix is running.
As long as the component deploys properly, you're now ready to create a deploy a configuration for the component.
Deploying a Service Unit That Depends Upon the Component
In order to actually make use of the component, you will need to deploy a configuration for the component. Once JBI components are deployed to the JBI container, they're just hanging out there waiting for a configuration to be deployed to them. This is why JBI is often referred to as a container of containers. The JBI container accepts deployment of JBI components and JBI components accept deployment of service units (SUs) that configure them. This is very similar to the way RAR files work in JavaEE-land. RAR files are generic components that are deployed to the JavaEE container that accept the deployment of a configuration file to tell it how to run. This is exactly how JBI components work. To achieve this, you need to create a JBI SU that depends on the JBI component in it's pom.xml
file and to deploy the SU to the JBI container as well.
In the case of the Hello World SE, we're lucky that there are no configuration options really, so all we need to do is create SU that depends on the Hello World SE and deploy that. To do this, use the command below:
Panel |
---|
$ cd .. |
This creates a directory named hello-world-su
. Now edit the hello-world-su/pom.xml
file to add the following dependency on the Hello World SE:
Code Block | ||||
---|---|---|---|---|
| ||||
<dependency>
<groupId>org.apache.servicemix.samples.helloworld.se</groupId>
<artifactId>hello-world-se</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
|
This tells Maven that the hello-world-su project depends upon the hello-world-se project. After compiling the hello-world-su, copy the JAR file to the ServiceMix deploy
directory. As long as it starts up without error, you're ready to begin sending messages to it.
Configure hello-world-su
Create a file hello-world-su/src/main/resources/xbean.xml
with the following contents:
Code Block | ||||
---|---|---|---|---|
| ||||
<beans xmlns:hwse="http://org.apache.servicemix.samples.helloworld.se/1.0"
xmlns:xyz="http://companyxyz.com">
<hwse:endpoint service="xyz:helloWorld" endpoint="helloWorld"/>
</beans>
|
Info |
---|
TODO: explain |
Create a Service Unit for HTTP Binding Component
This service unit will configure the servicemix-http binding component so we can issue some soap-over-http requests for testing purposes.
Code Block |
---|
$ mvn archetype:create \
|
As long as the component deploys properly, you're now ready to create a deploy a configuration for the component.
Deploying a Service Unit That Depends Upon the Component
In order to actually make use of the component, you will need to deploy a configuration for the component. Once JBI components are deployed to the JBI container, they're just hanging out there waiting for a configuration to be deployed to them. This is why JBI is often referred to as a container of containers. The JBI container accepts deployment of JBI components and JBI components accept deployment of service units (SUs) that configure them. This is very similar to the way RAR files work in JavaEE-land. RAR files are generic components that are deployed to the JavaEE container that accept the deployment of a configuration file to tell it how to run. This is exactly how JBI components work. To achieve this, you need to create a JBI SU that depends on the JBI component in it's pom.xml
file and to deploy the SU to the JBI container as well.
In the case of the Hello World SE, we're lucky that there are no configuration options really, so all we need to do is create SU that depends on the Hello World SE and deploy that. To do this, use the command below:
Panel |
---|
$ mvn archetype:create \-DarchetypeGroupId=org.apache.servicemix.tooling \ -DarchetypeArtifactId=servicemix-http-consumer-service-unit \ -DarchetypeVersion=3.2.1-incubating \ -DgroupId=org.apache.servicemix.samples.helloworld.se \ -DartifactId=hello-world-su \ -DremoteRepositories= http ://people.apache.org/repo/m2-incubating-repository![]() |
This create a directory named hello-world-su
. Now edit the pom.xml
file to add the following dependency on the Hello World SE:
Panel |
---|
<dependency> |
This tells Maven that the hello-world-su project depends upon the hello-world-se project. After compiling the hello-world-su, copy the JAR file to the ServiceMix deploy
directory. As long as it starts up without error, you're ready to begin sending messages to it.
This is a work in progress
Incorporating the Projects Into a Top Level POM
Now that we have created the SU and SA projects, a top level pom.xml
must be manually created and made aware of each subproject. This will allow all the projects to be built automatically without having to build each project in order manually. Maven will discover all the projects and build them in the proper order. In the hello-world-se
directory, create a file named pom.xml
containing the following content:
-su
|
There should now be a hello-world-http-su directory under hello-world-smx.
Configure hello-world-http-su
Create configuration for http binding component in hello-world-http-su/src/main/resources/xbean.xml
Code Block | ||||
---|---|---|---|---|
| ||||
Code Block | ||||
<?xml version="1.0" encoding="UTF-8"?> <project<beans 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.samples.helloworld</groupId> <artifactId>hello-world-smx</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <name>Hello World JBI Component</name> <modules> <module>hello-world-sa</module> <module>hello-world-se</module> </modules> </project> |
This POM will allow the example to be easily folded in to the ServiceMix samples. The <modules>
element denotes the other projects that were created above using the Maven archetypes. Once the pom.xml
file from above is saved into the hello-world-smx
directory, you should now see the following:
Code Block |
---|
$ ls
hello-world-sa hello-world-se pom.xml
|
All projects can now be built using the following command on the command-line from the top level hello-world-smx
directory:
Code Block |
---|
$ mvn clean install
|
The command above should display the output below:
//servicemix.apache.org/http/1.0"
xmlns:hwse="http://org.apache.servicemix.samples.helloworld.se/1.0"
xmlns:xyz="http://companyxyz.com">
<http:endpoint service="xyz:helloWorld"
endpoint="helloWorld"
role="consumer"
locationURI="http://localhost:8192/Service/"
defaultMep="http://www.w3.org/2004/08/wsdl/in-out" />
</beans>
|
Info |
---|
TODO: explain |
Create a service assembly to wrap all of the SUs
Panel |
---|
$ mvn archetype:create \ |
No Format |
[INFO] Scanning for projects...
[INFO] Reactor build order:
[INFO] A custom project
[INFO] A custom project
[INFO] Hello World JBI Component
[INFO] ----------------------------------------------------------------------------
[INFO] Building A custom project
[INFO] task-segment: [clean, install]
[INFO] ----------------------------------------------------------------------------
[INFO] [clean:clean]
[INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se/target
[INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se/target/classes
[INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se/target/test-classes
[INFO] [xbean:mapping {execution: default}]
Checking: org.apache.servicemix.samples.helloworld.se.MyComponent
Checking: org.apache.servicemix.samples.helloworld.se .MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/\ |
There should now be a hello-world-sa directory under hello-world-smx
...
.
Add the following dependencies to hello-world-sa/pom.xml
Code Block | ||||
---|---|---|---|---|
| ||||
<dependency> <groupId>orgse/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld.se/1.0 for namespace: http://org.apache.servicemix.samples.helloworld.sese</1.0 [INFO] Generating Spring 2.0 handler mapping: /Users/bsnyder/src/hellogroupId> <artifactId>hello-world-smx/hello-world-se/target/xbean/META-INF/spring.handlers for namespace: http://orgsu</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.apache.servicemix.samples.helloworld.sese</groupId> <artifactId>hello-world-http-su</artifactId> <version>1.0-SNAPSHOT</version> </dependency> |
Build and Deploy the SA
The easiest way to build all the projects is to create a top level POM file that will tell Maven to build everything for you. The following section describes how to do this.
Incorporating the Projects Into a Top Level POM
Now that we have created the SU and SA projects, a top level pom.xml
must be manually created and made aware of each subproject. This will allow all the projects to be built automatically without having to build each project in order manually. Maven will discover all the projects and build them in the proper order. In the hello-world-smx
directory, create a file named pom.xml
containing the following content:
Code Block | ||||
---|---|---|---|---|
| ||||
<?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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.servicemix.samples.helloworld</groupId>
<artifactId>hello-world-smx</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>Hello World JBI Component</name>
<modules>
<module>hello-world-sa</module>
<module>hello-world-su</module>
<module>hello-world-http-su</module>
<module>hello-world-se</module>
</modules>
</project>
|
This POM will allow the example to be easily folded in to the ServiceMix samples. The <modules>
element denotes the other projects that were created above using the Maven archetypes. Once the pom.xml
file from above is saved into the hello-world-smx
directory, you should now see the following:
Code Block |
---|
$ ls
hello-world-http-su hello-world-sa hello-world-se hello-world-su pom.xml
|
All projects can now be built using the following command on the command-line from the top level hello-world-smx
directory:
Code Block |
---|
$ mvn clean install
|
The command above should display the output below:
No Format |
---|
[INFO] Scanning for projects... [INFO] Reactor build order: [INFO] A custom project [INFO] A custom project [INFO] Hello World JBI Component [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [clean, install] [INFO] -----1.0 [INFO] Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd.html for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd.wiki for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] Compiling 3 source files to /Users/bsnyder/src/hello-world-smx/hello-world-se/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] Compiling 1 source file to /Users/bsnyder/src/hello-world-smx/hello-world-se/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running [INFO] [clean:clean] [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se/target [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se/target/classes [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se/target/test-classes [INFO] [xbean:mapping {execution: default}] Checking: org.apache.servicemix.samples.helloworld.se.MyComponent Checking: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld.se.MySpringComponentTest <hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes</hello>. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.464 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jarfor namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 handler mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se-1.0-SNAPSHOT.jarMETA-INF/spring.handlers for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] [jbi:jbi-component] [INFO] Generating installer Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zipxbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Building jarGenerating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] [install:install].xsd.html for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Installing Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.jar [INFO] Installing.xsd for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.xsd [INFO] Installing.wiki for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] Compiling 3 source files to /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT-schema.htmlclasses [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip to [compiler:testCompile] Compiling 1 source file to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/src/hello-world-se/1.0-SNAPSHOT/smx/hello-world-se-1.0-SNAPSHOT-installer.zip/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world--------------------se/target/surefire-reports ----------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [clean, install] [INFO] --------------- T E S T S --------------------------------------------------------------- Running org.apache.servicemix.samples.helloworld.se.MySpringComponentTest <hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes</hello>. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.464 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [cleanjar:cleanjar] [INFO] DeletingBuilding directoryjar: /Users/bsnyder/src/hello-world-smx/hello-world-sase/target/hello-world-se-1.0-SNAPSHOT.jar [INFO] Deleting directory[jbi:jbi-component] [INFO] Generating installer /Users/bsnyder/src/hello-world-smx/hello-world-sase/target/classeshello-world-se-1.0-SNAPSHOT-installer.zip [INFO] DeletingBuilding directoryjar: /Users/bsnyder/src/hello-world-smx/hello-world-sase/target/test-classes [INFO] [jbi:generate-jbi-service-assembly-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources.hello-world-se-1.0-SNAPSHOT-installer.zip [INFO] [compilerinstall:compileinstall] [INFO] No sourcesInstalling /Users/bsnyder/src/hello-world-smx/hello-world-se/target/hello-world-se-1.0-SNAPSHOT.jar to compile [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.jar [INFO] No sourcesInstalling /Users/bsnyder/src/hello-world-smx/hello-world-se/target/xbean/hello-world-se.xsd to compile [INFO] [surefire:test] [INFO] No tests to run. [INFO] [jbi:jbi-service-assembly] [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-sase/target/xbean/hello-world-sase.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se/1.0-SNAPSHOT/hello-world-se-1.0-SNAPSHOT-schema.jarhtml [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-sase/target/hello-world-sase-1.0-SNAPSHOT-installer.jarzip to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-sase/1.0-SNAPSHOT/hello-world-sase-1.0-SNAPSHOT-installer.zip [INFO] ---------------------------------------------------------------------------- [INFO] Building HelloA Worldcustom JBI Componentproject [INFO] task-segment: [clean, install] [INFO] ---------------------------------------------------------------------------- [INFO] [clean:clean] [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-sa/target [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/classes [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target/test-classes-smx/hello-world-sa/target/test-classes [INFO] [jbi:generate-jbi-service-assembly-descriptor] [INFO] Generating jbi.xml [INFO] [siteresources:attach-descriptorresources] [INFO] [install:installUsing default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Installing /Users/bsnyder/src/hello-world-smx/pom.xml to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-smx/1.0-SNAPSHOT/hello-world-smx-1.0-SNAPSHOT.pomNo sources to compile [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] ------------------------------------------------------------------------[compiler:testCompile] [INFO] No sources Reactorto Summary:compile [INFO] ------------------------------------------------------------------------ [INFO] A custom project ...................................... SUCCESS [17.091s] [INFO] A custom project ...................................... SUCCESS [2.465s[surefire:test] [INFO] No tests to run. [INFO] [jbi:jbi-service-assembly] [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/hello-world-sa-1.0-SNAPSHOT.jar [INFO] [install:install] [INFO] Hello World JBI Component ............................. SUCCESS [1.552s]Installing /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/hello-world-sa-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-sa/1.0-SNAPSHOT/hello-world-sa-1.0-SNAPSHOT.zip [INFO] ---------------------------------------------------------------------------- [INFO] Building Hello World JBI Component [INFO] task-segment: [clean, install] [INFO] ---------------------------------------------------------------------------- [INFO] [clean:clean] [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target/classes [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target/test-classes [INFO] [site:attach-descriptor] [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/pom.xml to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-smx/1.0--------SNAPSHOT/hello-world-smx-1.0-SNAPSHOT.pom [INFO] BUILD [INFO] SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] TotalReactor timeSummary: 22 seconds [INFO] Finished at: Mon Jan 15 13:30:59 MST 2007 [INFO] Final Memory: 14M/28M [INFO] ------------------------------------------------------------------------ |
As long as you see the BUILD SUCCESSFUL message in the output continue to the next section to give each project a unique name.
Give Each of the Maven Subprojects a Name
Notice in the output above that there are a two projects named A custom project. This is because the archetypes create projects with this generic name. Let's give each project a unique name via each component's pom.xml
file. This name will allow Maven's output to denote a component's name in its output making our development work a bit easier. To name each project, simply edit each pom.xml
and replace <name>A custom project</name>
with an appropriate name. Below are the instructions for naming each component's project:
- Edit
hello-world-sa/pom.xml
and replace<name>A custom project</name>
with<name>Hello World Service Assembly</name>
- Edit
hello-world-se/pom.xml
and replace<name>A custom project</name>
with<name>Hello World SE Service Unit</name>
Now when the projects are built you will no longer see a project named A custom project. Instead you'll now see Hello World SE Service Unit and Hello World Service Assembly. Rebuild the projects again using the mvn clean install
command on the command-line to see the change.
Deploying the Component
Now that the SA is built, we're ready to deploy it to the JBI container.
This is a work in progress. I will finish this up very soon.
Note | ||
---|---|---|
| ||
When working with the
The configuration above introduces the For a few more configurable options on the Maven JBI plugin, see also Ability to configure jbi:projectDeploy goal to exclude updating dependencies. |
...
title | TODO |
---|
The default implementation of the component accepts InOut MEPs (ADD
LINK TO FURTHER READING CONCERNING MEPs) and return the input content
as the out message. This is already nearly what we want.
OUTLINE for further work:
- Get Messages
- read Messages
Wiki Markup count the bytes Maybe easiest by XSLT endpoint (can be used to apply an XSLT stylesheet to the incoming exchange and will return the transformed result as the output message.) see \[ servicemix-saxon\|servicemix-saxon\]
- send a message back
- Configure SA so that the example receives messages
create & populate
C:\hello-world-SE-SA\hello-world\src\main\resources\servicemix.xml - as MyDeployer extends AbstractXBeanDeployer create xbean.xml for SU
- make something send messages (eg quartz timer, HTTP POST,...) and dump the answer (eg TraceComponent, FireWriter, EIP,...)
- add a chapter what user may do now / "how to continue when having the working example"
Classpath for SU to include manually till v3.1, see mail
manually editing http://goopen.org/confluence/display/SM/Working+with+Service+Units
manually editing http://www.servicemix.org/site/working-with-service-assemblies.html
use the SU archetype like in http://www.servicemix.org/site/creating-a-protocol-bridge.html
use the SA archetype like in http://www.servicemix.org/site/creating-a-protocol-bridge.html
INS When to use this JBI Component
INS Using the component that you created
provide exact position in the SVN!
/samples/hello-world-SE-SA/
integrate from SVN source like it is done at Configuration at http://www.servicemix.org/site/visualisation.html
maybe moving the content of overlapping existing docus to this new tut and - where appropriate - delete the old ones (only leaving a redirect).
http://www.servicemix.org/site/notes-on-creating-jbi-component-using-maven2.html version14
http://www.servicemix.org/site/creating-a-standard-jbi-component.html version26
are already fully incorporated in the mentioned versions, so delete content and point from there to here (and delete note at the very top)
This shall already include everything stated at
http://www.servicemix.org/site/maven-jbi-plugin.html#MavenJBIplugin-GettingStarted
and
http://www.servicemix.org/site/working-with-components.html
[INFO] A custom project ...................................... SUCCESS [17.091s]
[INFO] A custom project ...................................... SUCCESS [2.465s]
[INFO] Hello World JBI Component ............................. SUCCESS [1.552s]
[INFO] ------------------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 22 seconds
[INFO] Finished at: Mon Jan 15 13:30:59 MST 2007
[INFO] Final Memory: 14M/28M
[INFO] ------------------------------------------------------------------------
|
As long as you see the BUILD SUCCESSFUL message in the output continue to the next section to give each project a unique name.
Give Each of the Maven Subprojects a Name
Notice in the output above that there are a two projects named A custom project. This is because the archetypes create projects with this generic name. Let's give each project a unique name via each component's pom.xml
file. This name will allow Maven's output to denote a component's name in its output making our development work a bit easier. To name each project, simply edit each pom.xml
and replace <name>A custom project</name>
with an appropriate name. Below are the instructions for naming each component's project:
- Edit
hello-world-sa/pom.xml
and replace<name>A custom project</name>
with<name>Hello World Service Assembly</name>
- Edit
hello-world-se/pom.xml
and replace<name>A custom project</name>
with<name>Hello World SE Service Unit</name>
Now when the projects are built you will no longer see a project named A custom project. Instead you'll now see Hello World SE Service Unit and Hello World Service Assembly. Rebuild the projects again using the mvn clean install
command on the command-line to see the change.
Deploying the Component and the SU
Now that the SA is built, we're ready to deploy the Hello World SE, the dependency components and the Hello World SA to the JBI container.
Code Block |
---|
$ cp hello-world-se/target/hello-world-se-1.0-SNAPSHOT-installer.zip $SERVICEMIX_HOME/install/
$ cp $SERVICEMIX_HOME/components/servicemix-shared-3.2.1-installer.zip $SERVICEMIX_HOME/install/
$ cp $SERVICEMIX_HOME/components/servicemix-http-3.2.1-installer.zip $SERVICEMIX_HOME/install/
$ cp hello-world-sa/target/hello-world-sa-1.0-SNAPSHOT.jar $SERVICEMIX_HOME/deploy/
|
This is a work in progress
End-to-End Testing
This is a work in progress
...