JSR-311: Java API for RESTful Web Services

janeiro 31, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

Eu estou atualmente implementando alguns web services Restful, e estou avaliando opções para alguns pedaços do desenvolvimento. Eu já sabia que existia uma JSR para web services REST, mas ainda não tinha lido a mesma.Agora há pouco li a JSR-311, que definirá padrões de implementação Java para uma API Rest, do lado do servidor. A parte de implementação de clientes será tratada em outra(s) JSR(s) .

Esta JSR é bastante interessante, e já pude ver nela o tratamento de coisas muito úteis. De principal destaque para mim está a abordagem de mapeamento de URIs em recursos e métodos e a questão do mapeamento de classes Java para dados com diversos content-types.

Em relação às URIs, há a definição de regras para mapear URIs em classes e métodos, instanciando as classes necessárias e invocando os métodos adequados. Suponha por exemplo uma requisicao HTTP PUT na URI /usuario/16728/produto/228/configuracao/. Em um protocolo definido por mim, isto representaria uma atualização nas configurações do Produto 228 para o Usuário 16728. Um ser humano consegue entender isso sem tantos problemas, mas uma implementação manual destes mapeamentos e o parsing dos parâmetros podem ser coisas bem trabalhosas. A JSR 311 utiliza várias annotations para conseguir definir o encadeamento de classes e métodos a partir da URI utilizada, e isto faz com que você consiga desenvolver em Java normalmente e ter as suas classes instanciadas e invocadas com URIs tão flexíveis quanto você queira. Muito bom ter isso como recurso, pois implementar na mão é bem trabalhoso.

Outra coisa muito interessante é a maneira de mapear classes Java para diversos content-types. Isso é algo fundamental para uma implementação Restful com bastante flexibilidade E possivelmente alta performance. A idéia por trás disso é que o servidor recebe uma requisição de um cliente e verifica quais são os content-types que o cliente aceita. Com base nestas informações, o servidor escolhe a forma que irá utilizar para transmitir os dados.

Suponha por exemplo que uma aplicação PHP está se comunicando com seu servidor, e ele lhe informa que aceita os content-types text/plain, text/xml e application/json. O servidor pode escolher qual formato utilizar para o envio e possivelmente o envio com formato json facilita bastante a aplicação PHP. Este mesmo servidor pode receber requisições de uma outra aplicação Java, que preferencialmente receberá do seu servidor um stream binário, que terá a melhor performance de todas as opções.

O uso desta abordagem dos mapeamentos em content-types permite que sua aplicação tenha ao mesmo tempo alta interoperabilidade e alta performance. Você conseguirá se comunicar com várias plataformas e aplicações diferentes, e continuará tendo a opção de alta performance, caso seja uma aplicação da mesma plataforma. Você não consegue isso com web services WS-*. Eles não têm tamanha flexibilidade.

O meu próximo passo agora será analisar com detalhes o Jersey, a implementação de referência desta JSR. A especificação em si ainda está um tanto crua, pois ainda é um early draft. Já pude ver vários pontos interessantes, mas a definição ainda está sujeita a muitas modificações. Vou avaliar agora o que o Jersey já oferece e torcer para que ele já tenha componentes fáceis de usar e flexíveis. A proposta dele é excelente, vamos ver se a implementação consegue oferecer estes recursos sem amarrar muito as decisões de projeto.

Anúncios

Atom feeds for enterprise application messaging

janeiro 27, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

In the last months I have studied and worked a lot with web services in general, and more specifically the RESTful ones. I believe we are going through a fast maturation process in this area, and RESTful web services are becoming the preferred choice for many new implementations. Right in the thick of things in this field is the Atom Publishing Protocol. This is the blueprint solution for RESTful web services, and its adoption is growing fast, reaching much broader scope than just blog applications using the Atom Format.The Atom format and AtomPub protocol can both be used for many interesting purposes. This year I’m working on a big refactoring (actually a new implementation) of a widely used Globo.com application. This application (let’s call it Register) is responsible for the creation of new users and provisioning new services to them, among other features.

A nice concept present in the original development is the use of Application Connectors. Through these connectors, other applications get notified of events that happened in the Register application. An example is: when a new subscriber (a paying user) is created, a connector sends the notification to another application in order to create the subscriber’s mailbox in the company’s external mail provider. Another example is: when a user gets provisioned in the blogging service, another connector sends a notification to the blogger application, that does what it needs in order to create the user’s directory and quota on the file server.

Although i like this concept, it currently has some problems. This connector’s invocation is done explicitly by the Register application. The Register application knows that a new subscriber must receive a new mailbox, and it needs to call a given connector to do this. This is my biggest concern with the current implementation. I strongly believe that an application that creates users must not know anything about mailboxes. In the current structure, when a new application ABC must be notified of events in application XYZ, application XYZ must be modified to invoke a new connector. This doesn’t please me at all. Let me explain a solution that pleases me more 😉

To explain my idea, I’ll propose some examples involving Google and its services. As we all know, Google offers several different services, all of which can be accessed using the same Google account. When you register at Google, you receive a mail account. Let’s suppose that Google Register application sends a new entry to an Atom feed every time a new user is created. This way, every user creation is present on the Atom Feed. If an application (for example Google Mail) needs to be notified of the creation of new users, it just needs to subscribe to the Register’s Atom feed.

Let me propose a richer example now. Let’s say Google starts to offer some super cool software development services. If you’re a developer, you can ask them to give you a “development account”. This development account would give you access to a Subversion repository, a Bugzilla project and a MySql database. Each of these would be an independent service offered by them, subject to change at any given time. The activation of “development accounts” could also populate an Atom feed.

This way the Subversion, Bugzilla and MySql services could be subscribers of the feed, doing everything they need when a new development account is activated, in asynchronous manner. The application that activates the development account has no knowledge of any other services. If Google wants to offer new services such as a Maven repository or a Continuous Integration environment, no problem. The new services would just subscribe to the Atom feed and do whatever they need when a new account is activated.

If Google wants to offer a free development account and a non-free account with better features, there could be another Atom feed for the activation of the paying accounts or maybe updates to the same existing feed. The Register application would know only about registrations, and other components could be easily plugged and unplugged from this process, without modifications on the Register application. Ah, and worth mentioning… totally decoupled from any specific platform. I don’t know how to implement any kind of messaging more decoupled than that.

This is much much better than the way our Register application sends notifications currently. And I’ll be pretty happy once we manage to do this, it’ll be so cool!

By the way, these Google’s software development services would be awesome. My friend Bairos kindly provides me Subversion and Trac services, but he doesn’t have Google’s bandwidth 🙂 Let’s hope Google gets to know about this and starts offering these services. It’d be amazing!


Conexão JDBC ao SQL Server 2000

janeiro 26, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

Como falei anteriormente, estou usando o SQL Server 2000 para um projetinho freela. Para me conectar ao SQL Server, baixei o driver jdbc jtds, pois li que ele funciona melhor que o driver jdbc fornecido pela Microsoft. Isto não me surpreende muito, pois a Microsoft não deve ter muito interesse em alavancar o uso de Java com o SQL Server, preferindo sempre empurrar o uso de .NET.Pois bem, eu estava tendo problemas para me conectar ao SQL Server via jdbc. Inicialmente o problema parecia ser da forma de autenticação, pois o servidor foi instalado com as opções default e as configurações padrão especificavam autenticação pelo Windows somente, sem autenticação pelo SQL Server. Eu encontrei na internet várias referências dizendo que os drivers jdbc para o SQL Server 2000 não suportam autenticação pelo Windows, então habilitei também a autenticação pelo banco de dados.

Após habilitar a autenticação pelo banco de dados, eu continuava sem conseguir conectar. Os problemas eram sempre os mesmos, e a mensagem de erro era essa aqui: “An error occurred while establishing the connection: Type: java.sql.SQLException Error Code: 0 SQL State: 08S01
Message: Network error IOException: Connection refused: connect”
. Procurando por esse erro, encontrei algumas referências sugerindo conferir se o servidor estava configurado para permitir acesso por TCP/IP, e no meu caso estava sim.

Como eu não estava conseguindo conectar de forma alguma usando TCP/IP, tentei conectar através de named pipes, e funcionou. Minha URL de conexão com o uso de named pipes ficou da seguinte forma: jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=sistema_cms;namedPipe=true

Ah, um detalhe importante. Ao tentar usar essa URL com localhost em vez de 127.0.0.1 , eu recebia um erro dizendo que o nome da máquina não era encontrado na rede. Colocando o hostname correto da máquina (no meu caso, blpsilva-vostro) funcionou sem problemas também. Possivelmente esta solução que utilizei não é a melhor possível para situações mais críticas. Entretanto, para o meu caso esta solução excede bastante o “good enough”, então fiquei com ela mesmo.

OBS: Esse template do WordPress tem o péssimo hábito de eventualmente cortar algumas frases que não caibam na largura da área central . Para não prejudicar a leitura aqui, segue abaixo novamente o nome do último parâmetro da URL jdbc:

namedPipe=true


Equivalentes aos comandos ps e kill no Windows

janeiro 26, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

Hoje de manhã eu estava trabalhando num projeto freela aqui em casa, infelizmente no Windows porque preciso usar o SQL Server.Meu amigo que está trabalhando comigo nesse projeto está com o Windows meio virótico, e o Task Manager dele não está exibindo a lista de processos, mostra apenas a lista de programas. Ele estava tentando matar uma aplicação travada na máquina dele, mas sem ver a lista de processos no Task Manager ele não estava conseguindo. Via apenas o nome da aplicação e o status “Não está respondendo”.

Para poder ajudá-lo, descobri como listar e matar processos no console no Windows, o que eu nunca tinha feito antes.
No Linux estamos acostumados a chamar ps <opcoes> e então kill ou kill -9 <numero_processo>. Os equivalentes disso no Windows são: qprocess (lista os processos) e tskill <numero_processo>.
Pronto, caso uma aplicação trave no Windows e seu Task Manager fique bichado como o dele, vc já tem a dica alternativa 😉


…e conhecer Português também!

janeiro 23, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

Claro que para trabalhar com software é fundamental saber se comunicar em Inglês. Mas para trabalhar com qualquer coisa no Brasil é bom você falar Português corretamente também!Desde a época da faculdade eu me surpreendo com a quantidade de pessoas bastante qualificadas e inteligentes que são ruins em Português. Talvez eu esteja dando importância excessiva para isso, mas acho que não. Pode ser que boa parte das pessoas com as quais você trabalhe não ligue muito para isso, mas te garanto que muitas pessoas terão uma certa imagem negativa ao vê-lo cometer erros grosseiros de Português. Ah, e por favor.. falar Tupi é pior ainda! (“Mim fazer alguma coisa”)

Um exemplo interessante que acontecia comigo é que no meio da faculdade eu já sabia que não queria trabalhar com eletrônica, mas eu tive que cursar Eletrônica 1, 2, 3 e 4. Era muito chato fazer os trabalhos preparatórios e os relatórios das aulas práticas. Como quase ninguém gostava de fazer esses trabalhos, muitas vezes a gente revezava quem ia fazer o trabalho original e os outros iriam modificando e customizando as suas cópias do trabalho :). O interessante é que dependendo de quem estivesse fazendo o relatório (eu tenho alguns amigos que são muito inteligentes, mas escrevem mal), meu único trabalho era corrigir o Português e entregar. E o melhor, com certeza se o professor pegasse 2 relatórios e achasse que um era cópia do outro, provavelmente ele pensaria que o original era o bem escrito, então eu não teria problemas 😉

Brincadeiras à parte, você não precisa ser o professor Pasquale, mas tente ser cuidadoso ao se comunicar de forma escrita. Uma possibilidade é pedir para outra pessoa revisar rapidamente o que você está escrevendo. Observar a escrita de pessoas que escrevem bem também ajuda bastante. Aliás, isso mais uma vez reforça o ponto levantado pelo Guilherme, da importância da leitura.

De uma maneira geral, quem lê muitos livros também escreve bem. Como o processo de publicação de livros é bastante criterioso, dificilmente você lerá um livro com português ruim. O hábito de ler bastante refinará os seus conhecimentos da língua e melhorará também o seu vocabulário.

Se você é um bom profissional, com certeza não vai querer prejudicar a sua imagem por escrever mal. Tente ler mais e aos poucos ir melhorando sua forma de escrever, isso só te trará benefícios. E claro, se quiser expandir seus hábitos de leitura, eu estarei por aqui escrevendo com freqüência para te oferecer conteúdo! 🙂


Conhecer bem inglês é muito importante…

janeiro 23, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

Num post do Guilherme sobre livros, ele mencionou algo que eu repito com freqüência, então resolvi aproveitar o gancho deixado por ele :)Para quem quer trabalhar com software, é fundamental conhecer bem inglês. Se você não for capaz pelo menos de ler razoavelmente em inglês, você estará se privando de praticamente toda a documentação de qualidade da área. Sem dúvida temos traduções para português de muitos livros bons, porém muitos ficam sem tradução. Além disso, você terá que esperar no mínimo vários meses após o lançamento original até que saia a versão traduzida.

Vale dizer que os livros são a parte mais fácil da história, pois alguns ainda são traduzidos. Temos visto em nossa área as coisas acontecerem de uma forma muito mais dinâmica à medida que o tempo passa, e muitos assuntos só possuem referências na internet, e raramente você encontra versão em português para alguma coisa. Eu tenho aprendido muito sobre alguns assuntos lendo opiniões de caras que são referências, e a absoluta maioria é em inglês, e NÃO, eles NÃO vão traduzir nada 🙂

Além da parte de simplesmente ler e aprender novos conteúdos, se você não conhece bem inglês, perde a ótima chance de interagir com os caras que estão participando da definição de coisas novas que vão surgindo e você precisará usar mais tarde. Especialmente no contexto de software open source, a participação da comunidade de usuários e desenvolvedores é fundamental para o sucesso de qualquer iniciativa. Muito do que os usuários falarem, criticarem ou sugerirem será crucial para os caminhos que os projetos irão tomar. Eu já tive algumas interações bem interessantes com os desenvolvedores do Mylyn, do Wicket e interações menores com desenvolvedores de outros projetos, e se eu não fosse capaz de me comunicar em inglês nada disso teria sido possível.

If you wanna excel in this field and you don’t speak english very well, do yourself a favor: start improving your english skills right now! 🙂


Elixir of productivity boost

janeiro 20, 2008

Atenção, este blog foi migrado para: http://brunopereira.org

Since I returned from my trip to Argentina and Chile, I’ve been pretty busy at work and when I get home at night. I’m writing an article on web services (more on that in February…) and got a small freelance project to do.Sometimes it’s kinda hard to produce well at night after a tiresome day at work, but a long time ago I discovered my powerful elixir of productivity at night 🙂 For those of you who do not know me personally, although I’m rather eclectic regarding music, I’m a brave heavy metal fan at heart 😉

When I must start high octane mode at 9 PM, I usually start listening to a power metal set, composed mostly by some finnish bands I love. This year, I’ve been listening to Sonata Artica, Nightwish and Stratovarius most of the time. These bands have some very addictive songs, and the high speed drums combined with the talent of their singers (as for Nightwish, I’m refering to the Tarja Turunen epoch) give me my much needed energy.

Tony Kakko, Tarja Turunen and Timo Kotipelto are really great singers and exceptional live performers.Unfortunately, I never had the chance of going to a Sonata Arctica gig, but I went to Nightwish and Stratovarius gigs in the past and it was awesome. I really like to listen to their live performances, and fortunately You Tube offers a very rich collection of everything you want to listen, so I recently created a playlist there.

For those of you who want to make use of my powerful elixir of productivity boost, the playlist can be accessed here. Long live heavy/power metal! Have fun!