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 for Camel on Google App Engine
Date Mon, 16 Nov 2009 09:12:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/1519/1/1/_/styles/combined.css?spaceKey=CAMEL&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background-color: white" bgcolor="white">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial+for+Camel+on+Google+App+Engine">Tutorial
for Camel on Google App Engine</a></h2>
    <h4>Page  <b>added</b> by             <a href="http://cwiki.apache.org/confluence/display/~mrt1nz">Martin
Krasser</a>
    </h4>
         <br/>
    <div class="notificationGreySide">
         <h2><a name="TutorialforCamelonGoogleAppEngine-CamelonGoogleAppEngineTutorial"></a>Camel
on Google App Engine Tutorial</h2>

<div class='panelMacro'><table class='infoMacro'><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>Work in progress</b><br
/><p>This tutorial is still work in progress but already provides enough information
to get a non-trivial Camel application running on GAE.</p></td></tr></table></div>

<h3><a name="TutorialforCamelonGoogleAppEngine-Overview"></a>Overview</h3>

<p>Goal of this tutorial is to get a Camel application running on Google App Engine
that can send weather reports to user-defined email accounts. The user enters the name of
a city and the email address of the report receiver into a form and submits it to the tutorial
application. Retrieving weather data for that city and sending the weather report is done
in the background. </p>

<p><span class="error">Unable to render embedded object: File (gae-0.PNG) not
found.</span></p>

<h3><a name="TutorialforCamelonGoogleAppEngine-Download"></a>Download </h3>

<p>The packaged tutorial application can be (temporarily) downloaded from <span class="error">&#91;here|^Tutorial.zip&#93;</span>.
It is an Eclipse project that requires the <a href="http://code.google.com/eclipse/" rel="nofollow">Google
Eclipse Plugin</a> and the <a href="http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.6.zip"
rel="nofollow">App Engine Java SDK 1.2.6</a> for running. A Maven-based version of
the project should be available soon. The following sections describe how to build that application
from scratch. </p>

<h3><a name="TutorialforCamelonGoogleAppEngine-CreateaGAEapplication"></a>Create
a GAE application</h3>

<p>For setting up the Camel-independent parts of a GAE application refer to the <a
href="http://code.google.com/appengine/docs/java/gettingstarted/" rel="nofollow">Java Getting
Started Guide</a> in the GAE documentation. This tutorial uses the <a href="http://code.google.com/eclipse/"
rel="nofollow">Google Plugin for Eclipse</a> and the <a href="http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.6.zip"
rel="nofollow">App Engine Java SDK 1.2.6</a>. After installing the SDK and the plugin,
create a new GAE project via <tt>File-&gt;New-&gt;Web Application Project</tt>.</p>

<p><span class="error">Unable to render embedded object: File (gae-1.PNG) not
found.</span></p>

<p>After pressing <tt>Finish</tt> the new GAE project appears in the package
explorer.</p>

<p><span class="error">Unable to render embedded object: File (gae-2.PNG) not
found.</span></p>

<h3><a name="TutorialforCamelonGoogleAppEngine-Addrequiredlibraries"></a>Add
required libraries</h3>

<p>The created project is not a Maven project so all required dependencies must be added
manually to the <tt>war/WEB_INF/lib</tt> directory. These are</p>

<ul>
	<li>camel-core-2.1-SNAPSHOT.jar</li>
	<li>camel-spring-2.1-SNAPSHOT.jar</li>
	<li>camel-http-2.1-SNAPSHOT.jar</li>
	<li>camel-servlet-2.1-SNAPSHOT.jar</li>
	<li>camel-gae-2.1-SNAPSHOT.jar</li>
	<li><a href="http://repo1.maven.org/maven2/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar"
rel="nofollow">commons-logging-1.1.1.jar</a></li>
	<li><a href="http://repo.open.iona.com/maven2/org/fusesource/commonman/commons-management/1.0/commons-management-1.0.jar"
rel="nofollow">commons-management-1.0.jar</a></li>
	<li><a href="http://repo1.maven.org/maven2/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar"
rel="nofollow">commons-httpclient-3.1.jar</a></li>
	<li><a href="http://repo1.maven.org/maven2/commons-codec/commons-codec/1.4/commons-codec-1.4.jar"
rel="nofollow">commons-codec-1.4.jar</a></li>
	<li><a href="http://repo1.maven.org/maven2/org/springframework/spring-aop/2.5.6/spring-aop-2.5.6.jar"
rel="nofollow">spring-aop-2.5.6</a></li>
	<li><a href="http://repo1.maven.org/maven2/org/springframework/spring-beans/2.5.6/spring-beans-2.5.6.jar"
rel="nofollow">spring-beans-2.5.6</a></li>
	<li><a href="http://repo1.maven.org/maven2/org/springframework/spring-context/2.5.6/spring-context-2.5.6.jar"
rel="nofollow">spring-context-2.5.6</a></li>
	<li><a href="http://repo1.maven.org/maven2/org/springframework/spring-core/2.5.6/spring-core-2.5.6.jar"
rel="nofollow">spring-core-2.5.6</a></li>
</ul>


<p>Then right-click on the <tt>Tutorial</tt> project and add these libraries
to the classpath via <tt>Properties-&gt;Java Build Path-&gt;Libraries-&gt;Add
JARs...</tt>. After adding they should now appear in the <tt>Referenced Libraries</tt>
container.</p>

<p><span class="error">Unable to render embedded object: File (gae-3.PNG) not
found.</span></p>

<h3><a name="TutorialforCamelonGoogleAppEngine-Setupdeploymentdescriptors"></a>Setup
deployment descriptors</h3>

<p>The deployment descriptors <tt>web.xml</tt> and <tt>appengine-web.xml</tt>
are located in the <tt>war/WEB-INF</tt> directory.</p>

<h4><a name="TutorialforCamelonGoogleAppEngine-web.xml"></a>web.xml</h4>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>web.xml</b></div><div class="codeContent
panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span>
encoding=<span class="code-quote">"utf-8"</span>?&gt;</span>
&lt;web-app 
xmlns=<span class="code-quote">"http://java.sun.com/xml/ns/javaee"</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:web</span>=<span class="code-quote">"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</span>
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd<span class="code-quote">" version="</span>2.5"&gt;
    
    <span class="code-tag">&lt;servlet&gt;</span>
        <span class="code-tag">&lt;servlet-name&gt;</span>CamelServlet<span
class="code-tag">&lt;/servlet-name&gt;</span>
        <span class="code-tag">&lt;servlet-class&gt;</span>org.apache.camel.component.servlet.CamelHttpTransportServlet<span
class="code-tag">&lt;/servlet-class&gt;</span>
        <span class="code-tag">&lt;init-param&gt;</span>
            <span class="code-tag">&lt;param-name&gt;</span>contextConfigLocation<span
class="code-tag">&lt;/param-name&gt;</span>
            <span class="code-tag">&lt;param-value&gt;</span>context.xml<span
class="code-tag">&lt;/param-value&gt;</span>
        <span class="code-tag">&lt;/init-param&gt;</span>
    <span class="code-tag">&lt;/servlet&gt;</span>

    <span class="code-tag">&lt;servlet-mapping&gt;</span>
        <span class="code-tag">&lt;servlet-name&gt;</span>CamelServlet<span
class="code-tag">&lt;/servlet-name&gt;</span>
        <span class="code-tag">&lt;url-pattern&gt;</span>/camel/*<span
class="code-tag">&lt;/url-pattern&gt;</span>
    <span class="code-tag">&lt;/servlet-mapping&gt;</span>
    
    <span class="code-tag">&lt;servlet-mapping&gt;</span>
        <span class="code-tag">&lt;servlet-name&gt;</span>CamelServlet<span
class="code-tag">&lt;/servlet-name&gt;</span>
        <span class="code-tag">&lt;url-pattern&gt;</span>/worker/*<span
class="code-tag">&lt;/url-pattern&gt;</span>
    <span class="code-tag">&lt;/servlet-mapping&gt;</span>
    
    <span class="code-tag">&lt;welcome-file-list&gt;</span>
        <span class="code-tag">&lt;welcome-file&gt;</span>index.html<span
class="code-tag">&lt;/welcome-file&gt;</span>
    <span class="code-tag">&lt;/welcome-file-list&gt;</span>
<span class="code-tag">&lt;/web-app&gt;</span>
</pre>
</div></div>

<h4><a name="TutorialforCamelonGoogleAppEngine-appengineweb.xml"></a>appengine-web.xml</h4>

<p>The <tt>&lt;application&gt;</tt> element in <tt>appengine-web.xml</tt>
requires a GAE application name. In the following example, replace the value <tt>replaceme</tt>
with a valid GAE application name.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>appengine-web.xml</b></div><div
class="codeContent panelContent">
<pre class="code-xml">
<span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span>
encoding=<span class="code-quote">"utf-8"</span>?&gt;</span>
<span class="code-tag">&lt;appengine-web-app xmlns=<span class="code-quote">"http://appengine.google.com/ns/1.0"</span>&gt;</span>
    <span class="code-tag">&lt;application&gt;</span>replaceme<span
class="code-tag">&lt;/application&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>1<span class="code-tag">&lt;/version&gt;</span>
	
    <span class="code-tag"><span class="code-comment">&lt;!-- Configure java.util.logging
--&gt;</span></span>
    <span class="code-tag">&lt;system-properties&gt;</span>
        <span class="code-tag">&lt;property name=<span class="code-quote">"java.util.logging.config.file"</span>
value=<span class="code-quote">"WEB-INF/logging.properties"</span>/&gt;</span>
    <span class="code-tag">&lt;/system-properties&gt;</span>
	
<span class="code-tag">&lt;/appengine-web-app&gt;</span></pre>
</div></div>

<h3><a name="TutorialforCamelonGoogleAppEngine-Setuptheform"></a>Setup the
form</h3>

<p>Users provide input data to the application by submitting form data. The following
form definition should be stored in <tt>war/WEB-INF/index.html</tt>.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>index.html</b></div><div class="codeContent
panelContent">
<pre class="code-html">
<span class="code-tag">&lt;!DOCTYPE HTML PUBLIC <span class="code-quote">"-//W3C//DTD
HTML 4.01 Transitional//EN"</span>&gt;</span>
<span class="code-tag">&lt;html&gt;</span>
<span class="code-tag">&lt;head&gt;</span>
<span class="code-tag">&lt;meta http-equiv=<span class="code-quote">"content-type"</span>
content=<span class="code-quote">"text/html; charset=UTF-8"</span>&gt;</span>
<span class="code-tag">&lt;title&gt;</span>Weather Report<span class="code-tag">&lt;/title&gt;</span>
<span class="code-tag">&lt;/head&gt;</span>

<span class="code-tag">&lt;body&gt;</span>
<span class="code-tag">&lt;h1&gt;</span>Weather Report<span class="code-tag">&lt;/h1&gt;</span>
<span class="code-tag">&lt;form action=<span class="code-quote">"camel/weather"</span>
method=<span class="code-quote">"post"</span>&gt;</span>
<span class="code-tag">&lt;table&gt;</span>
    <span class="code-tag">&lt;tr&gt;</span>
        <span class="code-tag">&lt;td&gt;</span>City:<span class="code-tag">&lt;/td&gt;</span>
        <span class="code-tag">&lt;td&gt;</span><span class="code-tag">&lt;input
type=<span class="code-quote">"text"</span> name=<span class="code-quote">"city"</span>&gt;</span><span
class="code-tag">&lt;/td&gt;</span>
    <span class="code-tag">&lt;/tr&gt;</span>
    <span class="code-tag">&lt;tr&gt;</span>
        <span class="code-tag">&lt;td&gt;</span>Mailto:<span class="code-tag">&lt;/td&gt;</span>
        <span class="code-tag">&lt;td&gt;</span><span class="code-tag">&lt;input
type=<span class="code-quote">"text"</span> name=<span class="code-quote">"mailto"</span>&gt;</span><span
class="code-tag">&lt;/td&gt;</span>
    <span class="code-tag">&lt;/tr&gt;</span>
    <span class="code-tag">&lt;tr&gt;</span>
        <span class="code-tag">&lt;td&gt;</span><span class="code-tag">&lt;/td&gt;</span>
        <span class="code-tag">&lt;td align=<span class="code-quote">"right"</span>&gt;</span><span
class="code-tag">&lt;input type=<span class="code-quote">"submit"</span>
value=<span class="code-quote">"Submit"</span> /&gt;</span><span
class="code-tag">&lt;/td&gt;</span>
    <span class="code-tag">&lt;/tr&gt;</span>
<span class="code-tag">&lt;/table&gt;</span>
<span class="code-tag">&lt;/form&gt;</span>
<span class="code-tag">&lt;/body&gt;</span>
<span class="code-tag">&lt;/html&gt;</span>
</pre>
</div></div>

<p>When the user presses the <tt>Submit</tt> button the form data are POSTed
to <tt>http://&lt;appname&gt;.appspot.com/camel/weather</tt>. The input
field values will be available as <tt>in</tt> message headers <tt>city</tt>
and <tt>mailto</tt>.</p>

<h3><a name="TutorialforCamelonGoogleAppEngine-Setuptheroutes"></a>Setup
the routes</h3>

<p>Add the following <tt>TutorialRouteBuilder</tt> class to the <tt>org.apache.camel.example.gae</tt>
package. The previously generated <tt>TutorialServlet</tt> in that package can
be deleted.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>TutorialRouteBuilder.java</b></div><div
class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">package</span> org.apache.camel.example.gae;

<span class="code-keyword">import</span> org.apache.camel.Exchange;
<span class="code-keyword">import</span> org.apache.camel.builder.RouteBuilder;
<span class="code-keyword">import</span> org.apache.camel.component.gae.mail.GMailBinding;

<span class="code-keyword">public</span> class TutorialRouteBuilder <span class="code-keyword">extends</span>
RouteBuilder {

    @Override
    <span class="code-keyword">public</span> void configure() <span class="code-keyword">throws</span>
Exception {
        from(<span class="code-quote">"ghttp:<span class="code-comment">///weather"</span>)
</span>            .to(<span class="code-quote">"gtask:<span class="code-comment">//<span
class="code-keyword">default</span>"</span>)
</span>            .setHeader(Exchange.CONTENT_TYPE, constant(<span class="code-quote">"text/plain"</span>))
            .transform(constant(<span class="code-quote">"Weather report will be sent
to "</span>).append(header(<span class="code-quote">"mailto"</span>)));
      
        from(<span class="code-quote">"gtask:<span class="code-comment">//<span
class="code-keyword">default</span>"</span>)
</span>            .setHeader(Exchange.HTTP_QUERY, constant(<span class="code-quote">"weather="</span>).append(header(<span
class="code-quote">"city"</span>)))
            .to(<span class="code-quote">"ghttp:<span class="code-comment">//www.google.com/ig/api"</span>)
</span>            .process(<span class="code-keyword">new</span> WeatherProcessor())
       
            .setHeader(GMailBinding.GMAIL_SUBJECT, constant(<span class="code-quote">"Weather
report"</span>))
            .setHeader(GMailBinding.GMAIL_TO, header(<span class="code-quote">"mailto"</span>))
            .to(<span class="code-quote">"gmail:<span class="code-comment">//&lt;replaceme&gt;@gmail.com"</span>);
</span>    }

}
</pre>
</div></div>

<p>Form data are received via the <a href="/confluence/display/CAMEL/ghttp" title="ghttp">ghttp</a>
component. After receiving the request it is added to the <tt>default</tt> queue
for background processing. Queueing messages on GAE is done with the <a href="/confluence/display/CAMEL/gtask"
title="gtask">gtask</a> component. After queueing the request a response is generated
for being displayed in the browser. The value of the <tt>mailto</tt> header is
the email address the user entered in the form.</p>

<p>Background processing of the queued messages starts <tt>from("gtask://default")</tt>.
The first step is the construction of the Google weather service URL followed by the weather
service invocation using the <a href="/confluence/display/CAMEL/ghttp" title="ghttp">ghttp</a>
component. For example, if the user entered <tt>London</tt> in the city field
of the form the resulting URL is <tt><a href="http://www.google.com/ig/api?weather=London"
rel="nofollow">http://www.google.com/ig/api?weather=London</a></tt>. The resulting
XML data are processed by the <tt>WeatherProcessor</tt>:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>WeatherProcessor.java</b></div><div
class="codeContent panelContent">
<pre class="code-java">
<span class="code-keyword">package</span> org.apache.camel.example.gae;

<span class="code-keyword">import</span> javax.xml.xpath.XPath;
<span class="code-keyword">import</span> javax.xml.xpath.XPathFactory;

<span class="code-keyword">import</span> org.apache.camel.Exchange;
<span class="code-keyword">import</span> org.apache.camel.Processor;
<span class="code-keyword">import</span> org.w3c.dom.Document;

<span class="code-keyword">public</span> class WeatherProcessor <span class="code-keyword">implements</span>
Processor {

    @Override
    <span class="code-keyword">public</span> void process(Exchange exchange) <span
class="code-keyword">throws</span> Exception {
        <span class="code-comment">// convert XML body to DOM tree
</span>        Document doc = exchange.getIn().getBody(Document.class);

        XPathFactory xpfactory = XPathFactory.newInstance();
        XPath xpath = xpfactory.newXPath();

        <span class="code-comment">// Extract result values via XPath
</span>        <span class="code-object">String</span> city = xpath.evaluate(<span
class="code-quote">"<span class="code-comment">//forecast_information/city/@data"</span>,
doc);
</span>        <span class="code-object">String</span> cond = xpath.evaluate(<span
class="code-quote">"<span class="code-comment">//current_conditions/condition/@data"</span>,
doc);
</span>        <span class="code-object">String</span> temp = xpath.evaluate(<span
class="code-quote">"<span class="code-comment">//current_conditions/temp_c/@data"</span>,
doc);
</span>
        <span class="code-object">String</span> msg = <span class="code-keyword">null</span>;
        <span class="code-keyword">if</span> (city != <span class="code-keyword">null</span>
&amp;&amp; city.length() &gt; 0) {
            msg = <span class="code-keyword">new</span> <span class="code-object">StringBuffer</span>()
                .append(<span class="code-quote">"\n"</span>).append(<span
class="code-quote">"Weather report <span class="code-keyword">for</span>: 
"</span>).append(city)
                .append(<span class="code-quote">"\n"</span>).append(<span
class="code-quote">"Current condition:   "</span>).append(cond)
                .append(<span class="code-quote">"\n"</span>).append(<span
class="code-quote">"Current temperature: "</span>).append(temp).append(<span class="code-quote">"
(Celsius)"</span>).toString();
        } <span class="code-keyword">else</span> {
            <span class="code-comment">// create an error message
</span>            msg = <span class="code-quote">"Error getting weather report
<span class="code-keyword">for</span> "</span> + exchange.getIn().getHeader(<span
class="code-quote">"city"</span>, <span class="code-object">String</span>.class);
        }
        exchange.getIn().setBody(msg);
    }

}
</pre>
</div></div> 

<p>This processor extracts data from the XML result with XPath expressions and creates
a simple text-based report for being sent by email. Add this class to the <tt>org.apache.camel.example.gae</tt>
package. For sending the email the <a href="/confluence/display/CAMEL/gmail" title="gmail">gmail</a>
component is used. The sender is given by the endpoint URI where <tt>&lt;replaceme&gt;</tt>
must be replaced with the username of the admin account of the GAE application (usually the
account to deploy the GAE application). The recipient is derived from the user-defined <tt>mailto</tt>
header.</p>

<div class='panelMacro'><table class='noteMacro'><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><b>Local development server</b><br
/><p>Please note that on the local development server sending emails does not work
and queued tasks must be executed manually from the <a href="http://code.google.com/appengine/docs/java/taskqueue/overview.html#Task_Queues_and_the_Development_Server"
rel="nofollow">developer console</a>.</p></td></tr></table></div>

<h3><a name="TutorialforCamelonGoogleAppEngine-Setuptheapplicationcontext"></a>Setup
the application context</h3>

<p>Add the following application context XML file to the project's <tt>src</tt>
directory (needs to be on the classpath).</p>

<div class="code panel" style="border-width: 1px;"><div class="codeHeader panelHeader"
style="border-bottom-width: 1px;"><b>context.xml</b></div><div class="codeContent
panelContent">
<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>
       xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;
    
    &lt;bean id=<span class="code-quote">"camelContext"</span> 
        class=<span class="code-quote">"org.apache.camel.component.gae.context.GaeSpringCamelContext"</span>&gt;
        <span class="code-tag">&lt;property name=<span class="code-quote">"routeBuilder"</span>
ref=<span class="code-quote">"tutorialRouteBuilder"</span> /&gt;</span>
    <span class="code-tag">&lt;/bean&gt;</span>
    
    &lt;bean id=<span class="code-quote">"tutorialRouteBuilder"</span>
        class=<span class="code-quote">"org.apache.camel.example.gae.TutorialRouteBuilder"</span>&gt;
    <span class="code-tag">&lt;/bean&gt;</span>
    
<span class="code-tag">&lt;/beans&gt;</span>
</pre>
</div></div>

<h3><a name="TutorialforCamelonGoogleAppEngine-Deploytheapplication"></a>Deploy
the application</h3>

<p>To deploy the application right-click on the <tt>Tutorial</tt> project
and select <tt>Google-&gt;Deploy to App Engine</tt>. In the dialog enter the
project name, your email address and password for logging into App Engine and press <tt>Deploy</tt>.</p>

<h3><a name="TutorialforCamelonGoogleAppEngine-Usetheapplication"></a>Use
the application</h3>

<p>Go to <tt>http://&lt;appname&gt;.appspot.com</tt> where <tt>&lt;appname&gt;</tt>
must be replaced with a valid GAE application name. The following form should now appear.</p>

<p><span class="error">Unable to render embedded object: File (gae-5.PNG) not
found.</span></p>

<p>Enter the name of a city and your email address, for example:</p>

<p><span class="error">Unable to render embedded object: File (gae-6.PNG) not
found.</span></p>

<p>Then press <tt>Submit</tt>. Submitting the form the first time will initialize
the application on Google App Engine which can take more than 10 seconds. Subsequent submissions
are served much faster. Check your emails and you should now see a new email with subject
<tt>Wheather report</tt> and content similar to this one:</p>

<div class="preformatted panel" style="border-width: 1px;"><div class="preformattedContent
panelContent">
<pre>Weather report for:  London, England
Current condition:   Klar
Current temperature: 12 (Celsius) 
</pre>
</div></div>

<p>The report is partly internationalized, depending on the language settings of your
browser.</p>
    </div>
    <div id="commentsSection" class="wiki-content pageSection">
       <div style="float: right;">
            <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action"
class="grey">Change Notification Preferences</a>
       </div>
       <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial+for+Camel+on+Google+App+Engine">View
Online</a>
              |
       <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial+for+Camel+on+Google+App+Engine?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
           </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message