camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel: Tutorial-JmsRemoting (page edited)
Date Wed, 11 Jun 2008 18:52: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/Tutorial-JmsRemoting">Tutorial-JmsRemoting</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial-JmsRemoting">Tutorial-JmsRemoting</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus Ibsen</a>
            <span class="smallfont">(Jun 11, 2008)</span>.
     </p>
    <p>
      Change summary:
      <div class="greybox wiki-content"><p>Added CamelEndpoint client sample</p></div>
    </p>
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=82923&originalVersion=13&revisedVersion=14">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><p>&nbsp;<table cellpadding='5' width='85%' cellspacing='8px' class='infoMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Thanks</b><br />
<p>This tutorial was kindly donated to Apache Camel by Martin Gilday.</p></td></tr></table></p>

<h1><a name="Tutorial-JmsRemoting-Preface"></a>Preface</h1>

<p>This tutorial aims to guide the reader through the stages of creating a project which uses Camel to facilitate the routing of messages from a JMS queue to a <span class="nobr"><a href="http://www.springramework.org" title="Visit page outside Confluence" rel="nofollow">Spring<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> service.  The route works in a synchronous fashion returning a response to the client.</p>
<div>
<ul>
  <li><a href='#Tutorial-JmsRemoting-Preface'>Preface</a></li>
  <li><a href='#Tutorial-JmsRemoting-TODOs'>TODOs</a></li>
  <li><a href='#Tutorial-JmsRemoting-Prerequisites'>Prerequisites</a></li>
  <li><a href='#Tutorial-JmsRemoting-Distribution'>Distribution</a></li>
  <li><a href='#Tutorial-JmsRemoting-About'>About</a></li>
  <li><a href='#Tutorial-JmsRemoting-CreatetheCamelProject'>Create the Camel Project</a>
<ul>
  <li><a href='#Tutorial-JmsRemoting-UpdatethePOMwithDependencies'>Update the POM with Dependencies</a></li>
</ul></li>
  <li><a href='#Tutorial-JmsRemoting-WritingtheServer'>Writing the Server</a>
<ul>
  <li><a href='#Tutorial-JmsRemoting-CreatetheSpringService'>Create the Spring Service</a></li>
  <li><a href='#Tutorial-JmsRemoting-DefinetheCamelRoutes'>Define the Camel Routes</a></li>
  <li><a href='#Tutorial-JmsRemoting-ConfigureSpring'>Configure Spring</a></li>
  <li><a href='#Tutorial-JmsRemoting-AOPEnabledServer'>AOP Enabled Server</a></li>
  <li><a href='#Tutorial-JmsRemoting-RuntheServer'>Run the Server</a></li>
</ul></li>
  <li><a href='#Tutorial-JmsRemoting-TheClients'>The Clients</a>
<ul>
  <li><a href='#Tutorial-JmsRemoting-ClientUsingTheProducerTemplate'>Client Using The ProducerTemplate</a></li>
  <li><a href='#Tutorial-JmsRemoting-ClientUsingSpringRemoting'>Client Using Spring Remoting</a></li>
  <li><a href='#Tutorial-JmsRemoting-ClientUsingMessageEndpointEIPPattern'>Client Using Message Endpoint EIP Pattern</a></li>
</ul></li>
  <li><a href='#Tutorial-JmsRemoting-UsingtheCamelMavenPlugin'>Using the Camel Maven Plugin</a></li>
  <li><a href='#Tutorial-JmsRemoting-SeeAlso'>See Also</a></li>
</ul></div>

<h1><a name="Tutorial-JmsRemoting-TODOs"></a>TODOs</h1>

<ul>
	<li>Embellish the tutorial with more detail, explaining at each stage what is happening.</li>
	<li><del>Link to specific sections of Camel documentation when referring to components.</del></li>
	<li><del>Attach completed example project.</del></li>
	<li><del>Explain in more detail what is happening when the JMS component is being defined in camel-server.xml</del></li>
	<li>Show how logging can be introduced to monitor exchange body contents.</li>
	<li>Detail how time-outs can be configured.</li>
	<li><del>Can we make this ActiveMQ embedded so that it does not require the reader to download and start it manually?</del></li>
	<li><del>EIP Patterns used</del></li>
	<li><del>Components used</del></li>
	<li>Advanced bean bindings in routing</li>
	<li>Testing using unit testing</li>
</ul>


<h1><a name="Tutorial-JmsRemoting-Prerequisites"></a>Prerequisites</h1>

<p>This tutorial uses Maven to setup the Camel project and for dependencies for artifacts.</p>

<h1><a name="Tutorial-JmsRemoting-Distribution"></a>Distribution</h1>

<p>This sample is distributed with the Camel distribution as <tt>examples/camel-example-spring-jms</tt>.</p>

<h1><a name="Tutorial-JmsRemoting-About"></a>About</h1>

<p>This tutorial is a simple example that demonstrates more the fact how well Camel is seamless integrated with Spring to leverage the best of both worlds. This sample is client server solution using JMS messaging as the transport. The sample has two flavors of servers and also for clients demonstrating different techniques for easy communication.</p>

<p>The Server is a JMS message broker that routes incoming messages to a business service that does computations on the received message and returns a response.<br/>
The EIP patterns used in this sample are:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Pattern </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Message+Channel" title="Message Channel">Message Channel</a> </td>
<td class='confluenceTd'> We need a channel so the Clients can communicate with the server. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Message" title="Message">Message </a> </td>
<td class='confluenceTd'> The information is exchanged using the Camel Message interface. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Message+Translator" title="Message Translator">Message Translator</a> </td>
<td class='confluenceTd'> This is where Camel shines as the message exchange between the Server and the Clients are text based strings with numbers. However our business service uses int for numbers. So Camel can do the message translation automatically. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Message+Endpoint" title="Message Endpoint">Message Endpoint</a> </td>
<td class='confluenceTd'> It should be easy to send messages to the Server from the the clients. This is archived with Camels powerful Endpoint pattern that even can be more powerful combined with Spring remoting. The tutorial have clients using each kind of technique for this. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Point+to+Point+Channel" title="Point to Point Channel">Point to Point Channel</a> </td>
<td class='confluenceTd'> We using JMS queues so there are only one receive of the message exchange </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Event+Driven+Consumer" title="Event Driven Consumer">Event Driven Consumer</a> </td>
<td class='confluenceTd'> Yes the JMS broker is of course event driven and only reacts when the client sends a message to the server. </td>
</tr>
</tbody></table>
<p>We use the following Camel components:</p>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Component </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/ActiveMQ" title="ActiveMQ">ActiveMQ</a> </td>
<td class='confluenceTd'> We use Apache ActiveMQ as the JMS broker on the Server side </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/Bean" title="Bean">Bean</a> </td>
<td class='confluenceTd'> We use the bean binding to easily route the messages to our business service. This is a very powerful component in Camel. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/File" title="File">File</a> </td>
<td class='confluenceTd'> In the AOP enabled Server we store audit trails as files. </td>
</tr>
<tr>
<td class='confluenceTd'> <a href="/confluence/display/CAMEL/JMS" title="JMS">JMS</a> </td>
<td class='confluenceTd'> Used for the JMS messaging </td>
</tr>
</tbody></table>

<h1><a name="Tutorial-JmsRemoting-CreatetheCamelProject"></a>Create the Camel Project</h1>

<table cellpadding='5' width='85%' cellspacing='8px' class='infoMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>For the purposes of the tutorial a single Maven project will be used for both the client and server. Ideally you would break your application down into the appropriate components.</p></td></tr></table>
<div class="code"><div class="codeContent">
<pre class="code-java">mvn archetype:create -DgroupId=org.example -DartifactId=CamelWithJmsAndSpring</pre>
</div></div>

<h2><a name="Tutorial-JmsRemoting-UpdatethePOMwithDependencies"></a>Update the POM with Dependencies</h2>

<p>First we need to have dependencies for the core Camel jars, its spring, jms components and finally ActiveMQ as the message broker.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- required by both client and server --&gt;</span></span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>camel-core<span class="code-tag">&lt;/artifactId&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>camel-jms<span class="code-tag">&lt;/artifactId&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>camel-spring<span class="code-tag">&lt;/artifactId&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.activemq<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>activemq-core<span class="code-tag">&lt;/artifactId&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>
<p>As we use spring xml configuration for the ActiveMQ JMS broker we need this dependency:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- xbean is required for ActiveMQ broker configuration in the spring xml file --&gt;</span></span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.xbean<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>xbean-spring<span class="code-tag">&lt;/artifactId&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>
<p>And dependencies for the AOP enable server example. These dependencies are of course only needed if you need fullblown AOP stuff using AspejctJ with bytecode instrumentation.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- required jars for aspectj AOP support --&gt;</span></span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.springframework<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>spring-aop<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>2.5.4<span class="code-tag">&lt;/version&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.aspectj<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>aspectjrt<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>1.5.4<span class="code-tag">&lt;/version&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.aspectj<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>aspectjweaver<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>1.5.4<span class="code-tag">&lt;/version&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>cglib<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>cglib-nodep<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>2.1_3<span class="code-tag">&lt;/version&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>

<h1><a name="Tutorial-JmsRemoting-WritingtheServer"></a>Writing the Server</h1>

<h2><a name="Tutorial-JmsRemoting-CreatetheSpringService"></a>Create the Spring Service</h2>

<p>For this example the Spring service (= our business service) on the server will be a simple multiplier which trebles in the received value.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">interface</span> Multiplier {

    /**
     * Multiplies the given number by a pre-defined constant.
     *
     * @param originalNumber The number to be multiplied
     * @<span class="code-keyword">return</span> The result of the multiplication
     */
    <span class="code-object">int</span> multiply(<span class="code-object">int</span> originalNumber);

}</pre>
</div></div>
<p>And the implementation of this service is:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">@Service(value = <span class="code-quote">"multiplier"</span>)
<span class="code-keyword">public</span> class Treble <span class="code-keyword">implements</span> Multiplier {

    <span class="code-keyword">public</span> <span class="code-object">int</span> multiply(<span class="code-keyword">final</span> <span class="code-object">int</span> originalNumber) {
        <span class="code-keyword">return</span> originalNumber * 3;
    }

}</pre>
</div></div>
<p>Notice that this class has been annotated with the @Service spring annotation. This ensures that this class is registered as a bean in the registry with the given name <b>multiplier</b>.</p>

<h2><a name="Tutorial-JmsRemoting-DefinetheCamelRoutes"></a>Define the Camel Routes</h2>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class ServerRoutes <span class="code-keyword">extends</span> RouteBuilder {

    @Override
    <span class="code-keyword">public</span> void configure() <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// route from the numbers queue to our business that is a spring bean registered with the id=multiplier
</span>        <span class="code-comment">// Camel will introspect the multiplier bean and find the best candidate of the method to invoke.
</span>        <span class="code-comment">// You can add annotations etc to help Camel find the method to invoke.
</span>        <span class="code-comment">// As our multiplier bean only have one method its easy <span class="code-keyword">for</span> Camel to find the method to use.
</span>        from(<span class="code-quote">"jms:queue:numbers"</span>).to(<span class="code-quote">"multiplier"</span>);

        <span class="code-comment">// Camel has several ways to configure the same routing, we have defined some of them here below
</span>
        <span class="code-comment">// as above but with the bean: prefix
</span>        <span class="code-comment">//from(<span class="code-quote">"jms:queue:numbers"</span>).to(<span class="code-quote">"bean:multiplier"</span>);
</span>
        <span class="code-comment">// beanRef is using explicity bean bindings to lookup the multiplier bean and invoke the multiply method
</span>        <span class="code-comment">//from(<span class="code-quote">"jms:queue:numbers"</span>).beanRef(<span class="code-quote">"multiplier"</span>, <span class="code-quote">"multiply"</span>);
</span>
        <span class="code-comment">// the same as above but expressed as a URI configuration
</span>        <span class="code-comment">//from(<span class="code-quote">"jms:queue:numbers"</span>).to(<span class="code-quote">"bean:multiplier?methodName=multiply"</span>);
</span>    }

}</pre>
</div></div>
<p>This defines a Camel route <em>from</em> the JMS queue named <b>numbers</b> <em>to</em> the Spring <a href="/confluence/display/CAMEL/Bean" title="Bean">bean</a> named <b>multiplier</b>. Camel will create a consumer to the JMS queue which forwards all received messages onto the the Spring bean, using the method named <b>multiply</b>.</p>

<h2><a name="Tutorial-JmsRemoting-ConfigureSpring"></a>Configure Spring</h2>

<p>The Spring config file is placed under <tt>META-INF/spring</tt> as this is the default location used by the <a href="/confluence/display/CAMEL/Camel+Maven+Plugin" title="Camel Maven Plugin">Camel Maven Plugin</a>, which we will later use to run our server.<br/>
First we need to do the standard scheme declarations in the top. In the camel-server.xml we are using spring beans as the default <b>bean:</b> namespace and springs <b>context:</b>. For configuring ActiveMQ we use <b>broker:</b> and for Camel we of course have <b>:camel</b>.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">&lt;beans xmlns=<span class="code-quote">"http://www.springframework.org/schema/beans"</span>
       <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span>
       <span class="code-keyword">xmlns:context</span>=<span class="code-quote">"http://www.springframework.org/schema/context"</span>
       <span class="code-keyword">xmlns:camel</span>=<span class="code-quote">"http://activemq.apache.org/camel/schema/spring"</span>
       <span class="code-keyword">xmlns:broker</span>=<span class="code-quote">"http://activemq.apache.org/schema/core"</span>
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring-1.3.0.xsd
		http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.1.0.xsd"&gt;</pre>
</div></div>
<p>We use Spring annotations for doing IoC dependencies and its component-scan features comes to the rescue as it scans for spring annotations in the given package name:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- let Spring do its IoC stuff in this package --&gt;</span></span>
<span class="code-tag">&lt;context:component-scan base-package=<span class="code-quote">"org.apache.camel.example.server"</span>/&gt;</span></pre>
</div></div>
<p>Camel will of course not be less than Spring in this regard so it supports a similar feature for scanning of Routes. This is configured as shown below:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">&lt;!-- declare a camel context that scans for classes that is RouteBuilder
     in the package org.apache.camel.example.server --&gt;
<span class="code-tag">&lt;camel:camelContext id=<span class="code-quote">"camel"</span>&gt;</span>
    <span class="code-tag">&lt;camel:package&gt;</span>org.apache.camel.example.server<span class="code-tag">&lt;/camel:package&gt;</span>
<span class="code-tag">&lt;/camel:camelContext&gt;</span></pre>
</div></div>
<p>The ActiveMQ JMS broker is also configured in this xml file. We set it up to listen on TCP port 61616.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- lets configure the ActiveMQ JMS broker server to listen on TCP 61616 --&gt;</span></span>
<span class="code-tag">&lt;broker:broker useJmx=<span class="code-quote">"false"</span> persistent=<span class="code-quote">"false"</span> brokerName=<span class="code-quote">"localhost"</span>&gt;</span>
    <span class="code-tag">&lt;broker:transportConnectors&gt;</span>
        <span class="code-tag">&lt;broker:transportConnector name=<span class="code-quote">"tcp"</span> uri=<span class="code-quote">"tcp://localhost:61616"</span>/&gt;</span>
    <span class="code-tag">&lt;/broker:transportConnectors&gt;</span>
<span class="code-tag">&lt;/broker:broker&gt;</span></pre>
</div></div>
<p>As this examples uses JMS then Camel needs a <a href="/confluence/display/CAMEL/JMS" title="JMS">JMS component</a> that is connected with the ActiveMQ broker. This is configured as shown below:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- lets configure the Camel JMS consumer to use the ActiveMQ broker declared above --&gt;</span></span>
<span class="code-tag">&lt;bean id=<span class="code-quote">"jms"</span> class=<span class="code-quote">"org.apache.camel.component.jms.JmsComponent"</span>&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"connectionFactory"</span>&gt;</span>
        <span class="code-tag">&lt;bean class=<span class="code-quote">"org.apache.activemq.ActiveMQConnectionFactory"</span>&gt;</span>
            <span class="code-tag"><span class="code-comment">&lt;!-- use the vm protocol as the JMS broker is running in the same jvm as Camel --&gt;</span></span>
            <span class="code-tag">&lt;property name=<span class="code-quote">"brokerURL"</span> value=<span class="code-quote">"vm://localhost"</span>/&gt;</span>
        <span class="code-tag">&lt;/bean&gt;</span>
    <span class="code-tag">&lt;/property&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span></pre>
</div></div>
<p><b>Notice:</b> The <a href="/confluence/display/CAMEL/JMS" title="JMS">JMS component</a> is configured in standard Spring beans, but the gem is that the bean id can be referenced from Camel routes - meaning we can do routing using the JMS Component by just using <b>jms:</b> prefix in the route URI. What happens is that Camel will find in the Spring Registry for a bean with the id="jms". Since the bean id can have arbitrary name you could have named it id="jmsbroker" and then referenced to it in the routing as <tt>from="jmsbroker:queue:numbers).to("multiplier");</tt><br/>
We use the vm protocol to connect to the ActiveMQ server as its embedded in this application.</p>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'> component-scan </td>
<td class='confluenceTd'> Defines the package to be scanned for Spring stereotype annotations, in this case, to load the "multiplier" bean </td>
</tr>
<tr>
<td class='confluenceTd'> camel-context </td>
<td class='confluenceTd'> Defines the package to be scanned for Camel routes.  Will find the <tt>ServerRoutes</tt> class and create the routes contained within it </td>
</tr>
<tr>
<td class='confluenceTd'> jms bean </td>
<td class='confluenceTd'> Creates the Camel JMS component </td>
</tr>
</tbody></table>

<h2><a name="Tutorial-JmsRemoting-AOPEnabledServer"></a>AOP Enabled Server</h2>

<p>The example has an enhanced Server example that uses fullblown AspejctJ AOP for doing a audit tracking of invocations of the business service.</p>

<p>We leverage Spring AOP support in the {{camel-server-aop.xml} configuration file. First we must declare the correct XML schema's to use:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">&lt;beans xmlns=<span class="code-quote">"http://www.springframework.org/schema/beans"</span>
       <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span>
       <span class="code-keyword">xmlns:aop</span>=<span class="code-quote">"http://www.springframework.org/schema/aop"</span>
       <span class="code-keyword">xmlns:camel</span>=<span class="code-quote">"http://activemq.apache.org/camel/schema/spring"</span>
       xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
		http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring-1.3.0.xsd"&gt;</pre>
</div></div>
<p>Then we include all the existing configuration from the normal server example:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- import the normal server that is the JMS broker --&gt;</span></span>
<span class="code-tag">&lt;import resource=<span class="code-quote">"camel-server.xml"</span>/&gt;</span></pre>
</div></div>
<p>Then we enable the AspejctJ AOP auto proxy feature of Spring that will scan for classes annotated with the @Aspect annotation:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- turn on AspejctJ AOP to weave all @Aspects beans declared in this spring xml file --&gt;</span></span>
<span class="code-tag">&lt;aop:aspectj-autoproxy/&gt;</span></pre>
</div></div>
<p>Then we define our Audit tracker bean that does the actual audit logging. It's also the class that is annotated with the @Aspect so Spring will pick this up, as the aspect.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- Aspect that tracks all the invocations of the business service --&gt;</span></span>
<span class="code-tag">&lt;bean id=<span class="code-quote">"AuditTracker"</span> class=<span class="code-quote">"org.apache.camel.example.server.AuditTracker"</span>&gt;</span>
    <span class="code-tag"><span class="code-comment">&lt;!-- define what store to use for audit backup --&gt;</span></span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"store"</span> ref=<span class="code-quote">"AuditStore"</span>/&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span></pre>
</div></div>
<p>And the gem is that we inject the AuditTracker aspect bean with a <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Camel endpoint</a> that defines where the audit should be stored. Noticed how easy it is to setup as we have just defined an endpoint URI that is <a href="/confluence/display/CAMEL/File" title="File">file based</a>, meaning that we stored the audit tracks as files. We can change this tore to any <a href="/confluence/display/CAMEL/Components" title="Components">Camel components</a> as we wish. To store it on a JMS queue simply change the URI to <b>jms:queue:audit</b>.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- the audit store endpoint is configued as file based --&gt;</span></span>
<span class="code-tag">&lt;camel:endpoint id=<span class="code-quote">"AuditStore"</span> uri=<span class="code-quote">"file://target/store?append=false"</span>/&gt;</span></pre>
</div></div>
<p>And the full blown Aspejct for the audit tracker java code:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
 * For audit tracking of all incoming invocations of our business (Multiplier)
 */
@Aspect
<span class="code-keyword">public</span> class AuditTracker {

    <span class="code-comment">// endpoint we use <span class="code-keyword">for</span> backup store of audit tracks
</span>    <span class="code-keyword">private</span> Endpoint store;

    @Required
    <span class="code-keyword">public</span> void setStore(Endpoint store) {
        <span class="code-keyword">this</span>.store = store;
    }

    @Before(<span class="code-quote">"execution(* org.apache.camel.example.server.Multiplier.*(..)) &amp;&amp; args(originalNumber)"</span>)
    <span class="code-keyword">public</span> void audit(<span class="code-object">int</span> originalNumber) <span class="code-keyword">throws</span> Exception {
        <span class="code-object">String</span> msg = <span class="code-quote">"Someone called us with <span class="code-keyword">this</span> number "</span> + originalNumber;
        <span class="code-object">System</span>.out.println(msg);

        <span class="code-comment">// now send the message to the backup store using the Camel Message Endpoint pattern
</span>        Exchange exchange = store.createExchange();
        exchange.getIn().setBody(msg);
        store.createProducer().process(exchange);
    }
    
}</pre>
</div></div>

<h2><a name="Tutorial-JmsRemoting-RuntheServer"></a>Run the Server</h2>

<p>The Server is started using the <tt>org.apache.camel.spring.Main</tt> class that can start camel-spring application out-of-the-box. The Server can be started in several flavors:</p>
<ul class="alternate" type="square">
	<li>as a standard java main application - just start the <tt>org.apache.camel.spring.Main</tt> class</li>
	<li>using maven jave:exec</li>
	<li>using <a href="/confluence/display/CAMEL/Camel+Run+Maven+Goal" title="Camel Run Maven Goal">camel:run</a></li>
</ul>


<p>In this sample as there are two servers (with and without AOP) we have prepared some profiles in maven to start the Server of your choice.<br/>
The server is started with:<br/>
<tt>mvn compile exec:java &#45;PCamelServer</tt></p>

<p>Or for the AOP enabled Server example:<br/>
<tt>mvn compile exec:java &#45;PCamelServerAOP</tt></p>

<h1><a name="Tutorial-JmsRemoting-TheClients"></a>The Clients</h1>
<p>This sample has three clients demonstrating different Camel techniques for communication</p>
<ul class="alternate" type="square">
	<li>CamelClient using the ProducerTemplate for Spring template style coding</li>
	<li>CamelRemoting using Spring Remoting</li>
	<li>CamelEndpoint using the Message Endpoint EIP pattern using a neutral Camel API</li>
</ul>


<h2><a name="Tutorial-JmsRemoting-ClientUsingTheProducerTemplate"></a>Client Using The ProducerTemplate</h2>

<p>We will initially create a client by directly using <tt>ProducerTemplate</tt>.  We will later create a client which uses Spring remoting to hide the fact that messaging is being used.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">&lt;beans xmlns=<span class="code-quote">"http://www.springframework.org/schema/beans"</span>
       <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span>
       <span class="code-keyword">xmlns:camel</span>=<span class="code-quote">"http://activemq.apache.org/camel/schema/spring"</span>
       xsi:schemaLocation="
	    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring-1.3.0.xsd"&gt;</pre>
</div></div>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;camel:camelContext id=<span class="code-quote">"camel"</span>/&gt;</span>
<span class="code-tag">&lt;camel:template id=<span class="code-quote">"camelTemplate"</span>/&gt;</span></pre>
</div></div>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- Camel JMSProducer to be able to send messages to a remote Active MQ server --&gt;</span></span>
<span class="code-tag">&lt;bean id=<span class="code-quote">"jms"</span> class=<span class="code-quote">"org.apache.camel.component.jms.JmsComponent"</span>&gt;</span>
    <span class="code-tag">&lt;property name=<span class="code-quote">"connectionFactory"</span>&gt;</span>
        <span class="code-tag">&lt;bean class=<span class="code-quote">"org.apache.activemq.ActiveMQConnectionFactory"</span>&gt;</span>
            <span class="code-tag">&lt;property name=<span class="code-quote">"brokerURL"</span> value=<span class="code-quote">"tcp://localhost:61616"</span>/&gt;</span>
        <span class="code-tag">&lt;/bean&gt;</span>
    <span class="code-tag">&lt;/property&gt;</span>
<span class="code-tag">&lt;/bean&gt;</span></pre>
</div></div>
<p>The client will not use the <a href="/confluence/display/CAMEL/Camel+Maven+Plugin" title="Camel Maven Plugin">Camel Maven Plugin</a> so the Spring XML has been placed in <em>src/main/resources</em> to not conflict with the server configs.</p>
<table class='confluenceTable'><tbody>
<tr>
<td class='confluenceTd'> camelContext </td>
<td class='confluenceTd'> The Camel context is defined but does not contain any routes </td>
</tr>
<tr>
<td class='confluenceTd'> template </td>
<td class='confluenceTd'> The <tt>ProducerTemplate</tt> is used to place messages onto the JMS queue </td>
</tr>
<tr>
<td class='confluenceTd'> jms bean </td>
<td class='confluenceTd'> This initialises the Camel JMS component, allowing us to place messages onto the queue </td>
</tr>
</tbody></table>
<p>And the CamelClient source code:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">static</span> void main(<span class="code-keyword">final</span> <span class="code-object">String</span>[] args) <span class="code-keyword">throws</span> Exception {
    <span class="code-object">System</span>.out.println(<span class="code-quote">"Notice <span class="code-keyword">this</span> client requires that the CamelServer is already running!"</span>);

    ApplicationContext context = <span class="code-keyword">new</span> ClassPathXmlApplicationContext(<span class="code-quote">"camel-client.xml"</span>);

    <span class="code-comment">// get the camel template <span class="code-keyword">for</span> Spring template style sending of messages (= producer)
</span>    ProducerTemplate camelTemplate = (ProducerTemplate) context.getBean(<span class="code-quote">"camelTemplate"</span>);

    <span class="code-object">System</span>.out.println(<span class="code-quote">"Invoking the multiply with 22"</span>);
    <span class="code-comment">// as opposed to the CamelClientRemoting example we need to define the service URI in <span class="code-keyword">this</span> java code 
</span>    <span class="code-object">int</span> response = (<span class="code-object">Integer</span>)camelTemplate.sendBody(<span class="code-quote">"jms:queue:numbers"</span>, ExchangePattern.InOut, 22);
    <span class="code-object">System</span>.out.println(<span class="code-quote">"... the result is: "</span> + response);

    <span class="code-object">System</span>.exit(0);
}</pre>
</div></div>
<p>The <tt>ProducerTemplate</tt> is retrieved from a Spring <tt>ApplicationContext</tt> and used to manually place a message on the "numbers" JMS queue. The exchange pattern (<b>ExchangePattern.InOut</b>) states that the call should be synchronous, and that we will receive a response.</p>

<p>Before running the client be sure that both the ActiveMQ broker and the <tt>CamelServer</tt> are running.</p>

<h2><a name="Tutorial-JmsRemoting-ClientUsingSpringRemoting"></a>Client Using Spring Remoting</h2>

<p><a href="/confluence/display/CAMEL/Spring+Remoting" title="Spring Remoting">Spring Remoting</a> "eases the development of remote-enabled services". It does this by allowing you to invoke remote services through your regular Java interface, masking that a remote service is being called.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- Camel proxy for a given service, in this case the JMS queue --&gt;</span></span>
&lt;camel:proxy
    id=<span class="code-quote">"multiplierProxy"</span>
    serviceInterface=<span class="code-quote">"org.apache.camel.example.server.Multiplier"</span>
    serviceUrl=<span class="code-quote">"jms:queue:numbers"</span>/&gt;</pre>
</div></div>
<p>The snippet above only illustrates the different and how Camel easily can setup and use Spring Remoting in one line configurations.</p>

<p>The <b>proxy</b> will create a proxy service bean for you to use to make the remote invocations. The <b>serviceInterface</b> property details which Java interface is to be implemented by the proxy. <b>serviceUrl</b> defines where messages sent to this proxy bean will be directed. Here we define the JMS endpoint with the "numbers" queue we used when working with Camel template directly. The value of the <b>id</b> property is the name that will be the given to the bean when it is exposed through the Spring <tt>ApplicationContext</tt>. We will use this name to retrieve the service in our client. I have named the bean <em>multiplierProxy</em> simply to highlight that it is not the same multiplier bean as is being used by <tt>CamelServer</tt>. They are in completely independent contexts and have no knowledge of each other. As you are trying to mask the fact that remoting is being used in a real application you would generally not include proxy in the name.</p>

<p>And the Java client source code:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">static</span> void main(<span class="code-keyword">final</span> <span class="code-object">String</span>[] args) {
    <span class="code-object">System</span>.out.println(<span class="code-quote">"Notice <span class="code-keyword">this</span> client requires that the CamelServer is already running!"</span>);

    ApplicationContext context = <span class="code-keyword">new</span> ClassPathXmlApplicationContext(<span class="code-quote">"camel-client-remoting.xml"</span>);
    <span class="code-comment">// just get the proxy to the service and we as the client can use the <span class="code-quote">"proxy"</span> as it was
</span>    <span class="code-comment">// a local object we are invocing. Camel will under the covers <span class="code-keyword">do</span> the remote communication
</span>    <span class="code-comment">// to the remote ActiveMQ server and fetch the response.
</span>    Multiplier multiplier = (Multiplier)context.getBean(<span class="code-quote">"multiplierProxy"</span>);

    <span class="code-object">System</span>.out.println(<span class="code-quote">"Invoking the multiply with 33"</span>);
    <span class="code-object">int</span> response = multiplier.multiply(33);
    <span class="code-object">System</span>.out.println(<span class="code-quote">"... the result is: "</span> + response);

    <span class="code-object">System</span>.exit(0);
}</pre>
</div></div>
<p>Again, the client is similar to the original client, but with some important differences.</p>
<ol>
	<li>The Spring context is created with the new <em>camel-client-remoting.xml</em></li>
	<li>We retrieve the proxy bean instead of a <tt>ProducerTemplate</tt>. In a non-trivial example you would have the bean injected as in the standard Spring manner.</li>
	<li>The multiply method is then called directly. In the client we are now working to an interface. There is no mention of Camel or JMS inside our Java code.</li>
</ol>


<h2><a name="Tutorial-JmsRemoting-ClientUsingMessageEndpointEIPPattern"></a>Client Using Message Endpoint EIP Pattern</h2>

<p>This client uses the Message Endpoint EIP pattern to hide the complexity to communicate to the Server. The Client uses the same simple API to get hold of the endpoint, create an exchange that holds the message, set the payload and create a producer that does the send and receive. All done using the same neutral Camel API for <b>all</b> the components in Camel. So if the communication was socket TCP based you just get hold of a different endpoint and all the java code stays the same. That is really powerful.</p>

<p>Okay enough talk, show me the code!</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> <span class="code-keyword">static</span> void main(<span class="code-keyword">final</span> <span class="code-object">String</span>[] args) <span class="code-keyword">throws</span> Exception {
    <span class="code-object">System</span>.out.println(<span class="code-quote">"Notice <span class="code-keyword">this</span> client requires that the CamelServer is already running!"</span>);

    ApplicationContext context = <span class="code-keyword">new</span> ClassPathXmlApplicationContext(<span class="code-quote">"camel-client.xml"</span>);
    CamelContext camel = (CamelContext) context.getBean(<span class="code-quote">"camel"</span>);

    <span class="code-comment">// get the endpoint from the camel context
</span>    Endpoint endpoint = camel.getEndpoint(<span class="code-quote">"jms:queue:numbers"</span>);

    <span class="code-comment">// create the exchange used <span class="code-keyword">for</span> the communication
</span>    <span class="code-comment">// we use the in out pattern <span class="code-keyword">for</span> a <span class="code-keyword">synchronized</span> exchange where we expect a response
</span>    Exchange exchange = endpoint.createExchange(ExchangePattern.InOut);
    <span class="code-comment">// set the input on the in body
</span>    exchange.getIn().setBody(<span class="code-quote">"11"</span>);

    <span class="code-comment">// to send the exchange we need an producer to <span class="code-keyword">do</span> it <span class="code-keyword">for</span> us
</span>    Producer producer = endpoint.createProducer();
    <span class="code-comment">// start the producer so it can operate
</span>    producer.start();

    <span class="code-comment">// let the producer process the exchange where it does all the work in <span class="code-keyword">this</span> oneline of code
</span>    <span class="code-object">System</span>.out.println(<span class="code-quote">"Invoking the multiply with 11"</span>);
    producer.process(exchange);

    <span class="code-comment">// get the response from the out body and <span class="code-keyword">cast</span> it to an integer
</span>    <span class="code-object">int</span> response = exchange.getOut().getBody(<span class="code-object">Integer</span>.class);
    <span class="code-object">System</span>.out.println(<span class="code-quote">"... the result is: "</span> + response);

    <span class="code-comment">// stop and exit the client
</span>    producer.stop();
    <span class="code-object">System</span>.exit(0);
}</pre>
</div></div>

<p>Switching to a different component is just a matter of using the correct endpoint. So if we had defined a TCP endpoint as: <tt>"mina:tcp://localhost:61616"</tt> then its just a matter of getting hold of this endpoint instead of the JMS and all the rest of the java code is exactly the same.</p>

<h1><a name="Tutorial-JmsRemoting-UsingtheCamelMavenPlugin"></a>Using the Camel Maven Plugin</h1>

<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>Require an explanation here about the deployment options of Camel based projects (e.g. running through Maven, creating a host application, deploying into ActiveMQ) and the pros/cons of each.</p></td></tr></table>
<p>The <a href="/confluence/display/CAMEL/Camel+Maven+Plugin" title="Camel Maven Plugin">Camel Maven Plugin</a> allows you to run your Camel routes directly from Maven. This negates the need to create a host application, as we did with Camel server, simply to start up the container. This can be very useful during development to get Camel routes running quickly.</p>
<div class="code"><div class="codeHeader"><b>pom.xml</b></div><div class="codeContent">
<pre class="code-java">&lt;build&gt;
  &lt;plugins&gt;
    &lt;plugin&gt;
      &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
      &lt;artifactId&gt;camel-maven-plugin&lt;/artifactId&gt;
    &lt;/plugin&gt;
  &lt;/plugins&gt;
&lt;/build&gt;</pre>
</div></div>
<p>All that is required is a new plugin definition in your Maven POM. As we have already placed our Camel config in the default location (camel-server.xml has been placed in META-INF/spring/) we do not need to tell the plugin where the route definitions are located. Simply run <tt>mvn camel:run</tt>.</p>

<h1><a name="Tutorial-JmsRemoting-SeeAlso"></a>See Also</h1>

<ul>
	<li><span class="nobr"><a href="http://aminsblog.wordpress.com/2008/05/06/15/" title="Visit page outside Confluence" rel="nofollow">Spring Remoting with JMS Example<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> on <span class="nobr"><a href="http://aminsblog.wordpress.com/" title="Visit page outside Confluence" rel="nofollow">Amin Abbaspour's Weblog<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></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