SOPA + PIPA = O Fim da internet
Utilidade pública: Alertar veículo roubado
Posted by Endrigo Antonini in automóvel, DPRF, moto, Notícias, Roubo, Utilidade pública on 08/01/2012
“Adobe ‘aposenta’ o flash para investir em tecnologia defendida pela Apple”
Posted by Endrigo Antonini in Adobe, Adobe AIR, Adobe Flash, Adobe Flex, Apple, Descontinuar, HTML5, Notícias, Tecnologia on 10/11/2011
“Conciliar negócio próprio com emprego fixo depende de ética”
Posted by Endrigo Antonini in Administração, Empreendedor, Intraempreendedor, Notícias, PEGN, Recursos Humanos on 01/11/2011
“Estudante cria sistema que permite fazer pedidos na mesa da praça de alimentação”
Posted by Endrigo Antonini in Celular, Comércio, Inovação, NFC, Notícias, Tecnologia on 25/10/2011
Introdução a Groovy e Grails na Semana da Computação UDESC
Posted by Arian Pasquali in Sem categoria on 12/10/2011
Configurando Log4j para email de exceptions no Grails
Posted by Arian Pasquali in Sem categoria on 12/10/2011
Sistema modular aplicando OSGI com Apache Felix
Posted by Arian Pasquali in Sem categoria on 25/09/2011
No início desse ano estive envolvido em um projeto onde um dos principais requisitos seria a flexibilidade de instalar, desinstalar, pausar e restartar módulos em tempo de execução sem precisar parar o sistema todo ou impactando o mínimo nos módulos já instalados. Isso especialmente porque o ciclo de vida de desenvolvimento desses módulos seriam independentes e por outras questões de ambiente. O sistema não podia crescer sendo um bloco monolítico. Ele precisava ter modularidade no seu DNA e os componentes deveriam funcionar mais como serviços que cooperariam entre si.
Quando comecei a esboçar o núcleo do sistema percebi que o problema era mais comum do que havia imaginado inicialmente, foi quando lembrei que já existia uma solução pra isso e podia atender pelo nome de OSGi, ou Open Services Gateway Initiative, que apesar do nome pouco intuitivo é uma especificação para se criar sistemas modulares e orientados a serviços em Java.
A primeira versão da especificação saiu em 2000 e desde de então vem evoluindo e sendo empregada em aplicações como Eclipse, Glashfish e no ServiceMix. O que todas essas aplicações têem em comum é a capacidade de suportar e gerenciar plugins. Exatamente como no projeto em questão.
Os containers mais relevantes que eu encontrei na época foram o Apache Felix , Equinox e Knopflerfish. Brincando um pouco com cada acabei escolhendo o projeto Apache pela facilidade. Depois de fazer o download, pra iniciar o felix basta executar um jar.
java -jar bin/felix.jar
Executando o comando lb ele lista os componentes ativos (ou bundles como são chamados).
g! lb
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (3.0.0)
1|Active | 1|Apache Felix Bundle Repository (1.6.2)
2|Active | 1|Apache Felix Gogo Command (0.6.0)
3|Active | 1|Apache Felix Gogo Runtime (0.6.0)
4|Active | 1|Apache Felix Gogo Shell (0.6.0)Agora com o Felix rodando só falta instalar um bundle próprio.
Basicamente a especificação pede que você informe meta-informações sobre o seu jar dentro do manifest. Se você usa Maven fica tudo mais fácil com o Maven Bundle Plugin. Com esse plugin você consegue definir no seu arquivo pom as informações para transformá-lo em um bundle OSGI.
O ciclo de vida de um bundle é gerenciado pelo container e você só precisa de uma classe que implemente a interface BundleActivator.
package org.foo.myproject.impl1;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class MyBundleActivator implements BundleActivator {
public void start(BundleContext bundleContext){
System.out.println("Olá! Eu sou um bundle ativo =) ");
}
public void stop(BundleContext context) {
System.out.println("Bye bye");
}
}
Essa classe deve ser informada no manifest. Usando maven a configuração você adicionaria essa configuração no seu arquivo pom dessa maneira.
...
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>org.foo.myproject.api</Export-Package> <!-- visível para outros bundles -->
<Private-Package>org.foo.myproject.*</Private-Package>
<Bundle-Activator>org.foo.myproject.impl1.MyBundleActivator</Bundle-Activator>
</instructions>
</configuration>
</plugin>
</plugins>
...
Execute "mvn package" e pronto.
Para instalar o novo bundle basta executar o comando install:
g! install file:/path/to/bundle/bundle.jar
g! lb
START LEVEL 1
ID|State |Level|Name
0|Active | 0|System Bundle (3.0.0)
1|Active | 1|Apache Felix Bundle Repository (1.6.2)
2|Active | 1|Apache Felix Gogo Command (0.6.0)
3|Active | 1|Apache Felix Gogo Runtime (0.6.0)
4|Active | 1|Apache Felix Gogo Shell (0.6.0)
5|Installed | 1|Example Bundle (1.0.0)
g! start 5
Olá! Eu sou um bundle ativo =)
g!Pesquisando mais a fundo o projeto descobri ainda um subprojeto chamado Apache Karaf que veio facilitar ainda mais o gerenciamento dos componentes. Basicamente é uma distribuição baseada no kernel do Apache Felix somando funcionalidades adicionais mais amigáveis para o gerenciamento dos bundles tais como console, interface web de administração, segurança, sistema de logging, configuração dinâmica, features, hot deployment e etc.
Hoje temos o Karaf rodando em ambiente de produção e cobrindo nossas necessidades.
O mais legal disso tudo é que você acaba tendo mais uma opção pra evitar usar um container pesado como um servidor de aplicação para disponibilizar seus componentes. Considere também um container OSGI a partir de agora.
Mini curso Introdução a Desenvolvimento Web com Java da GlobalCode em Joinville
Posted by Endrigo Antonini in Globalcode, Java, Minicurso, Notícias, V.Office, Web on 13/09/2011
Google cancela Google Desktop e outros produtos de seu portfólio
Posted by Endrigo Antonini in Mudanças, Notícias, projetos, Tecnologia, Valor on 05/09/2011
