Apache Synapse Enterprise Service Bus (ESB) - 2.0.0 Release Notes - January 2011

1. Overview
    The Apache Synapse ESB is a robust, lightweight and highly scalable and distributed
    open source Enterprise Service Bus (ESB). It supports SOAP Web services as well as Legacy
    services over transports such as JMS, Apache VFS File systems, Mail etc, and SOAP, REST/POX,
    plain text and binary message payloads. (Please see http://synapse.apache.org for more details)

    Apache Synapse graduated from the Apache Incubator on the 2nd of January 2007, and the first
    Synapse 1.0 was released on the 11th of June 2007. On the 20th of December 2007, Synapse was
    accepted as a top level project (TLP) under the Apache Software Foundation.

2. Installation Prerequisites 

    Apache Synapse requires a J2SE runtime of version 1.5.x or later. Running the samples also
    requires Apache Ant 1.7.x or later. Although Synapse would run with a JDK > 1.5.x, the Script
    mediator may not properly function on these JDKs. Building Synapse from source requires
    JDK 1.5.x or later, and Apache Maven 2.1.0 or later

3. Quick start
    Please see the docs/Synapse_Quickstart.html guide

4. Building the Samples
    Please see the documents docs/Synapse_Samples.html and docs/Synapse_Samples_Setup.html

5. Synapse configuration language
    Please see the document docs/Synapse_Configuration_Language.html

6. Extending Synapse
    Please see the document docs/Synapse_Extending.html
    
7. Known Issues and limitations

  * SYNAPSE-180 Does not support throttling by concurrency within a cluster
  * SYNAPSE-186 Does not support HTTP some of the REST operations (such as put/delete etc)
  * SYNAPSE-181 Does not yet support JTA transactions
  * SYNAPSE-330 Does not yet support load balancing with session affinity using SOAP sessions
  * SYNAPSE-280 Does not preserve CDATA sections within payloads
  * SYNAPSE-307 The XSLT mediator will not report errors encountered in a provided stylesheet

  * The Synapse JMS implementation supports JMS 1.0.2b, however due to licensing issues we include
    the JMS 1.1 spec JAR from Apache Geronimo (geronimo-jms_1.1_spec-1.1.jar) instead. If you have
    any issues with JMS 1.0.x, please download the Sun JMS 1.0.2b JAR and replace supplied JAR from
    Geronimo.

8. Frequently asked questions

  * How can I change the default logging level of Synapse?
    Edit the lib/log4j.properties and set the line "log4j.category.org.apache.synapse=INFO" to
    "log4j.category.org.apache.synapse=DEBUG" and restart Synapse.

  * If you get an error related to WS-Security or when using it, check to ensure that your JDK
    uses the "Unlimited Strength Jurisdiction Policy Files". These could be downloaded from
    http://java.sun.com/javase/downloads/index_jdk5.jsp Refer to the associated documentation
    for instructions on how to install it to your JDK.

  * If you encounter issues with your JDK related to XML processing, try placing the Xerces jar
    files xercesImpl-2.8.0.jar and xml-apis-1.3.03.jar in your <JDK>/jre/lib/endorsed/ directory.

9. Reporting Problems

    Please use the Apache JIRA system (http://issues.apache.org/jira/browse/SYNAPSE) to report issues
    You may also join the:
        synapse-dev mailing  list by sending email to dev-subscribe@synapse.apache.org
        synapse-user mailing list by sending email to user-subscribe@synapse.apache.org

10. New features
    The 2.0.0 release
        * New, fine-grained configuration model
        * Hot deployment and hot update support for configuration artifacts
        * Priority based mediation support
        * Comprehensive eventing capabilities with WS-Eventing support
        * Secure vault for encrypting passwords in configuration files
        * File locking support in the VFS transport for concurrent polling
        * URLRewrite medaitor for fast and simple URL rewriting
        * Synapse configuration observer API
        * Multiple identity support in the HTTPS transport
        * Enhanced JMX monitoring support for the NHTTP transport
        * Dead letter channel implementation (experimental)
        * Synapse XAR Maven plugin for generating configuration artifacts
    The 1.2 release
        * Support for Hessian binary messages
        * FIX (Financial Information eXchange) protocol transport
        * WS-Reliable Messaging support with WSO2 Mercury
        * Support for re-usable database connection pools for DB report/lookup mediators
        * Support for GZip encoding and HTTP 100 continue
        * Natural support for dual channel messaging with WS-Addressing
        * Cluster aware sticky load balancing support
        * Non-blocking streaming of large messages at high concurreny with constant memory usage
        * Support for an ELSE clause for the Filter mediator
        * Ability to specify XPath expressions relative to the envelope or body
        * Support for separate policies for incoming/outgoing messages
        * Support for a mandatory sequence before mediation

    The 1.1.1/1.1.2 releases                
        * Enhanced clustering support for the Cache/Throttle Mediators
        * New Mail transport that supports POP3/IMAP/SMTP
        * JMX Monitoring support
        * Callout Mediator
        * Improved JMS/VFS transports
        * Improved REST/POX support
        * Annotations support for POJOCommand mediator
        * Ability to pin a proxy or a task to server instances

    The 1.1 release
        * Apache VFS based file transport
        * Scheduled Task support
        * XQuery mediator
        * POJO Command mediator
        * DB Report and DB Lookup mediators
        * Cache and Throttle mediators/enhancements
        * Split/Clone/Aggregate mediators
        * Improved logging and tracing support

    The 1.0 release
        * Non blocking HTTP and HTTPS transport based on Apache HttpCore/NIO
        * Proxy services with in/out/fault sequences, endpoints, inline sequences and WSDL support
        * WSDL endpoints
        * Load balancing and Failover endpoints
        * Throttling mediator

    The 0.91 release adds support for:
        * WS-Reliable Messaging Sequence management

    The 0.90 release adds support for:
        * WS-Security termination and initiation
        * WS-ReliableMessaging termination and initiation
        * Support for dynamic reloading and remote reigstries
        * Scripting mediators based on Apache BSF
        * Refactored and cleaner synapse configuration xml
