GAE - Primeiras impressões - Envio de e-mail
03 Oct 2010 Esse post foi baseado em um e-mail que eu enviei para uma lista de e-mail que faço parte, graças a esse e-mail que eu me motivei para criar esse blog, mas só agora depois de vários posts que resolvi publica-lo Meus primeiros instantes com o GAE foram emocionantes, eu estava ali com um PaaS na mão, com o poder de aumentar recursos da minha plataforma com apenas alguns cliques e um cartão de crédito :D Lembrando que ao adicionar recursos na plataforma do GAE, vc adiciona um pagar até... Se você adicionar 10 dólares de CPU hour, não quer dizer que vai pagar 10 dólares, e sim, que pagará até no máximo 10 dólares, somente se o recurso for consumido. Sendo que as quotas são renovadas diariamente. Fantástico, né?! Google Plugin for Eclipse Para os primeiros passos com o GAE, o Google Plugin for Eclipse é altamente recomendado, ele é uma forma rápida e fácil de criar projetos, testar localmente e fazer deploys em produção Meu primeiro projeto Depois de uma serie de projetos de brincadeirinha prova de conceito, Hello World, CRUD Básico etc. Achei um amigo que tinha uma necessidade de enviar Clipping Diário de Notícias, que consistia em um cadastro de de contatos e envio de e-mail diário com um pdf em anexo (upload via BlobStore) Péssima idéia O GAE não é recomendado para sistemas de envio de e-mail em massa devido algumas restrições da plataforma, como quantidade de e-mail por minuto, tamanho de anexo no e-mails etc. Mas só fui descobrir após experimentar Restrição do Sender O GAE tem algumas restrições para o remetente do e-mail, que precisa ser um e-mail de um dos administradores da aplicação ou o usuário corrente logado. Se você tentar enviar um e-mail pelo GAE com um remetente do tipo [email protected], [email protected], [email protected] etc. Esses e-mails deverão ser os mesmos usados pelo usuário corrente logado ou estarem cadastrados como administradores da aplicação. Em nenhuma das situação é comum ter um [email protected], como usuário logado ou admintrador, né?! Descrição do sender na Low-level API para envio de e-mail http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/mail/MailService.Message.html#setSender%28java.lang.String%29Sender must correspond to the valid email address of one of the admins for this application, or to the email address of the currently logged-in user. Sender is really the From: field of the email.Na hora que li isso, pensei: vou usar a API do Java Mail apontando para o meu servidor SMTP, assim tenho total controle sobre o envio de e-mail
Para mandar e-mail pelo GAE você só pode usar o serviço de envio de e-mail do GAE. Isso não impede de enviar e-mail usado outros serviços por outros meios Web Services, REST, requisição http etc, e esses outros meios delegarem para outros serviços de envio de e-mail Lembrando que se cadastrar [email protected] como adminstrador, esse e-mail terá privilégios de acessar a administração do GAE e inclusive adicionar recursos ($$$) na plataforma Restrição de envio de e-mails por minuto Na conta free do GAE, vc tem uma restrição de 1 e-mail (leia-se um destinatário) por minuto, quando vc ativa a versão paga, muda para 5200, tudo aumenta, processamento etc, mas sem custo, o custo só acontece depois que vc excede o que ganhou a mais, só por habilitar a opção paga Acoplamento com GAE É quase inevitável não acoplar seu sistema com o GAE, devido uma serie Not supported APIs do GAE, e a facilidade para usar alguns recursos do GAE usando bibliotecas do Google. Migrar uma aplicação do GAE para outro container ou application server, muito provavelmente será uma tarefa árdua Ambiente de desenvolvimento vs Produção Talvez isso já esteja melhor, mas quando eu testei com Google Plugin for Eclipse, funcionar em desenvolvimento não garante que funcionará em produção. Mais de uma vez, testei em desenvolvimento, estava funcionando, quando eu fazia o deploy em produção não funcionava Datastore Indexes Um coisa bem legal é o Datastore Index que pode ser configurada para ser gerada automaticamente em desenvolvimento. Habilitando a opção datastore-indexes autoGenerate="true" no datastore-indexes.xml [xml] <datastore-indexes autoGenerate="true"> [/xml] Conforme vc for usando suas entidades no seu ambiente de desenvolvimento, ele vai automaticamente criando indexes para suas entidades com base na utilização. Muito bom!An app cannot use the JavaMail interface to connect to other mail services for sending or receiving email messages. SMTP configuration added to the Transport or Session is ignored.
O lado ruim e que as vezes o GAE fica horas para gerar os indexes em produção, e só após a geração desses indexes as entidades ficam disponíveis
BigTable
Com o BigTable estou usando JDO (achei que os tutorias do GAE incentivam mais para usar JDO que JPA). Devido o modelo não relacional do BigTable, perdi um pouco das facilidades do ORM
MailModel tem uma lista ContactModel
Como ContactModel não é filho de MailModel (owned relationship), para fazer esse relacionamento tive que fazer
[java]
List<Long> contactsId;
[/java]
ContactModel é uma unowned, ele tem uma PrimaryKey Long e não uma Key (com.google.appengine.api.datastore.Key). Para mais detalhes http://code.google.com/appengine/docs/java/datastore/dataclasses.html
Portanto no meu Service, após fazer o load de qualquer MailModel, tenho que carregar os ContactModel manualmente com base nos contactsId (tchau lazy load, olá eager load?!)
Conclusões
Apesar de eu talvez ter enfatizado um lado restritivo do GAE, ainda é uma ótima plataforma, claro, com algumas restrições. Tem que levar em consideração o que você quer desenvolver, para um sistema de envio de e-mail não é bom, mas para outras coisas, pode ser
No post GAE + Eclipse + Maven, demonstro como usar o GAE diretamente com Maven que pode ser mais produtivo posteriormente que com somente o Google Plugin for Eclipse
Spring + GAE
Para usar o Spring MVC com o GAE tem algumas restrições de bibliotecas, baixar o archetype do Spring MVC não funcionará diretamente. Criei um projeto http://github.com/phstc/spring-gae no github, com uma aplicação com Maven + Google Plugin for Eclipse + Spring MVC 3 pronta para uso! :D