Translate to Different Languages!

Monday, January 19, 2015

The Business Value of Integration Products

SIGNIFICANT BUSINESS VALUE ACHIEVED BY 6 ORGANIZATIONS USING RED HAT JBOSS FUSE

Companies ranging from 100s to 1000s of employees were interviewed, including global representatives of the telecommunications, IT, shipment and logistics, retail and document management industries.
Red Hat® JBoss® Fuse delivered an average 3-year ROI of 488%, in a payback time of 8.2 months, with a number of business value benefits.

BUSINESS BENEFITS REALIZED:

  • 51.5% more applications integrated per year
  • 40.8% fewer FTEs per application integration
  • 62.8% less application downtime related to integration
  • 18.1% improved middleware integration solution performance
  • 34.2% less costly than previous middleware integration solutions
Read the entire whitepaper for the details, including the reasons these 6 customers adopted Red Hat JBoss Fuse at https://engage.redhat.com/idc-jboss-fuse-s-201501152109

Thursday, January 15, 2015

Scaling Microservices

I am working on API Guidance with Fuse and Data Virtualization and have been thinking about splitting services into manageable microservices that expose APIs by function.  I came across a site that discussed some microservice patterns:
  1. Monolithic architecture
  2. Microservices architecture
  3. API gateway
One of the articles on the Pattern site discussed the Art of Scalability that describes how to solve scalability problems.  This gives us good insight on how to split applications and services by function to achieve Scalability.  We can achieve this by building APIs with microservices within containers.

The Art of Scalability  book describes a really useful, three dimension scalability model: the scale cube.  The microservice architecture is an application of Y-axis scaling on the scale cube.   We will go through more detail of the Y-Axis but for further description of the X and Z Axis you can read more on the AKF Partner site.  

As you can see from the graphic below, the AKF Scale Cube consists of an X, Y and Z axis.  Each of the Axes addresses a different approach to scale a service.  The Y-Axis highlights splitting services by function which we can split into Microservices that expose APIs by Function or Service.


From AFK Partners splitting services article:
The Y Axis of the cube represents a split by function, service or resource. A service might represent a set of use-cases and is most often easiest to envision through thinking of it as a verb or action like “login” and a resource oriented split is easiest to envision by thinking of splits as nouns like “account information”. These splits help handle not only the split of transactions across multiple systems as did the X axis, but can also be helpful in reducing or distributing the amount of memory dedicated to any given application across several systems. A recommended approach to identify the order in which these splits should be accomplished is to determine which ones will give you the greatest “headroom” or capacity “runway” for the least amount of work. These splits often come at a higher cost to the engineering team as very often they will require that the application be split up as well. As a quick first step, a monolithic application can be placed on multiple servers and dedicate certain of those servers to specific “services” or URIs. While this approach will help spread transaction processing across multiple systems similar to our X axis implementation it may not offer the added benefit of reducing the amount of system memory required by service/pool/resource/application. Another reason to consider this type of split in very large teams is to dedicate separate engineering teams to focus on specific services or resources in order to reduce your application learning curve, increase quality, decrease time to market (smaller code bases), etc. This type of split is often referred to as “swimlaning” an application.
From microservices.io scale cube article:
Unlike X-axis and Z-axis, which consist of running multiple, identical copies of the application, Y-axis axis scaling splits the application into multiple, different services. Each service is responsible for one or more closely related functions. There are a couple of different ways of decomposing the application into services. One approach is to use verb-based decomposition and define services that implement a single use case such as checkout. The other option is to decompose the application by noun and create services responsible for all operations related to a particular entity such as customer management. An application might use a combination of verb-based and noun-based decomposition.

Wednesday, January 14, 2015

Red Hat Summit and DevNation Submissions


Today is the last day for Red Hat Summit Submissions.  DevNation submissions are accepted until 1/28/2015.  I have a couple of talks with demos that have been submitted for Red Hat Summit which are listed below.  I am still working on my DevNation submissions.  You can submit your Summit and DevNation talks here.

Keep these dates in mind:

November 19, 2014 - Call for proposals opens
January 7, 2015 - Call for proposals closes
January 14, 2015 - Call for proposals extended deadline—Red Hat Summit
January 21, 2015 - Call for proposals extended deadline—DevNation
March 2015 - Speaker notifications sent
May 27, 2015 - Signed release forms and presentation slides due
May 27 – June 12, 2015 - Presentation rehearsals due
June 21-25, 2015  - DevNation
June 23-26  - Red Hat Summit

If you have any questions email redhatsummit-cfp@redhat.com or info@devnation.org.

Summit Talk/Demo 1:  Leveraging API Management to achieve success in the Digital Economy with Fuse, OpenShift and 3Scale

An API -- Application Programming Interface -- at its most basic level allows your product or service to interact with other products or services using standard based technologies. APIs enable access to an organization's assets -- data or services -- in a simple and quick way. Just as today every business has a website to expose data or services for humans, soon every business will have APIs to expose such assets in a machine-processable way. Gartner predicts that by 2016 75% of the Fortune 1000 will offer public Web APIs and 50% of B2B collaboration will take place through Web APIs.

As an organization you want to have full control and visibility about your API. This is where API Management comes into play to fully leverage the power of exposing assets via APIs. During this session we will cover five specific use cases about how APIs can accelerate your business in the Digital Economy, we will introduce how you can use Fuse, OpenShift and 3Scale to manage and control APIs and we will conclude with a practical demo.

In detail, we will showcase how to:
-Build and deploy your API
-Secure your API via access control
-Control your API via usage policies
-Operate your API via monitoring, analytics, reporting and billing
-Engage with developers via developer portals and interactive API documentation

Summit Talk/Demo 2:  Build your next enterprise application in 60 minutes with JBoss Middleware

Business demands for new applications are increasing as businesses seek new ways to engage with their customers. As a result IT is at the center of a sea change in application development as new approaches like DevOps emphasize rapid delivery of features and greater participation by end users and “citizen developers”.

Middleware technologies such as integration, business rules, BPM , mobile application platforms and Platform-as-a-Service (PaaS) are emerging as important tools for DevOps teams, greatly reducing the traditional coding requirements for new business applications. With appropriate use of middleware, DevOps teams can collaboratively and rapidly develop and manage applications that engage customers and connect to back end services and legacy systems.

Join us for this session where we will show how three middleware technologies – integration, business process management and mobile – can be brought together in the cloud to support development of context-aware, process enabled, connected enterprise mobile apps. We’ll show you how to delight your employees and customers with modern solutions that deliver results quickly and yet integrate seamlessly into existing infrastructure. 

Through a real-word use-case we will demonstrate:
-Development and deployment of an enterprise mobile app using FeedHenry’s Mobile Application Platform
-Inclusion of captured mobile information into business processes with JBoss BPM Suite
-Integration of automated processes with legacy applications and systems of record with JBoss integration solutions
-Automation of business decisions guided by business rules
-Attendees will gain an appreciation for the ease with which middleware-enabled applications can support ever-changing business needs, and an understanding of the benefits of Red Hat JBoss Middleware products.

Friday, January 9, 2015

JBoss Data Virtualization 6.1 Beta Available


JDV 6.1 beta is available for download from
- JBoss.org at http://www.jboss.org/products/datavirt/overview/
- Customer Portal at  https://access.redhat.com/products/red-hat-jboss-data-virtualization

JDV 6.1 beta Documentation is available at https://access.redhat.com/documentation/en-US/Red_Hat_JBoss_Data_Virtualization/

For JDV 6.1, we focused on three major areas:

    •    Big Data
    •    Cloud
    •    Development and Deployment Improvements

with the following new features and enhancements

BIG DATA

 - Cloudera Impala
In addition to the Apache Hive support released in JDV 6.0, JDV 6.1 will also offer support for Cloudera Impala for fast SQL query access to data stored in Hadoop.  Support of Impala is aligned with our growing partnership with Cloudera that was announced in October.

- Apache Solr
New in JDV 6.1 is support for Apache Solr as a data source.  With Apache Solr, JDV customers will be able to take advantage of enterprise search capabilities for organized retrieval of structured and unstructured data.

- MongoDB
Support for MongoDV as a NoSQL data source was released in Technical Preview in JDV 6.0 and will be fully supported in JDV 6.1. Support of MongoDB brings support for a document-oriented NoSQL database to JDV customers.

- JDG 6.3
Support for JDG as a data source was new in JDV 6.0.  We expand on this support in JDV 6.1, with the ability to perform writes in addition to reads.  JDV 6.1 users can also take advantage of JDG Library mode as an embedded cache in addition to the support as a remote cache that was previously available.

- Apache Cassandra (Tech Preview)
Apache Cassandra will be released as a Technical Preview in JDV 6.1.  Support of Apache Cassandra brings support for the popular columnar NoSQL database to JDV customers.

CLOUD

- OpenShift Online with new WebUI
We introduced JDV in OpenShift Online as Developer Preview with the JDV 6.0 release and will update our Developer Preview cartridge for JDV 6.1. With JDV 6.1, we are adding a WebUI that focuses on ease of use for web and mobile developers.  This lightweight user interface allows users to quickly access a library of existing data services, or create one of their own in a top-down manner.  Getting Started instructions can be found here:  https://developer.jboss.org/wiki/IntroToTheDataVirtualizationWebInterfaceOnOpenShift

- SFDC Bulk API
With JDV 6.1 we improve support for the Salesforce.com Bulk API with a more RESTful interface and better resource handling.  The SFDC Bulk API is optimized for loading very large sets of data.

- Cloud Enablement
With JDV 6.1 we will have full support of JBoss Data Virtualization on Amazon EC2 and Google Compute Engine.


PRODUCTIVITY AND DEPLOYMENT IMPROVEMENTS

-Security audit log dashboard
Consistent centralized security capabilities across multiple heterogeneous data sources is a key value proposition for JDV.  In JDV we add a security audit log dashboard that can be viewed in the dashboard builder which is included with JDV.   The security audit log works with JDV’s RBAC feature and displays who has been accessing what data and when.

- Custom Translator improvements
JDV offers a large number of supported data sources out of box and also provides the capability for users to build their own custom translators. In JDV 6.1 we are providing features to improve usability including archetype templates that can be used to generate a starting maven project for custom development.  When the project is created, it will contain the essential classes and resources to begin adding custom logic.

- Azul Zing JVM
JDV 6.1 will provide support for Azul Zing JVM.  Azul Zing is optimized for Linux server deployments and designed for enterprise applications and workloads that require any combination of large memory, high transaction rates, low latency, consistent response times or high sustained throughput.

- MariaDB
JDV 6.1 will support MariaDB as a data source.  MariaDB is the default implementation of MySQL in Red Hat Enterprise Linux 7. MariaDB is a community-developed fork of the MySQL database project, and provides a replacement for MySQL. MariaDB preserves API and ABI compatibility with MySQL and adds several new features.

- Apache POI Connector for Excel
JDV has long supported Microsoft Excel as a data source.  In JDV 6.1, we add support for the Apache POI connector that allows reading of Microsoft Excel documents on all platforms.

- Performance Improvements
We continue to invest in improved performance with every release of JDV.  In JDV 6.1, we focused particularly on improving performance with dependent joins including greater control over full dependent join pushdown to the datasource(s).

- EAP 6.3
JDV 6.1 will be based on EAP 6.3 and take advantage of the new patching capabilities provided by EAP.

Tuesday, January 6, 2015

Getting Started Quickly with JBoss Fuse

Build your first Fuse application
Follow the below series to build your first application. You will build some simple examples as well as build a Home Loan Application using JBoss Fuse to integrate different enterprise systems. The Home Loan Application accepts a loan request from the customer and provides a loan decision including a home mortgage rate. The series walks you through each step of the application development lifecycle, from start to finish.
Demonstration DescriptionMaterial
What is JBoss Fuse?
What is Apache Camel? What are Enterprise Integration Patterns (EIP)?
Build the Home loan application using EIP’s
Business requirements change. Extend the home loan application. New SaaS applications? No problem..
Business expanding. Extend the home loan application to partners, suppliers.
Innovate further. Try, experiment, test, deploy.
For more information: http://www.jboss.org/products/fuse/get-started/

Follow Christina Lin and Kenneth Peeples for more integration demos:

Wednesday, December 31, 2014

Transforming and Routing HL7 Messages with Camel

Introduction

I am highlighting the HL7 Camel component in one of this weeks Fuse Component Blogs.  We will give a brief introduction, a brief HL7 Component overview and then the HL7 Component Demo so you can easily run an example.
Health Level 7 (HL7) is a not-for-profit, ANSI-accredited standards developing organization dedicated to providing a comprehensive framework and related standards for the exchange, integration, sharing, and retrieval of electronic health information that supports clinical practice and the management, delivery and evaluation of health services.
An HL7 Interface Engine (a.k.a. Message Broker) is used to refer to a kind of middleware application which is used to transform, route, clone and translate HL7 messages.  The HL7 Component with Camel is perfect for using Fuse as a HL7 Interface Engine.  We give you an example of using the component in a Camel Route in our example.  The component works with v2 messages using the HAPI library which we will describe further below.  People who have worked with HL7 are normally familiar with the two versions so I wanted to give the main differences between the two.
HL7 V2 
  • Not “Plug and Play” – it provides 80 percent of the interface and a framework to negotiate the remaining 20 percent on an interface-by-interface basis
  • Historically built in an ad hoc way because no other standard existed at the time
  • Generally provides compatibility between 2.X versions
  • Messaging-based standard built upon pipe and hat encoding
  • In the U.S., V2 is what most people think of when people say “HL7″ 
HL7 V3 
  • Approaching “Plug and Play” – less of a “framework for negotiation”
  • Many decades of effort over ten year period reflecting “best and brightest” thinking
  • NOT backward compatible with V2
  • Model-based standard built upon Reference Information Model (RIM) provides consistency across entire standard
  • In the U.S., when Clinical Document Architecture (CDA) is what most people in the U.S. think of when people say “HL7 V3″
http://www.hl7standards.com/blog/2007/12/12/key-differences-between-hl7-v2-and-v3/  

 HL7 Camel Component Overview

The HL7 component is used for working with the HL7 MLLP protocol and HL7 v2 messages using the HAPI library.

This component supports the following:

  • HL7 MLLP codec for Mina
  • Type Converter from/to HAPI and String
  • HL7 DataFormat using the HAPI library
  • Even more ease-of-use as it's integrated well with the camel-mina2 component.
Maven users will need to add the following dependency to their pom.xml for this component:


<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-hl7</artifactId>
    <version>x.x.x</version>
</dependency>

HL7 is often used with the HL7 MLLP protocol, which is a text based TCP socket based protocol. This component ships with a Mina Codec that conforms to the MLLP protocol so you can easily expose an HL7 listener accepting HL7 requests over the TCP transport layer.


The HL7 component ships with a HL7 data format that can be used to marshal or unmarshal HL7 model objects.
  • marshal = from Message to byte stream (can be used when responding using the HL7 MLLP codec)
  • unmarshal = from byte stream to Message (can be used when receiving streamed data from the HL7 MLLP
You can find more information on the Camel component at http://camel.apache.org/hl7.html  Also on the HAPI site a HAPI Test Panel is available which is a full featured HL7 message editor, transmitter and receiver. 

Running the Demonstration

This example will run a HL7 message through a Camel Route to show how to easily use the HL7 component.  When the message is a ADT (Admission/Discharge/Transfer) Message as in the MSH segment and the MSH segment has the FUSEDEMO namespace then the PID (Patient Identifier) segment has the Patient Name removed.  In the demo we are starting the route with the message in a file.  The route can also be started with Mina2 through the HAPI test panel.  You can see the outline of the routes below which can also be seen in the camel-context.xml file:


NOTE: init-fabric.sh will be future for a fabric example. menu.sh will be future for building a local install or docker install.

The message used in the unit tests and our example is a ADT Message:
MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA|||||||PV1||O|OP^^||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718
Steps for the Demo:
Step 2: Download the JBoss Fuse product from jboss.org at http://www.jboss.org/products/fuse/overview/
Step 3: Place the downloaded zip file under installs folder.
Step 4: Run init.sh to setup the environment which will also start Fuse.
 
Step 5: 
Enter the following in the console: features:addurl mvn:org.fusebyexample.examples/hl7-example-features/1.0.0-SNAPSHOT/xml/features
Step 6: Enter the following in the console: features:install hl7-example-all
Step 7: Move the camel-test.hl7 file to /tmp/ then watch the log, located at target/jboss-fuse-6.1.0.redhat-379/data/log/fuse.log, for the following trace output to show the Patient Name is removed from the message:

21:47:28,228 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7FileRoute) from(file:///tmp/?delete=true&filter=%23hl7FileFilter&moveFailed=.error) --> convertBodyTo[java.lang.String] <<< Pattern:InOnly, Headers:{CamelFileNameOnly=camel-test.hl7, CamelFileAbsolute=true, CamelFileName=camel-test.hl7, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileLastModified=1420054586000, CamelFileNameConsumed=camel-test.hl7, CamelFilePath=/tmp/camel-test.hl7, CamelFileParent=/tmp, CamelFileRelativePath=camel-test.hl7, CamelFileLength=285}, BodyType:org.apache.camel.component.file.GenericFile, Body:[Body is file based: GenericFile[/tmp/camel-test.hl7]]

21:47:28,234 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7FileRoute) convertBodyTo[java.lang.String] --> direct://hl7Direct <<< Pattern:InOnly, Headers:{CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelFileNameOnly=camel-test.hl7, CamelFileName=camel-test.hl7, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileRelativePath=camel-test.hl7, CamelFileParent=/tmp, CamelFileLength=285, CamelFilePath=/tmp/camel-test.hl7, CamelFileLastModified=1420054586000, CamelFileNameConsumed=camel-test.hl7}, BodyType:String, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA|||||||
PV1||O|OP^^||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,236 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) direct://hl7Direct --> log[HL7 Request: ${body}] <<< Pattern:InOnly, Headers:{CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelFileNameOnly=camel-test.hl7, CamelFileName=camel-test.hl7, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileRelativePath=camel-test.hl7, CamelFileParent=/tmp, CamelFileLength=285, CamelFilePath=/tmp/camel-test.hl7, CamelFileLastModified=1420054586000, CamelFileNameConsumed=camel-test.hl7}, BodyType:String, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA|||||||
PV1||O|OP^^||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,237 | INFO | 0 - file:///tmp/ | hl7DirectRoute | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | HL7 Request: MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA|||||||
PV1||O|OP^^||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,238 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) log[HL7 Request: ${body}] --> unmarshal[org.apache.camel.component.hl7.HL7DataFormat@5ecb0fc4] <<< Pattern:InOnly, Headers:{CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelFileNameOnly=camel-test.hl7, CamelFileName=camel-test.hl7, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileRelativePath=camel-test.hl7, CamelFileParent=/tmp, CamelFileLength=285, CamelFilePath=/tmp/camel-test.hl7, CamelFileLastModified=1420054586000, CamelFileNameConsumed=camel-test.hl7}, BodyType:String, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA|||||||
PV1||O|OP^^||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,313 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) unmarshal[org.apache.camel.component.hl7.HL7DataFormat@5ecb0fc4] --> direct://hl7DirectCBR <<< Pattern:InOnly, Headers:{CamelFileParent=/tmp, CamelHL7Security=null, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelHL7MessageType=ADT, CamelFilePath=/tmp/camel-test.hl7, CamelHL7TriggerEvent=A01, CamelHL7ReceivingApplication=TEST, CamelFileNameConsumed=camel-test.hl7, CamelHL7VersionId=2.4, CamelFileRelativePath=camel-test.hl7, CamelHL7ReceivingFacility=JBOSS, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileLastModified=1420054586000, CamelHL7SendingApplication=FUSEDEMO, CamelHL7ProcessingId=P, CamelHL7MessageControl=MSGID12349876, CamelFileNameOnly=camel-test.hl7, CamelFileLength=285, CamelFileName=camel-test.hl7, CamelHL7SendingFacility=ORG, CamelHL7Timestamp=20061019172719}, BodyType:ca.uhn.hl7v2.model.v24.message.ADT_A01, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,317 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectCBRRoute) direct://hl7DirectCBR --> choice <<< Pattern:InOnly, Headers:{CamelFileParent=/tmp, CamelHL7Security=null, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelHL7MessageType=ADT, CamelFilePath=/tmp/camel-test.hl7, CamelHL7TriggerEvent=A01, CamelHL7ReceivingApplication=TEST, CamelFileNameConsumed=camel-test.hl7, CamelHL7VersionId=2.4, CamelFileRelativePath=camel-test.hl7, CamelHL7ReceivingFacility=JBOSS, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileLastModified=1420054586000, CamelHL7SendingApplication=FUSEDEMO, CamelHL7ProcessingId=P, CamelHL7MessageControl=MSGID12349876, CamelFileNameOnly=camel-test.hl7, CamelFileLength=285, CamelFileName=camel-test.hl7, CamelHL7SendingFacility=ORG, CamelHL7Timestamp=20061019172719}, BodyType:ca.uhn.hl7v2.model.v24.message.ADT_A01, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,836 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectCBRRoute) choice --> log[Transforming message.] <<< Pattern:InOnly, Headers:{CamelFileParent=/tmp, CamelHL7Security=null, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelHL7MessageType=ADT, CamelFilePath=/tmp/camel-test.hl7, CamelHL7TriggerEvent=A01, CamelHL7ReceivingApplication=TEST, CamelFileNameConsumed=camel-test.hl7, CamelHL7VersionId=2.4, CamelFileRelativePath=camel-test.hl7, CamelHL7ReceivingFacility=JBOSS, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileLastModified=1420054586000, CamelHL7SendingApplication=FUSEDEMO, CamelHL7ProcessingId=P, CamelHL7MessageControl=MSGID12349876, CamelFileNameOnly=camel-test.hl7, CamelFileLength=285, CamelFileName=camel-test.hl7, CamelHL7SendingFacility=ORG, CamelHL7Timestamp=20061019172719}, BodyType:ca.uhn.hl7v2.model.v24.message.ADT_A01, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,836 | INFO | 0 - file:///tmp/ | hl7DirectCBRRoute | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | Transforming message.

21:47:28,839 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectCBRRoute) log[Transforming message.] --> transform[groovy: adt = request?.body; adt?.PID?.removePatientName(0); request.body = adt;] <<< Pattern:InOnly, Headers:{CamelFileParent=/tmp, CamelHL7Security=null, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileAbsolute=true, CamelHL7MessageType=ADT, CamelFilePath=/tmp/camel-test.hl7, CamelHL7TriggerEvent=A01, CamelHL7ReceivingApplication=TEST, CamelFileNameConsumed=camel-test.hl7, CamelHL7VersionId=2.4, CamelFileRelativePath=camel-test.hl7, CamelHL7ReceivingFacility=JBOSS, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileLastModified=1420054586000, CamelHL7SendingApplication=FUSEDEMO, CamelHL7ProcessingId=P, CamelHL7MessageControl=MSGID12349876, CamelFileNameOnly=camel-test.hl7, CamelFileLength=285, CamelFileName=camel-test.hl7, CamelHL7SendingFacility=ORG, CamelHL7Timestamp=20061019172719}, BodyType:ca.uhn.hl7v2.model.v24.message.ADT_A01, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||Durden^Tyler^^^Mr.||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,922 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectCBRRoute) transform[groovy: adt = request?.body; adt?.PID?.removePatientName(0); request.body = adt;] --> log[HL7 Transformed Request: ${body}] <<< Pattern:InOnly, Headers:{CamelFileLength=285, CamelFilePath=/tmp/camel-test.hl7, CamelFileName=camel-test.hl7, CamelHL7MessageControl=MSGID12349876, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelHL7SendingApplication=FUSEDEMO, CamelHL7VersionId=2.4, CamelHL7TriggerEvent=A01, CamelHL7ReceivingFacility=JBOSS, CamelHL7Security=null, CamelHL7SendingFacility=ORG, CamelFileNameConsumed=camel-test.hl7, CamelHL7ProcessingId=P, CamelFileRelativePath=camel-test.hl7, CamelFileLastModified=1420054586000, CamelFileNameOnly=camel-test.hl7, CamelHL7MessageType=ADT, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelHL7ReceivingApplication=TEST, CamelFileParent=/tmp, CamelFileAbsolute=true, CamelHL7Timestamp=20061019172719}, BodyType:ca.uhn.hl7v2.model.v24.message.ADT_A01, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,925 | INFO | 0 - file:///tmp/ | hl7DirectCBRRoute | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | HL7 Transformed Request: MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,928 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) log[HL7 Transformed Request: ${body}] --> bean[ref:hl7AckGenerator] <<< Pattern:InOnly, Headers:{CamelFileLength=285, CamelFilePath=/tmp/camel-test.hl7, CamelFileName=camel-test.hl7, CamelHL7MessageControl=MSGID12349876, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelHL7SendingApplication=FUSEDEMO, CamelHL7VersionId=2.4, CamelHL7TriggerEvent=A01, CamelHL7ReceivingFacility=JBOSS, CamelHL7Security=null, CamelHL7SendingFacility=ORG, CamelFileNameConsumed=camel-test.hl7, CamelHL7ProcessingId=P, CamelFileRelativePath=camel-test.hl7, CamelFileLastModified=1420054586000, CamelFileNameOnly=camel-test.hl7, CamelHL7MessageType=ADT, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelHL7ReceivingApplication=TEST, CamelFileParent=/tmp, CamelFileAbsolute=true, CamelHL7Timestamp=20061019172719}, BodyType:ca.uhn.hl7v2.model.v24.message.ADT_A01, Body:MSH|^~\&|FUSEDEMO|ORG|TEST|JBOSS|20061019172719||ADT^A01^ADT_A01|MSGID12349876|P|2.4
PID|||20301||||19700312|M|||88 Punchward Dr.^^Los Angeles^CA^11221^USA
PV1||O|OP||||4652^Paulson^Robert|||OP|||||||||9|||||||||||||||||||||||||20061019172717|20061019172718

21:47:28,950 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) bean[ref:hl7AckGenerator] --> marshal[org.apache.camel.component.hl7.HL7DataFormat@65783d7a] <<< Pattern:InOnly, Headers:{CamelHL7Security=null, CamelFilePath=/tmp/camel-test.hl7, CamelFileNameConsumed=camel-test.hl7, CamelFileRelativePath=camel-test.hl7, CamelHL7ProcessingId=P, CamelFileLastModified=1420054586000, CamelHL7ReceivingApplication=TEST, CamelHL7TriggerEvent=A01, CamelFileNameOnly=camel-test.hl7, CamelHL7SendingFacility=ORG, CamelFileAbsolute=true, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelHL7VersionId=2.4, CamelHL7SendingApplication=FUSEDEMO, CamelFileParent=/tmp, CamelFileLength=285, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelFileName=camel-test.hl7, CamelHL7MessageType=ADT, CamelHL7MessageControl=MSGID12349876, CamelHL7Timestamp=20061019172719, CamelHL7ReceivingFacility=JBOSS}, BodyType:ca.uhn.hl7v2.model.v24.message.ACK, Body:MSH|^~\&|TEST|JBOSS|FUSEDEMO|ORG|20141231214728.945-0500||ACK^A01|1|P|2.4
MSA|AA|MSGID12349876

21:47:28,953 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) marshal[org.apache.camel.component.hl7.HL7DataFormat@65783d7a] --> log[HL7 Response: ${body}] <<< Pattern:InOnly, Headers:{CamelHL7TriggerEvent=A01, CamelHL7VersionId=2.4, CamelHL7MessageControl=MSGID12349876, CamelFileNameOnly=camel-test.hl7, CamelFileNameConsumed=camel-test.hl7, CamelHL7Timestamp=20061019172719, CamelHL7MessageType=ADT, CamelHL7Security=null, CamelHL7SendingApplication=FUSEDEMO, CamelFileRelativePath=camel-test.hl7, CamelFileLastModified=1420054586000, CamelHL7ReceivingApplication=TEST, CamelHL7SendingFacility=ORG, CamelFileAbsolute=true, CamelHL7ProcessingId=P, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileParent=/tmp, CamelFilePath=/tmp/camel-test.hl7, CamelFileLength=285, CamelFileName=camel-test.hl7, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelHL7ReceivingFacility=JBOSS}, BodyType:byte[], Body:MSH|^~\&|TEST|JBOSS|FUSEDEMO|ORG|20141231214728.945-0500||ACK^A01|1|P|2.4
MSA|AA|MSGID12349876

21:47:28,954 | INFO | 0 - file:///tmp/ | hl7DirectRoute | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | HL7 Response: MSH|^~\&|TEST|JBOSS|FUSEDEMO|ORG|20141231214728.945-0500||ACK^A01|1|P|2.4
MSA|AA|MSGID12349876

21:47:28,954 | INFO | 0 - file:///tmp/ | Tracer | 142 - org.apache.camel.camel-core - 2.12.0.redhat-610379 | ID-localhost-50691-1420080376277-0-2 >>> (hl7DirectRoute) log[HL7 Response: ${body}] --> mock://hl7DirectResponse <<< Pattern:InOnly, Headers:{CamelHL7TriggerEvent=A01, CamelHL7VersionId=2.4, CamelHL7MessageControl=MSGID12349876, CamelFileNameOnly=camel-test.hl7, CamelFileNameConsumed=camel-test.hl7, CamelHL7Timestamp=20061019172719, CamelHL7MessageType=ADT, CamelHL7Security=null, CamelHL7SendingApplication=FUSEDEMO, CamelFileRelativePath=camel-test.hl7, CamelFileLastModified=1420054586000, CamelHL7ReceivingApplication=TEST, CamelHL7SendingFacility=ORG, CamelFileAbsolute=true, CamelHL7ProcessingId=P, CamelFileAbsolutePath=/tmp/camel-test.hl7, CamelFileParent=/tmp, CamelFilePath=/tmp/camel-test.hl7, CamelFileLength=285, CamelFileName=camel-test.hl7, breadcrumbId=ID-localhost-50691-1420080376277-0-1, CamelHL7ReceivingFacility=JBOSS}, BodyType:byte[], Body:MSH|^~\&|TEST|JBOSS|FUSEDEMO|ORG|20141231214728.945-0500||ACK^A01|1|P|2.4
MSA|AA|MSGID12349876

Monday, December 29, 2014

Using HermesJMS with JBoss A-MQ

Today I welcome a guest blogger, Bryan Saunders who is a Red Hat Senior Consultant in North America and a Certified Scrum Professional.  In October I posted a blog to show how to use JMeter with JBoss A-MQ.  Bryan was doing message testing with HermesJMS, SOAPUI and JBoss A-MQ so we wanted to share another method for testing messages with JBoss A-MQ.  We used the steps in my environment that Bryan used in order to make HermesJMS work with JBoss A-MQ.

HermesJMS can be started from within SOAPUI.  HermesJMS is an extensible console that helps you interact with JMS providers making it simple to publish and edit messages, browse or seach queues and topics, copy messages around and delete them.  SoapUI is the world leading Open Source Functional Testing Tool, mainly it is used for API Testing.

Bryan discovered a bug with the HermesJMS distribution included with SOAPUI that affects using it with ActiveMQ 5.8 and above.  The HermesJMS standalone version does produce the error.  So we use the standalone HermesJMS version and point to the distribution from the preferences/tools from within SOAPUI.  The error that is produced with the SOAPUI included version is below and Bryan found a related bug HJMS-223.


Environment

I used the following environment in a VirtualBox Virtual Machine:

JBoss A-MQ Setup

Step 1:  Download JBoss A-MQ 6.1 from JBoss A-MQ 6.1 product page.  
Step 2:  Extract the files to a AMQInstallDir
Step 3:  Uncomment the admin credentials in AMQInstallDir/etc/users.properties.  You should modify the username and password in your environment to unique credentials.


Step 4: Start JBoss A-MQ by running the ./bin/start from the AMQInstallDir.
Step 5: Verify the installation by running Producer and Consumer clients.
  • Run the Producer from the AMQInstallDir with the command below.  The producer will connect to the broker and produce 100 messages.
java -jar extras/mq-client.jar producer --user admin --password admin

  • Run the Consumer from the AMQInstallDir with the command below.  The consumer will connect to the broker and consume 100 messages.
java -jar extras/mq-client.jar consumer --user admin --password admin

Step 6: Open the apache-activemq-5.9.0.redhat-610379-bin.zip file that is in extras as we need two jar files.  Extract activemq-all-5.9.0.redhat-610379.jar and lib/geronimo-j2ee-management_1.1_spec-1.0.1.jar to the extras directory.

SOAPUI and HermesJMS Setup

Step 1:  Download the SOAPUI distribution which will be a shell script
Step 2:  Change the permissions to make the install script, SoapUI-x64-5.0.0.0.sh, executeable, ie chmod 755 SoapUI-x64-5.0.0.sh
Step 3:  Run the setup script ./SoapUI-x64-5.0.0.sh and run SOAPUI at the end of the installation
Step 4:  Download and then install HermesJMS standalone, ie java -jar hermes-installer-1.14.jar
Step 5:  Point SOAPUI tools to the HermesJMS Standalone instead of the included HermesJMS distribution.


Step 6:  Start HermesJMS from the SOAPUI menu


Step 7:  Create a new session by going to Actions, New, New Session


Step 8:  Setup the Provider so it is the same as the below.
  • Click on the Providers tab at the bottom of the screen.  
  • Right click in the Classpath Groups panel and click add group.  
  • Right click on the Library panel and click add jars.  
  • Click on the Scan button when prompted.  Make sure to add both jars.
  • Click Apply and then the Sessions tab.



Step 9:  Setup the session so it is the same as the below.
  • Change the session name, ie JBossAMQSession
  • Update the loader and class in the Connection Factory to the JBossAMQGroup Loader and the org.apache.activemq.ActiveMQConnectionFactory Class
  • Right click in the Connection Factory Panel and add the brokerURL property with the value tcp://localhost:61616.
  • Change the plugin to ActiveMQ and add the properties
    • serviceURL with property service:jmx:rmi://jndi/rmi://localhost:1099/jmxrmi
    • brokerName with property localhost
  • Add the TEST queue name in destinations with a domain of QUEUE
  • Click on the user credentials and add user admin and password admin
  • Click Apply and Ok


Send a test message

Step 1:  Click on the Session, JBossAMQSession, and destination, TEST that were created.


Step 2:  Click on Messages and then Send TestMessage from the menu.  Select a text file that you want to send as a message and click Send file to TEST.
Step 3:  Click the Refresh icon in the toolbar.  You will see the message you sent.