--- title: Google App Engine Integration order: 7 layout: page --- [[advanced.gae]] = Google App Engine Integration __This section is not yet fully updated to Vaadin 7.__ Vaadin includes support to run Vaadin applications in the Google App Engine (GAE). The most essential requirement for GAE is the ability to serialize the application state. Vaadin applications are serializable through the [classname]#java.io.Serializable# interface. To run as a GAE application, an application must use [classname]#GAEVaadinServlet# instead of [classname]#VaadinServlet#, and of course implement the [classname]#java.io.Serializable# interface for all persistent classes. You also need to enable session support in [filename]#appengine-web.xml# with: [source, xml] ---- true ---- The Vaadin Project wizard can create the configuration files needed for GAE deployment. See <>. When the Google App Engine deployment configuration is selected, the wizard will create the project structure following the GAE Servlet convention instead of the regular Servlet convention. The main differences are: * Source directory: [filename]#src/main/java# * Output directory: [filename]#war/WEB-INF/classes# * Content directory: [filename]#war# == Rules and Limitations Running Vaadin applications in Google App Engine has the following rules and limitations: * Avoid using the session for storage, usual App Engine limitations apply (no synchronization, that is, it is unreliable). * Vaadin uses memcache for mutex, the key is of the form [parameter]#_vmutex<sessionid>#. * The Vaadin [classname]#WebApplicationContext# class is serialized separately into memcache and datastore; the memcache key is [parameter]#_vac<sessionid># and the datastore entity kind is [parameter]#_vac# with identifiers of the type [parameter]#_vac<sessionid>#. * __Do not__ update the application state when serving an [classname]#ConnectorResource# (such as [classname]#ClassResource#. [methodname]#getStream()#). * __Avoid__ (or be very careful when) updating application state in a [classname]#TransactionListener# - it is called even when the application is not locked and won't be serialized (such as with [classname]#ConnectorResource#), and changes can therefore be lost (it should be safe to update things that can be safely discarded later, that is, valid only for the current request). * The application remains locked during uploads - a progress bar is not possible.