<?xml version="1.0" encoding="ISO-8859-1" ?>
<!--
  ~  Licensed to the Apache Software Foundation (ASF) under one
  ~  or more contributor license agreements.  See the NOTICE file
  ~  distributed with this work for additional information
  ~  regarding copyright ownership.  The ASF licenses this file
  ~  to you under the Apache License, Version 2.0 (the
  ~  "License"); you may not use this file except in compliance
  ~  with the License.  You may obtain a copy of the License at
  ~
  ~   http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~  Unless required by applicable law or agreed to in writing,
  ~  software distributed under the License is distributed on an
  ~   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  ~  KIND, either express or implied.  See the License for the
  ~  specific language governing permissions and limitations
  ~  under the License.
  -->

<document>

  <properties>
    <title>The Lightweight ESB</title>
  </properties>

<body>
  
<section name="Apache Synapse Enterprise Service Bus (ESB)">
  <p>
      Apache Synapse is a lightweight and high-performance Enterprise Service Bus (ESB). Powered
      by a fast and asynchronous mediation engine, Apache Synapse provides exceptional support
      for XML, Web Services and REST. In addition to XML and SOAP, Apache Synapse supports
      several other content interchange formats, such as plain text, binary, Hessian and JSON. The
      wide range of transport adapters available for Synapse, enables it to communicate over many
      application and transport layer protocols. As of now, Apache Synapse has support for protocols
      like HTTP/S, Mail (POP3, IMAP, SMTP), JMS, TCP, UDP, VFS, SMS, XMPP and FIX.
  </p>
  <p>
      Apache Synapse is free and open source software distributed under the
      <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>The
      latest version of Synaspe is <a href="download/2.0/download.cgi">v2.0</a>. This release
      comes with a horde of new features, bug fixes, performance and stability improvements.
  </p>
  <p>Apache Synapse, Synapse, Apache, the Apache feather logo, and the Apache Synapse project logo
      are trademarks of The <a href="http://www.apache.org">Apache Software Foundation</a>.</p>
</section>
<section name="New in Version 2.0">
    <ul>
        <li>New, fine-grained configuration model</li>
        <li>Hot deployment and hot update support for configuration artifacts</li>
        <li>Priority based mediation support</li>
        <li>Comprehensive eventing capabilities with WS-Eventing support</li>
        <li>Secure vault for encrypting passwords in configuration files</li>
        <li>File locking support in the VFS transport for concurrent polling</li>
        <li>URLRewrite medaitor for fast and simple URL rewriting</li>
        <li>Synapse configuration observer API</li>
        <li>Multiple identity support in the HTTPS transport</li>
        <li>Enhanced JMX monitoring support for the NHTTP transport</li>
        <li>Dead letter channel implementation (experimental)</li>
        <li>Synapse XAR Maven plugin for generating configuration artifacts</li>
    </ul>
</section>
<section name="Key Features">
    <ul>
        <li>Proxy services - facilitating transport, interface (WSDL/Schema/Policy), message format (SOAP 1.1/1.2, POX/REST, Text, Binary), QoS (WS-Addressing/WS-Security/WS-RM) and optimization switching (MTOM/SwA)</li>
        <li>Non-blocking HTTP/S transports for fast HTTP interactions and support for thousands of concurrent connections</li>
        <li>VFS transport for file manipulation and interaction with FTP, SFTP, CIFS and WEBDAV</li>
        <li>JMS support for binary, plain text, XML and SOAP payloads</li>
        <li>Mail transport with extensive support for POP3, IMAP and SMTP</li>
        <li>Support for industry driven <a href="http://www.fixprotocol.org/">Financial Information eXchange (FIX)</a> protocol</li>
        <li>Built-in Registry/Repository, facilitating dynamic reloading of the configuration and associated resources (e.g. XSLTs, XSD, JS, ..)</li>
        <li>Built-in support for scheduling tasks using the <a target="_blank" href="http://www.opensymphony.com/quartz">Quartz</a> scheduler</li>
        <li>Load-balancing (with or without sticky sessions) and fail-over routing</li>
        <li>Support for many Web Services standards including WS-Addressing, WS-Security and WS-Reliable Messaging</li>
        <li>Policy based message throttling and caching (with special support for clustered environments)</li>
        <li>Message splitting and aggregation</li>
        <li>Database lookup and update support with database connection pooling</li>
        <li>Fine grained statistics collection over sequences, endpoints and proxy services</li>
        <li>JMX monitoring and management</li>
        <li>Easily extendable with Java, Spring, or BSF Scripting languages (Javascript, Ruby, Groovy, etc.)</li>
    </ul>
</section>
<section name="Known Issues">
    <p>Except for the issues listed in the Apache Synapse <a href="issue-tracking.html">issue tracker</a> there are following minor issues associated with this release of the Synapse</p>
    <ul>
        <li>Sandesha2 build shipped with the Synapse distribution has not been tested extensively
            and is a custom build, built by the synapse community. Although all the shipped reliable
            messaging samples are working with this shipped sandesha2 build, it is recommended that
            you download a compatible Sandesha2 build from the Sandesha2 site if you plan to put any
            reliable messaging scenario into production.</li>
        <li>Message store implementation and DLC has not been tested extensively, so use it with
            care after testing in production if you are planning to use it in production</li>
    </ul>
</section>
<section name="Apache Synapse Runtime Architecture">
  <p>
      Apache Synapse is designed to be lightweight and fast. The non-blocking HTTP transport,
      the multi-threaded mediation engine and the streaming XML infoset combine to ensure that
      Synapse can mediate very high volumes of messages through the service bus with minimum
      delay and resource usage. Synapse also comes with comprehensive logging capabilities,
      statistics collection and JMX monitoring support which are crucial in production deployments.
  </p>
  <img src="images/diagram_v2.png" caption="Apache Synapse - Runtime Architecture"/>
  <p>
      Synapse uses Apache Axis2 as the underlying Web Services engine. Therefore it has outstanding
      support for Web Services and related standards such as SOAP and WSDL. Tried and tested
      Axis2 modules like Apache Rampart and Apache Sandesha2 can be used with Synapse with no
      configuration overhead. Using such external modules, Apache Synapse supports a range of
      Web Services standards including WS-Security and WS-Reliable Messaging. Synapse
      also makes use of the Axis2 clustering framework to provide enteprise grade clustering support.
  </p>
  <p>
      Synapse is configured using a simple, XML-based configuration language.
      The configuration language and the related functional components are designed with SOA
      best practices in mind. It is trivial to store configuration fragments in an
      external SOA registry and import them to the mediation engine on demand.
      Synapse ships with a large collection of mediators that can be used to implement even the
      most complex enterprise integration scenarios. If necessary, the mediation engine can be
      extended by developing custom mediators using Java or your favorite scripting
      language.
  </p>
</section>
</body>
</document>
