camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel: Async (page edited)
Date Sun, 10 May 2009 13:06:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/CAMEL">CAMEL</a> :
            <a href="http://cwiki.apache.org/confluence/display/CAMEL/Async">Async</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Async">Async</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus Ibsen</a>
            <span class="smallfont">(May 10, 2009)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=117116&originalVersion=19&revisedVersion=20">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h2><a name="Async-Async"></a>Async</h2>
<p><b>Available as of Camel 2.0</b></p>

<p>The asynchronous API in Camel have been rewritten for Camel 2.0, and the information on this page applies for Camel 2.0 and later.</p>

<p>The <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> API in Camel is primarily divided in two areas<br/>
1. Initiating an <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> messaging from the client<br/>
2. Turning a route into <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> using the <a href="/confluence/display/CAMEL/DSL" title="DSL">DSL</a></p>

<p>Before we look at these two areas we start with a bit of background information and looks at the concept from at a higher level using diagrams.<br/>
Then we check out the first area how a client can initiate an <span class="nobr"><a href="/confluence/pages/createpage.action?spaceKey=CAMEL&amp;title=Asyc&amp;linkCreation=true&amp;fromPageId=117116" title="Create Page: Asyc" class="createlink">Asyc<sup><img class="rendericon" src="/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> message exchange and we also throw in the synchronous message exchange in the mix as well so we can compare and distill the difference.<br/>
And finally we turn our attention towards the last area the new <b>async</b> DSL and what it can be used for.</p>

<h2><a name="Async-Background"></a>Background</h2>
<p>The new <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> API in Camel 2.0 leverages in much greater detail the Java Concurrency API and its support for executing tasks asynchronous.<br/>
Therefore the Camel <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> API should be familiar for users with knowledge of the Java Concurrency API.</p>

<h3><a name="Async-Afewconceptstomaster"></a>A few concepts to master</h3>
<p>When doing messaging there are a few aspects to keep in mind.</p>

<p>First of all a caller can initiate a message exchange as either:</p>
<ul class="alternate" type="square">
	<li><a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request only</a></li>
	<li><a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a></li>
</ul>


<p><a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request only</a> is when the caller sends a message but do <b>not</b> expect any reply. This is also sometimes known as fire and forget or event message.</p>

<p>The <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> is when the caller sends a message and then <b>waits for a reply</b>. This is like the <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> protocol that we use every day when we surf the web.<br/>
We send a request to fetch a web page and wait until the reply message comes with the web content.</p>

<p>In Camel a message is labeled with a Message <a href="/confluence/display/CAMEL/Exchange+Pattern" title="Exchange Pattern">Exchange Pattern</a> that labels whether its a request only or request reply message. Camel uses the <a href="/confluence/display/CAMEL/JBI" title="JBI">JBI</a> term for this an uses <tt>InOnly</tt> for the request only, and <tt>InOut</tt> for the request reply.</p>

<p>For all message exchange they can be executed either:</p>
<ul class="alternate" type="square">
	<li>synchronous</li>
	<li>asynchronous</li>
</ul>


<h4><a name="Async-SynchronousRequestReply"></a>Synchronous Request Reply</h4>
<p>A synchronous exchange is defined as the caller sends a message and waits until its complete before continuing. This is illustrated in the diagram below:</p>

<p><img src="/confluence/download/attachments/117116/camel_sync_request_reply.png" align="absmiddle" border="0" /></p>

<p>1. The client sends a sync <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> message over <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> to Camel. The client application will wait for the response that Camel routes and processes.<br/>
2. The message invokes an external <a href="/confluence/display/CAMEL/MINA" title="MINA">TCP</a> service using synchronous <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a>. The client application still waits for the response.<br/>
3. The response is send back to the client.</p>

<h4><a name="Async-AsynchronousRequestReply"></a>Asynchronous Request Reply</h4>
<p>On the other hand the asynchronous version is where the caller sends a message to an <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a> and then returns immediately back to the caller. The message however is processed in another thread, the asynchronous thread. Then the caller can continue doing other work and at the same time the asynchronous thread is processing the message.  This is illustrated in the diagram below:</p>

<p><img src="/confluence/download/attachments/117116/camel_async_request_reply.png" align="absmiddle" border="0" /></p>

<p>1. The client sends an <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> message over <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> to Camel. The control is immediately returned to the client application, that can continue and do other work while Camel routes the message.<br/>
2. Camel invokes an external <a href="/confluence/display/CAMEL/MINA" title="MINA">TCP</a> service using synchronous <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a>. The client application can do other work simultaneously.<br/>
3. The client wants to get the reply so it uses the Future handle it got as <em>response</em> from step 1. With this handle it retrieves the reply, wait if nessasary if the reply is not ready.</p>

<h3><a name="Async-SynchronousRequestOnly"></a>Synchronous Request Only</h3>
<p>You can also do synchronous <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request only</a> with Camel. The client sends a message to Camel in which a reply is not expected. However the client still waits until the message is processed completely. This is illustrated in the diagram below:</p>

<p><img src="/confluence/download/attachments/117116/camel_sync_request_only.png" align="absmiddle" border="0" /></p>

<p>1. The client sends a <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request only</a> and we can still use <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> despite http being <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> by nature.<br/>
2. Camel invokes an external <a href="/confluence/display/CAMEL/MINA" title="MINA">TCP</a> service using synchronous <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a>. The client application is still waiting.<br/>
3. The message is processed completely and the control is returned to the client.</p>

<p>So why do you want to use synchronous <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request Only</a>? Well if you want to know whether the message was processed successfully or not before continuing. With synchronous it allows you to wait while the message is being processed. In case the processing was succesful the control is returned to the client with no notion of error. In case of failure the client can detect this as an exception is thrown. (and <tt>exchange.isFailed()</tt> returns <tt>true</tt>).</p>

<h3><a name="Async-AsynchronousRequestOnly"></a>Asynchronous Request Only</h3>

<p>As opposed to the synchronous <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request Only</a> the <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> counter part will <b>not</b> wait for the processing of the message to complete. In this case the client can immediately continue doing other work while the message is being routed and processed in Camel. This is illustrated in the diagram below:</p>

<p><img src="/confluence/download/attachments/117116/camel_async_request_only.png" align="absmiddle" border="0" /></p>

<p>1. The client sends a <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request only</a> and we can still use <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> despite http being <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> by nature. The control is immediately returned to the client application, that can continue and do other work while Camel routes the message.<br/>
2. Camel invokes an external <a href="/confluence/display/CAMEL/MINA" title="MINA">TCP</a> service using synchronous <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a>. The client application can do other work simultaneously.<br/>
3. The message completes but no result is returned to the client.</p>

<p><b>Notice:</b> As Camel always returns a <tt>Future</tt> handle for <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> messaging to the client. The client can then use this handler or not to get hold of the status of the processing whether the task is complete or an Exception occured during processing.</p>

<table cellpadding='5' width='85%' cellspacing='8px' class='tipMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>In case you want to know whether the <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request Only</a> failed, then you can use the <tt>Future</tt> handle and invoke <tt>get()</tt> and if it throws a <tt>ExecutionException</tt> then the processing failed. The caused exception is wrapped. You can invoke <tt>isDone()</tt> first to test whether the task is done or still in progress. Otherwise invoking <tt>get()</tt> will wait until the task is done.</p></td></tr></table>

<p>With these diagrams in mind lets turn out attention to the <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> API and how to use it with Camel.</p>

<h2><a name="Async-1%29TheAsyncClientAPI"></a>1) The <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> Client API</h2>
<p>Camel provides the <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> Client API in the <span class="nobr"><a href="http://camel.apache.org/maven/camel-core/apidocs/org/apache/camel/ProducerTemplate.html" title="Visit page outside Confluence" rel="nofollow">ProducerTemplate<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> where we have added about 10 new methods to Camel 2.0. We have listed the most important in the table below:</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Method </th>
<th class='confluenceTh'> Returns </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> setExecutorService </td>
<td class='confluenceTd'> void </td>
<td class='confluenceTd'> Is used to set the Java ExecutorService. Camel will by default provide a ScheduledExecutorService with 5 thread in the pool. </td>
</tr>
<tr>
<td class='confluenceTd'> asyncSend </td>
<td class='confluenceTd'> Future&lt;Exchange&gt; </td>
<td class='confluenceTd'> Is used to send an async exchange to a Camel <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a>. Camel will imeddiately return control to the caller thread after the task has been submitted to the executor service. This allows you to do other work while Camel processes the exchange in the other async thread. </td>
</tr>
<tr>
<td class='confluenceTd'> asyncSendBody </td>
<td class='confluenceTd'> Future&lt;Object&gt; </td>
<td class='confluenceTd'> As above but for sending body only. This is a request only messaging style so no reply is expected. Uses the <tt>InOnly</tt> exchange pattern. </td>
</tr>
<tr>
<td class='confluenceTd'> asyncRequestBody </td>
<td class='confluenceTd'> Future&lt;Object&gt; </td>
<td class='confluenceTd'> As above but for sending body only. This is a <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> messaging style so a reply is expected. Uses the <tt>InOut</tt> exchange pattern. </td>
</tr>
<tr>
<td class='confluenceTd'> extractFutureBody </td>
<td class='confluenceTd'> T </td>
<td class='confluenceTd'> Is used to get the result from the asynchronous thread using the Java Concurrency Future handle. </td>
</tr>
</tbody></table>

<p>The <tt>asyncSend</tt> and <tt>asyncRequest</tt> methods return a Future handle. This handle is what the caller must use later to retrieve the asynchronous response. You can do this by using the <tt>extractFutureBody</tt> method, or just use plain Java but invoke <tt>get()</tt> on the <tt>Future</tt> handle.</p>

<h4><a name="Async-TheFutureAPI"></a>The Future API</h4>
<p>The <tt>java.util.concurrent.Future</tt> API have among others the following methods:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Method </th>
<th class='confluenceTh'> Returns </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> isDone </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> Returns a boolean whether the task is done or not. Will even return <tt>true</tt> if the tasks failed due to an exception thrown. </td>
</tr>
<tr>
<td class='confluenceTd'> get() </td>
<td class='confluenceTd'> Object </td>
<td class='confluenceTd'> Gets the response of the task. In case of an exception was thrown the <tt>java.util.concurrent.ExecutionException</tt> is thrown with the caused exception. </td>
</tr>
</tbody></table>

<h3><a name="Async-Example%3AAsynchronousRequestReply"></a>Example: Asynchronous Request Reply</h3>
<p>Suppose we want to call a <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> service but it is usually slow and thus we do not want to block and wait for the response, as we can do other important computation. So we can initiate an <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> exchange to the <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> endpoint and then do other stuff while the slow <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> service is processing our request. And then a bit later we can use the <tt>Future</tt> handle to get the response from the <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> service. Yeah nice so lets do it:</p>

<p>First we define some routes in Camel. One for the <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> service where we simulate a slow server as it takes at least 1 second to reply. And then other route that we want to invoke while the <a href="/confluence/display/CAMEL/HTTP" title="HTTP">Http</a> service is on route. This allows you to be able to process the two routes simultaneously:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// The mocks are here <span class="code-keyword">for</span> unit test
</span>
<span class="code-comment">// Some other service to <span class="code-keyword">return</span> a name, <span class="code-keyword">this</span> is invoked synhronously
</span>from(<span class="code-quote">"direct:name"</span>).transform(constant(<span class="code-quote">"Claus"</span>)).to(<span class="code-quote">"mock:result"</span>);

<span class="code-comment">// Simulate a slow http service (delaying 1 sec) we want to invoke async
</span>from(<span class="code-quote">"jetty:http:<span class="code-comment">//0.0.0.0:9080/myservice"</span>)
</span>    .delay(1000)
    .transform(constant(<span class="code-quote">"Bye World"</span>))
    .to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>And then we have the client API where we call the two routes and we can get the responses from both of them. As the code is based on unit test there is a bit of mock in there as well:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">MockEndpoint mock = getMockEndpoint(<span class="code-quote">"mock:result"</span>);
<span class="code-comment">// We expect the name job to be faster than the async job even though the async job
</span><span class="code-comment">// was started first
</span>mock.expectedBodiesReceived(<span class="code-quote">"Claus"</span>, <span class="code-quote">"Bye World"</span>);

<span class="code-comment">// Send a async request/reply message to the http endpoint
</span>Future <span class="code-keyword">future</span> = template.asyncRequestBody(<span class="code-quote">"http:<span class="code-comment">//0.0.0.0:9080/myservice"</span>, <span class="code-quote">"Hello World"</span>);
</span>
<span class="code-comment">// We got the <span class="code-keyword">future</span> so in the meantime we can <span class="code-keyword">do</span> other stuff, as <span class="code-keyword">this</span> is Camel
</span><span class="code-comment">// so lets invoke another request/reply route but <span class="code-keyword">this</span> time is synchronous
</span><span class="code-object">String</span> name = template.requestBody(<span class="code-quote">"direct:name"</span>, <span class="code-quote">"Give me a name"</span>, <span class="code-object">String</span>.class);
assertEquals(<span class="code-quote">"Claus"</span>, name);

<span class="code-comment">// Okay we got a name and we have done some other work at the same time
</span><span class="code-comment">// the async route is running, but now its about time to wait and get
</span><span class="code-comment">// get the response from the async task
</span>
<span class="code-comment">// We use the extract <span class="code-keyword">future</span> body to get the response from the <span class="code-keyword">future</span>
</span><span class="code-comment">// (waiting <span class="code-keyword">if</span> needed) and then <span class="code-keyword">return</span> a string body response.
</span><span class="code-comment">// This allows us to <span class="code-keyword">do</span> <span class="code-keyword">this</span> in a single code line instead of using the
</span><span class="code-comment">// JDK Future API to get hold of it, but you can also use that <span class="code-keyword">if</span> you want
</span><span class="code-object">String</span> response = template.extractFutureBody(<span class="code-keyword">future</span>, <span class="code-object">String</span>.class);
assertEquals(<span class="code-quote">"Bye World"</span>, response);

assertMockEndpointsSatisfied();</pre>
</div></div>

<p>All together it should give you the basic idea how to use this <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> API and what it can do.</p>

<h3><a name="Async-Example%3ASynchronousRequestReply"></a>Example: Synchronous Request Reply</h3>
<p>This example is just to a pure synchronous version of the example from above that was <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> based.</p>

<p>The route is the same, so its just how the client initiate and send the messages that differs:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">MockEndpoint mock = getMockEndpoint(<span class="code-quote">"mock:result"</span>);
<span class="code-comment">// We expect the http job to complete before the name job
</span>mock.expectedBodiesReceived(<span class="code-quote">"Bye World"</span>, <span class="code-quote">"Claus"</span>);

<span class="code-comment">// Send a sync request/reply message to the http endpoint
</span><span class="code-object">String</span> response = template.requestBody(<span class="code-quote">"http:<span class="code-comment">//0.0.0.0:9080/myservice"</span>, <span class="code-quote">"Hello World"</span>, <span class="code-object">String</span>.class);
</span>assertEquals(<span class="code-quote">"Bye World"</span>, response);

<span class="code-comment">// Send a sync request/reply message to the direct endpoint
</span><span class="code-object">String</span> name = template.requestBody(<span class="code-quote">"direct:name"</span>, <span class="code-quote">"Give me a name"</span>, <span class="code-object">String</span>.class);
assertEquals(<span class="code-quote">"Claus"</span>, name);

assertMockEndpointsSatisfied();</pre>
</div></div>

<h3><a name="Async-UsingtheAsyncAPIwiththeCamelclassicAPI"></a>Using the <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> API with the Camel classic API</h3>
<p>When using the Camel API to create a producer and send an <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> we do it like this:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">Endpoint endpoint = context.getEndpoint(<span class="code-quote">"http:<span class="code-comment">//slowserver.org/myservice"</span>);
</span>Exchange exchange = endpoint.createExchange();
exchange.getIn().setBody(<span class="code-quote">"Order ABC"</span>);
<span class="code-comment">// create a regular producer
</span>Producer producer = endpoint.createProducer();
<span class="code-comment">// send the exchange and wait <span class="code-keyword">for</span> the reply as <span class="code-keyword">this</span> is synchronous
</span>producer.process(exchange);</pre>
</div></div>

<p>But to do the same with <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> we need a little help from a helper class, so the code is:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">Endpoint endpoint = context.getEndpoint(<span class="code-quote">"http:<span class="code-comment">//slowserver.org/myservice"</span>);
</span>Exchange exchange = endpoint.createExchange();
exchange.getIn().setBody(<span class="code-quote">"Order ABC"</span>);
<span class="code-comment">// create a regular producer
</span>Producer producer = endpoint.createProducer();
<span class="code-comment">// normally you will use a shared exectutor service with pools
</span>ExecutorService executor = Executors.newSingleThreadExecutor();
<span class="code-comment">// send it async with the help of <span class="code-keyword">this</span> helper
</span>Future&lt;Exchange&gt; <span class="code-keyword">future</span> = AsyncProcessorHelper.asyncProcess(executor, producer, exchange);
<span class="code-comment">// here we got the <span class="code-keyword">future</span> handle and we can <span class="code-keyword">do</span> other stuff <span class="code-keyword">while</span> the exchange is being routed in the other asynchronous thread
</span>...
<span class="code-comment">// and to get the response we use regular Java Concurrency API
</span>Exchange response = <span class="code-keyword">future</span>.get();</pre>
</div></div>

<h2><a name="Async-2%29UsingtheAsyncDSL"></a>2) Using the Async DSL</h2>
<p>In Camel 2.0 the <tt>async</tt> DSL replaces the old <tt>thread</tt> DSL. </p>

<p>The <tt>async</tt> DSL can be used to turn a synchronous route into <a href="/confluence/display/CAMEL/Async" title="Async">Async</a>. What happens is that from the point forwards from <tt>async</tt> the messages is routed asynchronous in a new thread. The caller will either wait for a reply if a reply is expected, such as when we use <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> messaging. Or the caller will complete as well if no reply was expected such as <a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request Only</a> messaging. </p>

<p>The <tt>async</tt> DSL allows a the following options: </p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Option </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> poolSize </td>
<td class='confluenceTd'> A number to indicate the core pool size of the underlying Java <tt>ExecutorService</tt> that is actually doing all the heavy lifting of handling <a href="/confluence/display/CAMEL/Async" title="Async">Async</a> tasks and correlate replies etc. By default a pool size of 5 is used. </td>
</tr>
<tr>
<td class='confluenceTd'> executorService </td>
<td class='confluenceTd'> You can provide a custom <tt>ExecutorService</tt> to use, for instance in a managed environment a J2EE container could provide this service so all thread pools is controlled by the J2EE container. </td>
</tr>
<tr>
<td class='confluenceTd'> waitForTaskToComplete </td>
<td class='confluenceTd'> Option to specify if the caller should wait for the async task to be complete or not before continuing. The following 3 options is supported: <b>Always</b>, <b>Newer</b> or <b>IfReplyExpected</b>. The first two options is self explained. The last will only wait if the message is <a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a> based. The default option is <b>IfReplyExpected</b>. </td>
</tr>
</tbody></table>

<h3><a name="Async-Example%3AasyncDSL"></a>Example: async DSL</h3>
<p>Suppose we receive orders on a JMS queue. Some of the orders expect a reply while other do not (either a <tt>JMSReplyTo</tt> exists or not). And lets imagine to process this order we need to do some heavy CPU calculation. So how do we avoid the messages that does not expect a reply to block until the entire message is processed? Well we use the <tt>async</tt> DSL to turn the route into asynchronous routing before the heavy CPU task. Then the messages that does not expect a reply can return beforehand. And the messages that expect a reply, well yeah they have to wait anyway. So this can be accomplished like the route below:</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// just a unit test but imaging using your own data format that does complex
</span><span class="code-comment">// and CPU heavy processing <span class="code-keyword">for</span> decrypting the message
</span>DataFormat mySecureDataFormat = <span class="code-keyword">new</span> StringDataFormat(<span class="code-quote">"iso-8859-1"</span>);

<span class="code-comment">// list on the JMS queue <span class="code-keyword">for</span> <span class="code-keyword">new</span> orders
</span>from(<span class="code-quote">"jms:queue:order"</span>)
    <span class="code-comment">// <span class="code-keyword">do</span> some sanity check validation
</span>    .to(<span class="code-quote">"bean:validateOrder"</span>)
    .to(<span class="code-quote">"mock:validate"</span>)
    <span class="code-comment">// turn the route async as some others <span class="code-keyword">do</span> not expect a reply
</span>    <span class="code-comment">// and a few does then we can use the async DSL as a turning point
</span>    <span class="code-comment">// <span class="code-keyword">if</span> the JMS ReplyTo was set then we expect a reply, otherwise not
</span>    <span class="code-comment">// use a pool of 20 threads <span class="code-keyword">for</span> the point forward
</span>    .async(20)
    <span class="code-comment">// <span class="code-keyword">do</span> some CPU heavy processing of the message (we simulate and delay just 100 ms)
</span>    .unmarshal(mySecureDataFormat).delay(100).to(<span class="code-quote">"bean:handleOrder"</span>).to(<span class="code-quote">"mock:order"</span>);</pre>
</div></div>

<h3><a name="Async-SeeAlso"></a>See Also</h3>
<ul class="alternate" type="square">
	<li><a href="/confluence/display/CAMEL/Request+Reply" title="Request Reply">Request Reply</a></li>
	<li><a href="/confluence/display/CAMEL/Event+Message" title="Event Message">Request Only</a></li>
</ul>
</div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message