Thoughts on my own. Posts not reflect the opinions of my past or current employers. More about me: diegopacheco.github.io
JBoss 5.0.1.GA, EJB3, Maven2 e Cargo Juntos e na Prática
Get link
Facebook
X
Pinterest
Email
Other Apps
Neste post vou mostrar como criar um projeto EJB 3 bem simples usando Maven 2. Vamos fazer o deploy no JBoss 5.o.1.GA através do plugin do maven do cargo. Além disso vamos criar um projeto cliente que acessa o EJB criado através de JNDI.
Meu objetivo é mostrar de uma maneira simples e que funciona :) como usar maven 2 com projetos ejb3, de barbada vamos fazer o deploy no JBoss 5.0.1.GA, no fim do post você irá encontrar os códigos fontes e bem como as dependências(jars) da aplicação cliente.
Criar uma aplicação Java com Maven é realmente muito fácil mais quando falamos de fazer um deploy no servidor com o cargo usando o plugin do maven as coisas não são tão simples, por que a documentação do Cargo não é 100% intuitiva e faltam exemplos práticos de como usar as configurações. Além disso o JBoss 5 ainda não está 100% com o maven 2, mais para frente do post vocês irão entender o por que disso.
Cuidado com o JDK
Recomendo que você use um JDK acima do JDKu10, eu estou usando no momento o JDKu13. Caso você use um inferior ao JDKu10 você terá sérios problemas para subir o comtainer do JBoss 5. Existem diversos posts em blogs e tutoriais na web que recomendam você colocar os jars do jaxb e jaxws no diretório endorsed da jvm, para mim isso não funcionou. A melhor saída é usar um JDK mais novo.
Nota: Até por que o JDK tem uma performance melhor do que as dos anteriores e recursos bem interessantes em termos de ferramentas.
O Projeto EJB 3
Nesse projeto vamos criar uma interface de negocio chamada de DateService. Essa interface é simples seu objetivo e representar o contrato de um serviço de datas, que informa através de uma String a data atual do container. Vamos ao código da interface:
package com.blogspot.diegopacheco.services;
/**
* Interface de Servico de Data
*
* @author Diego Pacheco
* @version 1.0
* @since 03/05/2009
*
*/
public interface DateService {
public String getDateTime();
}
Agora vamos a implementação do EJB 3. Vou usar os novos recursos do EJB 3 em termos de anotações. Vamos ver o código então:
package com.blogspot.diegopacheco.services;
import java.util.Date;
import javax.ejb.Remote;
import javax.ejb.Stateless;
/**
* Stateless Session Bean que eh uma implementacao do Servico de Data
*
* @author Diego Pacheco
* @version 1.0
* @since 03/05/2009
*
*/
@Stateless
@Remote(DateService.class)
public class DateServiceBean implements DateService{
public String getDateTime() {
return new Date().toString();
}
}
Como podem ver a implementação é simples, por que o meu objetivo no post é mostrar como integrar e usar essas tecnologias. Muito bem agora vamos ao pom do maven desse projeto:
Vocês podem ver que estou usando o plugin de ejb do maven e bem como o plugin do cargo. Não repare ao onde diz 'jboss4x' pois isso funciona no JBoss 5. Na propriedade 'home' você tem que apontar para a sua intalação do JBoss 5.
Agora suba o JBoss 5.0 pelo console e após o JBoss ter subido execute os seguintes goals do maven:
mvn clean install cargo:deploy
Com o 'cargo:deploy' você irá fazer o deploy do seu ejb no JBoss 5 através do plugin do cargo do maven. Agora verifique no console do JBoss5, ele deve ter mostrado algo parecido com isso:
20:26:11,545 INFO [MainDeployer] deploy, url=file:/D:/Diego/workspace-gps/mvn2-jboss5-ejb3/target/mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar
20:26:11,717 INFO [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@19623251{vfszip:/D:/Diego/workspace-gps/mvn2-jboss5-ejb3/target/mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar/}
20:26:11,718 INFO [Ejb3DependenciesDeployer] Encountered deployment AbstractVFSDeploymentContext@19623251{vfszip:/D:/Diego/workspace-gps/mvn2-jboss5-ejb3/target/mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar/}
20:26:14,862 INFO [JBossASKernel] Created KernelDeployment for: mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar
20:26:14,871 INFO [JBossASKernel] installing bean: jboss.j2ee:jar=mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar,name=DateServiceBean,service=EJB3
20:26:14,871 INFO [JBossASKernel] with dependencies:
20:26:14,871 INFO [JBossASKernel] and demands:
20:26:14,872 INFO [JBossASKernel] jboss.ejb:service=EJBTimerService
20:26:14,872 INFO [JBossASKernel] and supplies:
20:26:14,872 INFO [JBossASKernel] jndi:DateServiceBean/remote-com.blogspot.diegopacheco.services.DateService
20:26:14,872 INFO [JBossASKernel] jndi:DateServiceBean/remote
20:26:14,872 INFO [JBossASKernel] Class:com.blogspot.diegopacheco.services.DateService
20:26:14,872 INFO [JBossASKernel] Added bean(jboss.j2ee:jar=mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar,name=DateServiceBean,service=EJB3) to KernelDeployment of: mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar
20:26:15,068 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=mvn2-jboss5-ejb3-1.0-SNAPSHOT.jar,name=DateServiceBean,service=EJB3
20:26:15,086 INFO [EJBContainer] STARTED EJB: com.blogspot.diegopacheco.services.DateServiceBean ejbName: DateServiceBean
20:26:15,169 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
DateServiceBean/remote - EJB3.x Default Remote Business Interface
DateServiceBean/remote-com.blogspot.diegopacheco.services.DateService - EJB3.x Remote Business Interface
Agora podemos ir para o projeto ejb-client. Nesse projeto vamos usar maven, mas será necessário o uso de bibliotecas fora as do maven.
Por que não usar Maven no Ejb3-Client?
Por que ao utilizar os repositórios do maven do JBoss que são:
http://repository.jboss.org/maven2/
http://repository.jboss.com/maven2/
Até existem os jars necessários para o uso da aplicação de ejb cliente com JBoss 5.0.1.GA, porem os jars estão em versões mais antigas do que as bibliotecas que existem no JBoss 5.0.1.GA, você pode conferir isso, vá nesses diretórios:
$JBOSS_HOME/lib
$JBOSS_HOME/common/lib
Hoje(03/05/2009) as dependências dos repositórios do jboss acima não são compatíveis, são de versões mais antigas, mas não são todas as bibliotecas são algumas, para não ficar com o projeto capenga resolvi usar essas dependências da maneira tradicional criando uma pasta lib e a adicionando ao classpath no eclipse.
A Classe de testes do projeto cliente, ela chama o ejb através e um lookup JNDI feito por uma classe helper chamada de ServiceLocator que por sinal é um padrão de design da sun.
package com.blogspot.diegopacheco.services;
import org.junit.Test;
import com.blogspot.diegopacheco.services.DateService;
/**
* Classe de testes unitarios que usa o ejb 3.
*
* @author Diego Pacheco
* @version 1.0
* @since 03/05/2009
*
*/
public class ClientEjb3Test {
@Test
public void testDateServiceAsGetDate(){
try{
System.out.println("Inicio dos testes.");
DateService ds = ServiceLocator.getServiceRemote(DateService.class);
System.out.println("A Data retornada do EJB eh:" + ds.getDateTime());
System.out.println("Fim dos testes.");
}catch(Throwable t){
t.printStackTrace();
}
}
}
Vamos a classe de ServiceLocator. Essa classe é genérica, e melhora a qualidade do código mas para isso você deve criar as suas implementação de ejb com o sufixo Bean.
package com.blogspot.diegopacheco.services;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
/**
* Classe utitilária para recuperação de EJBs.
*
* @author Diego Pacheco
* @version 1.0
* @since 03/05/2009
*
*/
public class ServiceLocator {
public static final String RemoteJNDIName = "Bean/remote";
private static String BASE;
private static FileInputStream PATH_SIMPLE;
private static String BASE_PATH;
private static Context context;
static{
try {
BASE = new File(".").getCanonicalPath();
BASE_PATH = BASE + "/src/main/resources/jndi.properties";
PATH_SIMPLE = new FileInputStream(new File(BASE_PATH));
} catch (Throwable t) {
throw new RuntimeException(t);
}
}
static{
try
{
Properties properties = new Properties();
try {
properties.load(PATH_SIMPLE);
properties.list(System.out);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
context = new InitialContext(properties);
} catch (NamingException e){
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static T getServiceRemote(Class clazz) throws NamingException{
T temp = (T)context.lookup( clazz.getSimpleName() + RemoteJNDIName );
return temp;
}
}
As configurações de JNDI estão em um arquivo properties. São as configurações default para o JBoss.
Como eu já disse antes você acha esses jars aqui: $JBOSS_HOME/lib e e $JBOSS_HOME/common/lib.
Ok, podemos rodar a classe client, perceba que ela é uma classe de testes do Junit. Vamos rodar o teste, o resultado deve ser algo como esse:
Inicio dos testes.
-- listing properties --
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
A Data retornada do EJB eh:Sun May 03 20:50:37 BRT 2009
Fim dos testes.
Você pode pegar os fontes completos no meu repositório do Subersion. São esses urls:
Zig is a general-purpose language created in 2016 by Andrew Kelly . Zig aims to fix the issues C language has while being pragmatic and simple at the same time. Zig really shines as being simple by not having any hidden control flows, not having hidden memory allocations, no pre-processors, and no macros. Basically, it's one language and one language only. Since pre-processors and macros can get really complex and become their own universe. Sure it's not the Zig Philosophy. Zig Compiler(Zig cc) also is a C compiler, and the interoperability from C to Zig is very good. Clearly, we can see influence from other languages like Go and Rust; however, Zig is pretty unique and different from Go and Rust. Zig is fast. Zig is perfect for system programming. I bet we will see a lot of solutions being built in Zig. As a languages aficionado, I like to learn at least one language per year and sometimes more; Zig was my 2021 pick, did not regret it. Even if you dont use all language...
When I start on IT, several years ago(+15), C was the first language that I learned. But was not the first language I mastered and deployed in production which was...surprisingly Visual Basic 6.0. However, when I learned C or any language back on that old and arcane time noddy was into testing. However now is impossible to work professionally in any language without tests. C is a low-level language but still kicks ass and has several interesting libs/frameworks. People use to fear C a lot because of lack of syntactical sugar but once you get used to it is not that hard at all. Today I want to show how you can do Unit Testing with C. I will not show how to do Unit Testing with C++ but with C ANSI actually. We will be using Check a unit test lib for C ANSI.
I often don't blog about this kind of stuff. Yesterday I friend of mine showed me this awesome project called cool-retro-term . When you work with Cloud Computing and DevOps Engineering you spend lots of time on the black screen testing things on the cloud. When I saw this project I got very excited because it brings some nostalgy back to my life. To be 100% clearI'm not that old as my friend :-) However I share his joy into this retro terminals. This also reminds me some old games like Fallout 1 . I just this is pure fun so I'm sharing here with you guys some screenshots and also how to run on Gnome Ubuntu 17.04.