2. Martin Krasser
Position
• Software architect and engineer
Focus
• Distributed systems
• Application integration
• Application security
• ...
Open source projects
• Open eHealth Integration Platform (Founder)
http://gforge.openehealth.org/gf/project/ipf
• Security Annotation Framework (Founder)
http://www.sourceforge.net/projects/safr
• Apache Camel (Contributor)
http://camel.apache.org
2 May 5, 2009 ICW Developer Conference
3. Agenda
Part 1
• IPF Introduction
• Programming IPF
• Demo
Part 2
• OSGi Support
• IPF Services
• Demos
Part 3
• Outlook
4 May 5, 2009 ICW Developer Conference
4. IPF Introduction (1/5)
Framework for implementing integration logic
• Healthcare domain
• General-purpose
Platform to deploy and run integration solutions
• OSGi-based with IPF services in service registry
• Embedded, standalone and distributed deployments
Based on Apache Camel
• Routing and mediation engine
• Enterprise Integration Patterns (EIPs)
• Domain-specific language (DSL)
5 May 5, 2009 ICW Developer Conference
5. IPF Introduction (2/5)
Project
• Hosted at the Open eHealth Foundation
• Open source under Apache License, Version 2
• Latest release – IPF 1.6.0 (April 2009)
• http://gforge.openehealth.org/gf/project/ipf/
- Subversion repository
- Release filesystem
- Issue tracker
- Mailing lists
• http://repo.openehealth.org
- Reference documentation
- Contribution guidelines
- Build server and build reports
- Maven and OSGi bundle repository
6 May 5, 2009 ICW Developer Conference
7. IPF Introduction (4/5)
Development
• Focus on programming (internal DSL)
• DSL is easy to extend
• Platform is easy to extend
• No graphical route designer
• ...
IPF applications @ ICW
• Medical Service Bus (MSB)
• IHE profiles (PIX, PDQ, XDS)
• Device connectivity server (DCS)
• LifeSensor adapter (LSA)
• IPF inside eHF
• ...
8 May 5, 2009 ICW Developer Conference
8. IPF Introduction (5/5)
System overview
IHE support Code mapping
OSGi support
Performance
test support
Management consoles
CDA support Flow management
Development tools
HL7 support Large message support
Core processors Event infrastructure
IPF Core
Apache Camel
Part of presentation and demos
9 May 5, 2009 ICW Developer Conference
9. Programming with Camel
Overview
• Components Connectivity to external systems or resources
• Endpoints Send/receive messages to/from external systems
• Processors Transform, validate, filter, route, etc. messages
• Routes Endpoints connected by processors using DSL
Route example
HTTP XPath HTTP
Endpoint Filter Endpoint
(inbound) (outbound) Camel DSL (Java)
from("jetty:http://0.0.0.0:8090/subscribers") // inbound HTTP endpoint
.filter().xpath("/person[@name='Martin']") // XPath filter
.to("http://localhost:8080/log"); // outbound HTTP endpoint
10 May 5, 2009 ICW Developer Conference
10. Programming with IPF
Overview
• All Camel features available
• Dynamic language support (Groovy)
• DSL extension mechanism (Groovy meta-programming)
• Predefined DSL extensions (Contribution from modules)
Route example
?
HTTP HL7 HL7 HTTP
Endpoint Validator Filter Endpoint
(inbound) (outbound)
IPF DSL (Groovy)
from('jetty:http://0.0.0.0:8090/admissions') // inbound HTTP endpoint
.unmarshal().ghl7() // HL7 parser
.validate().ghl7() // HL7 validator
.filter {it.in.body.PID[8].value == 'F'} // HL7 filter
.to('http://localhost:8080/log') // outbound HTTP endpoint
11 May 5, 2009 ICW Developer Conference
12. Agenda
Part 1
• IPF Introduction
• Programming IPF
• Demos
Part 2
• OSGi Support
• IPF Services
• Demos
Part 3
• Outlook
• Q&A
13 May 5, 2009 ICW Developer Conference
13. OSGi Support (1/3)
IPF components are OSGi bundles
• Deployable to any OSGi R4 platform
• Tested with Eclipse Equinox 3.4.1
IPF bundles register platform services
• Flow manager, mapping service ...
• Consumed by IPF applications
IPF extender bundles activate DSL extensions
• DSL extensions contributed by platform and application bundles
14 May 5, 2009 ICW Developer Conference
14. OSGi Support (2/3)
Technologies
• Eclipse Equinox 3.4.1
• Spring Dynamic Modules (DM)
Tooling
• maven-bundle-plugin to generate MANIFEST.MF
• Eclipse Plugin Development Environment (PDE)
15 May 5, 2009 ICW Developer Conference
15. OSGi Support (3/3)
IPF runtime
• OSGi platform for IPF applications
16 May 5, 2009 ICW Developer Conference
16. Demo
Implement example route as IPF OSGi application
Proxy
?
HTTP HL7 HL7 HTTP
Endpoint Validator Filter Endpoint route
(inbound) (outbound) bundle
OSGi Service
Registry
Processor
HL7 service
Transformer bundle
• Two OSGi bundles
• Deploy to IPF runtime
• Change service implementation at runtime
19 May 5, 2009 ICW Developer Conference
17. Flow management (1/2)
Purpose
• Monitor messages processed by IPF applications
• Support manual redelivery (replay) of messages
Monitoring
• Successful flows
• Failed flows
• Active flows
• Flow duration
• Message content
• ...
Replay
• Recovery from delivery failures
• Recovery from system failures Complements automated
• Recovery of application state (failure) recovery mechanisms
• ...
20 May 5, 2009 ICW Developer Conference
18. Flow management (2/2)
User interfaces
• Any JMX client
- JConsole
- ...
• Platform manager
- Eclipse RCP application
21 May 5, 2009 ICW Developer Conference
19. Demo
Enable flow management for example route
B Proxy D E
?
HTTP HL7 HL7 HTTP
Endpoint Validator Filter Endpoint route
(inbound) (outbound) bundle
OSGi Service Registry
Replay Strategy
Flow Manager Processor
Flow
Manager
HL7
Transformer
platform-camel-flow service
bundle bundle
22 May 5, 2009 ICW Developer Conference
20. Message Buffering for Delivery Failure Recovery
Compensate unavailability of destinations
• Automated redelivery of messages
• Number of redelivery attemps given by redelivery policy
Implemented with transacted JMS queue
• Transaction rolled back if destination unavailable
• Transaction rollback causes message redelivery
Manual replay of messages using flow manager
• When automated redelivery gives up
23 May 5, 2009 ICW Developer Conference
21. Demo
Add a message buffer to example route route
bundle
JMS Queue
B Proxy D E
?
HTTP HTTP
HL7 HL7
Endpoint Proxy Endpoint
Validator Filter
(inbound) (outbound)
OSGi Service Registry
Replay Strategy
Flow Manager Processor JMS Component
Flow camel-
Manager activemq
HL7
Transformer
platform-camel-flow service osgi-config-jms
bundle bundle bundle
24 May 5, 2009 ICW Developer Conference
22. Mapping Service
Mapping between codes from different code systems
• Often needed for HL7 message processing
• Gender codes, encounter type codes ...
Default mapping service
• Accessed via mapping DSL
• Configurable with mapping tables
25 May 5, 2009 ICW Developer Conference
23. Demo
Mapping definition Mapping service usage
mappings = { // Extension to java.lang.String
assert 'F'.mapGender() == 'W'
gender (
F : 'W', // Extension to HL7 DSL
(ELSE) : { it } assert msg.PID[8].mapGender() == 'W'
)
}
Gender code mapping
26 May 5, 2009 ICW Developer Conference
24. Demo
Implement code mapping for example route route
bundle
JMS Queue
B Proxy D E
?
HTTP HTTP
HL7 HL7
Endpoint Endpoint
Validator Filter
(inbound) (outbound)
OSGi Service Registry
Mapping
Service
Replay Strategy
Flow Manager Processor JMS Component
Bidi Flow camel-
Mapping
Mapping Manager activemq
Definition
Service
HL7
Transformer
mapping modules-hl7 platform-camel-flow service osgi-config-jms
fragment bundle bundle bundle bundle
use via DSL
27 May 5, 2009 ICW Developer Conference
26. Agenda
Part 1
• IPF Introduction
• Programming IPF
• Demos
Part 2
• OSGi Support
• IPF Services
• Demos
Part 3
• Outlook
• Q&A
29 May 5, 2009 ICW Developer Conference
27. Outlook (1/4)
DSL for HL7v3 messages and CDA/CCD documents
// Create a CDA builder
CDABuilder builder = new CDABuilder()
// Create a new CDA document
def document = builder.build {
clinicalDocument {
id(root:'2.16.840.1.113883.19.4', extension:'c266')
code(
code:'11488-4',
codeSystem:'2.16.840.1.113883.6.1',
...
)
title('Good Health Clinic Consultation Note')
recordTarget {
...
}
...
}
...
}
// Write document XML to stdout
System.out << document
30 May 5, 2009 ICW Developer Conference
28. Outlook (2/4)
DSL for implementing IHE actor interfaces and transactions
from('ihe:xds.b:iti-41?port=8080')
.process { exchange ->
def document = exchange.in.body
// do further document processing here ...
}
// communicate with your document management system
.to('http://...')
// notify about availability of new document
.to('ihe:nav:iti-25:?to=martin@openehealth.org')
31 May 5, 2009 ICW Developer Conference
29. Outlook (3/4)
IPF as a Service
• Central operation of IPF runtime and applications
• High-availability and scalability are part of service
• IPF application deployment via IPF Eclipse plugins
• Research in progress on scalable data stores
• Experiments with IPF on Google AppEngine
32 May 5, 2009 ICW Developer Conference
30. Outlook (4/4)
Performance testing framework
• Instrumentation DSL
• Processing statistics
Grails integration
• IPF plugin for Grails
IPF on ICW connector
• Prototype exists
33 May 5, 2009 ICW Developer Conference