<?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 designed to be a simple, lightweight and high performance
       Enterprise Service Bus (ESB) from Apache. Based on a small asynchronous core,
       Apache Synapse has excellent support for XML and Web services - as well as binary and text formats.
       The Synapse engine is configured with a simple XML format and comes with a set of ready-to-use transports and mediators.
       We recommend you start by reading the QuickStart and then trying out the samples. Synapse is made available under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache Software License 2.0</a>.
  </p><p>
      <b>Latest News</b>
  </p><p>
      In December 2007, Apache Synapse became a top level project (TLP) of the
      Apache Software Foundation.
  </p>
  <p>For more information, see:
  <ul>
  <li><a href="./quickstart.html">Quick Start Guide</a></li>
  <li><a href="./configuration.html">The Synapse Configuration Language</a></li>
  <li><a href="./samples.html">A Quick start with Synapse Samples</a></li>
  <li><a href="./extending.html">Extending Synapse</a></li>
  <li>The Developer mailing list:  <a href="mailto:dev-subscribe@synapse.apache.org">Subscribe</a></li>
  <li>The User mailing list:  <a href="mailto:user-subscribe@synapse.apache.org">Subscribe</a></li>
  <!--li>The Synapse Wiki <a href="http://wiki.apache.org/ws/Synapse">http://wiki.apache.org/ws/Synapse</a></li-->
  </ul>
  </p>
</section>

<section name="Introduction">
<p>
    Apache Synapse is an ESB that has been designed to be simple to configure, very fast, and effective at solving many integration and gatewaying problems.
    Synapse has support for HTTP, SOAP, SMTP, JMS, FTP and file system transports, as well as first class support for standards such as WS-Addressing,
    Web Services Security (WSS), Web Services Reliable Messaging (WSRM), efficient binary attachments (MTOM/XOP).
    Synapse can transform messages using key standards such as XSLT, XPath and XQuery, or simply using Java. Synapse supports a number of useful
    functions out-of-the-box without programming, but it also can be extended using popular programming languages such as Java, JavaScript, Ruby, and Groovy.
</p>
<p>
    Synapse has a completely asynchronous core, and supports non-blocking HTTP and HTTPS using the
    excellent <a href="http://hc.apache.org/httpcomponents-core/index.html">Apache HttpCore</a> NIO module. In addition, Synapse supports JMS v1.0 and higher, Apache VFS File Systems (FTP, SFTP, File (including zip/jar/tar/gz), Webdav, CIFS), POP3/IMAP/SMTP transports. Apache Synapse can process
    SOAP 1.1/1.2, pure XML/REST, Text and Binary messages with support for any-to-any conversion and transformation.
</p>
</section>

<section name="Key Features">
		<p>The latest release of Synapse is <a href="../download/1.1.1/download.cgi">1.1.1</a>. Its key features are </p>

	<ul>
        <li><p>Proxy services - facilitating transport, interface (WSDL/Schema/Policy), message format (SOAP 1.1/1.2, POX/REST, Text, Binary), QoS (WS-Security/RM) and optimization switching (MTOM/SwA)</p></li>
        <li><p>Non-blocking http/s transports based on Apache <a target="_blank" href="http://hc.apache.org/httpcomponents-core/index.html">HttpCore</a> for ultrafast execution and support for thousands of connections</p></li>
        <li><p>Built in Registry/Repository, facilitating dynamic updating and reloading of the configuration and associated resources (e.g. XSLTs, XSD, JS, ..)</p></li>
        <li><p>Easily extended via custom Java class (mediator and command)/Spring mediators, or BSF Scripting languages (Javascript, Ruby, Groovy etc)</p></li>
        <li><p>Built in support for scheduling tasks using the <a target="_blank" href="http://www.opensymphony.com/quartz">Quartz</a> scheduler</p></li>
        <li><p>Load-balancing/Fail-over, and clustered Throttling and Caching support</p></li>
        <li><p>WS-Security, WS-Reliable Messaging &amp; Throttling configurable via WS-Policies</p></li>
        <li><p>JMS (v1.x upwards) message support for binary, plain text and XML and SOAP payloads</p></li>
        <li><p>Enhanced support for Apache VFS transports (s/ftp, file, zip/tar/gz, webdav, cifs..)</p></li>
        <li><p>Support for message splitting &amp; aggregation using the EIP</p></li>
        <li><p>Database lookup &amp; store support with DBMediators</p></li>
        <li><p>Enhanced Mail transport with POP3/SMTP/IMAP protocols</p></li>
        <li><p>Ability to pin a proxy service or a task to server instances on a cluster</p></li>
        <li><p>Lightweight, XML and Web services centric messaging model</p></li>
        <li><p>Configurations serialized into a file system for versioning/backup &amp; restoration with built-in Registry support</p></li>
        <li><p>Support for Error handling and timeouts, recovery with http/s aintainance mode &amp; gracefull shutdown</p></li>
        <li><p>JMX monitoring support</p></li>
    	<li><p>Many samples and a built-in Axis2 server to try out and experiment with samples (Samples includes WS-Security, JMS POX/Text messages, Script mediation and many more samples which can be run out of the box) </p></li>
	    <li><p>Enhanced documentation</p></li>
	</ul>
</section>
</body>
</document>