Posts filed under ‘JBoss AS’
EJB Lookup w/ JNDI on Jboss AS 7
Hello everyone!
I was kinda busy last months, so I did not have time to publish more posts here :/
Anyway, some weeks ago i have noticed a little (big) issue on JBoss AS 7 – I couldn’t make EJB lookup using JNDI!
I had to Google a lot to find a concrete answer.
So I’d like to share a way to do it.
First of all, you must have AS 7.1.x, even if it is not at the final version yet. You can download it here.
Then, create a file named jboss-ejb-client.properties into your src folder, and add this content
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false remote.connections=default remote.connection.default.host=localhost remote.connection.default.port = 4447 remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false remote.connection.two.host=localhost remote.connection.two.port = 4447 remote.connection.two.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
Now the disgusting part. You’ll need to make a big workaround here.
Your class is going to have lots of information. And one BIG important thing – this first example only works for Stateful EJBs. I’ll show an example for Stateless EJBs later. So remember – STATEFUL EJBs:
public class ClientMyStatefulBean {
static {
Security.addProvider(new JBossSaslProvider());
}
//STATIC BLOCK - YOU MUST HAVE THIS
public static void main(String[] args) throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "myBeans";
// THIS IS THE NAME OF THE JAR WITH YOUR EJBs. Write its name here, without the .jar.
final String distinctName = "";
// AS7 allows deployments to have an distinct name. If you don't use this feature, let this field empty.
final String beanName = MyBean.class.getSimpleName();
//EJB CLASS WITH THE IMPLEMENTATION (simple name)
final String viewClassName = Bean.class.getName();
// FULLY QUALIFIED NAME OF THE REMOTE CLASS (interface).
Bean bean = (Bean) context.lookup("ejb:" + appName + "/"
+ moduleName + "/" + distinctName + "/" + beanName + "!"
+ viewClassName + "?stateful");
}
}
Now for STATELESS BEANS, do this:
public class ClientMyStatelessBean {
static {
Security.addProvider(new JBossSaslProvider());
}
//STATIC BLOCK - YOU MUST HAVE THIS
public static void main(String[] args) throws NamingException {
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES,
"org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "myBeans";
// THIS IS THE NAME OF THE JAR WITH YOUR EJBs. Write its name here, without the .jar.
final String distinctName = "";
// AS7 allows deployments to have an distinct name. If you don't use this feature, let this field empty.
final String beanName = MyBean.class.getSimpleName();
//EJB CLASS WITH THE IMPLEMENTATION (simple name)
final String viewClassName = Bean.class.getName();
// FULLY QUALIFIED NAME OF THE REMOTE CLASS (interface).
Bean bean = (Bean) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName)
//NOTICE THAT DOING LOOKUP FOR STATELESS EJBs IS DIFFERENT FROM STATEFUL EJBs!!!
}
}
It is not over yet!
Now you must add some jars to your classpath!
You’ll need these jars:
- jboss-transaction-api_1.1_spec-1.0.0.Final.jar
- jboss-ejb-api_3.1_spec-1.0.1.Final.jar
- jboss-ejb-client-1.0.0.Beta10.jar
- jboss-marshalling-1.3.0.GA.jar
- xnio-api-3.0.0.CR5.jar
- jboss-remoting-3.2.0.CR6.jar
- jboss-logging-3.1.0.Beta3.jar
- xnio-nio-3.0.0.CR5.jar
- jboss-sasl-1.0.0.Beta9.jar
- jboss-marshalling-river-1.3.0.GA.jar
You can find all these jars into your Jboss AS 7 folder inside “modules” folder.
Or, to make things more simple, I’ve created this project at github ->https://github.com/hannelita/jboss-as-libs-ejb-lookup
All necessary libs are there, just include them into your classpath and things should work
Need more references? You can find the here:
Docs -> https://docs.jboss.org/author/display/AS71/EJB+invocations+from+a+remote+client+using+JNDI
Issue discussion -> https://issues.jboss.org/browse/AS7-1338
Project example -> https://github.com/jaikiran/quickstart/tree/master/ejb-remote
I’d like to thank a guy called Jaikiran Pai for publishing this information into JBoss Docs!
Well, just to finish the topic – I think its still an ugly way to do ejb lookup. For xample, that static block and all those strings are disgusting. Hope to have a better solution for further versions!
Seam 3 – Iniciando!
Olá, pessoal! Muitas pessoas tem me pedido um tutorial full power pró de Seam 3, desde o que precisa ter no ambiente de trabalho até um exemplo de app simples.
Então vamos por etapas. =)
Ambiente de trabalho
A primeira coisa necessária é o Java (claro). De preferência o JDK 6.
Em seguida, é preciso ter o Maven 3 (tal qual descrevi em outro post - o Seam 3 é inteiramente baseado em Maven 3). Baixe o Maven 3 aqui. A instalação vai depender do seu SO, mas basicamente é só descompactar e registrar o mvn no seu PATH.
Por último, você precisa de um servidor JEE 6 (Glassfish 3, JBoss 6 ou 7) ou servlet container que suporte o Weld (Tomcat em sua última versão, por exemplo). Usarei o JBoss 6 e eventualmente o 7 em tudo que fizer aqui. Tip – Jboss 7 starta em 2 segundos. Veja você mesmo:
(Dica – configure um JBOSS_HOME no seu PATH)
(Baixe o Jboss 6 ou 7 aqui)
Você também pode querer uma IDE. Eu recomendo Eclipse Helios. Embora ainda não haja suporte do JBoss Tools para Seam 3, ainda acho que é uma boa IDE para se trabalhar. [Dica pra quem está começando - Baixe o Eclipse Helios for Java EE Developers!]
Assim que você baixar o Eclipse Helios, descompacte-o e abra-o. É preciso instalar o plugin do M2Eclipse (Maven para Eclipse). Basta ire m Help -> Install new software:
Em seguida, encontre o link do m2eclipse, selecione o checkbox e instale o plugin:
Baixando alguns exemplos
Depois de instalar o ambiente de trabalho, é interessante baixar alguns exemplos pra ver o Seam 3 em ação. Para tanto, você precisará ter o git instalado. Se você não manja nada de git, aqui há ótimas referências e tutoriais
Basta dar um
git clone https://github.com/seam/examples.git
Isso clonará uma série de exemplos para você.
Comecemos pelo clássico exemplo de booking. Abra um terminal e vá até o diretório ../examples/booking.
Em seguida, digite
mvn package jboss:hard-deploy
Espere infinitamente o Maven baixar as dependências para você e dar deploy da app no servidor. Depois, inicie o JBoss AS (rode o ./run.sh na pasta bin do sei JBOSS_HOME), e acesse:
http://localhost:8080/seam-booking
Você deve ver algo como
Coisas que podem dar errado:
- NÃO abra o projeto pelo eclipse e tente rodar por lá. Possivelmente vai dar merda.
- Se seu JBOSS_HOME falhar, no POM coloque hard-coded apenas para você ver algum resultado:
<properties> <webapp.directory>src/main/webapp</webapp.directory> <jboss.home>/usr/local/jboss/jboss-6.0.0.Final/</jboss.home> <jboss.domain>default</jboss.domain> </properties>
No próximo post, vamos criar um projeto do zero
Mais informções no site do Seam 3!
Post relâmpago – solucionando problemas nada óbvios com Jboss e Eclipse
Esse post super breve serve para contar algumas experiências ruins que tive nessa última semana com o Jboss AS 5.1 e a solução para os problemas que me aconteceram. Pode ser que seja o mesmo problema de alguém. As soluções para os dois casos abaixo são ridículas, mas acreditem, gastei horas com as mesmas!
Caso 1 – Jboss entrando em deploy infinitamente!
Pois é, se você tem alguma aplicação exploded no seu Jboss e mais, se essa app contiver xmls de JSF (faces-config), Spring, Seam (pages.xml) no WAR, então é provável que se você usa o jboss 5.1 já lhe aconteceu o bug bizarro do deploy infinito. Extremamente desagradável e irritante, sem contar que se você estiver em um PC ele vira uma carroça. Pois bem, depois de algumas olhadas no Google, vi umas soluções porcas, do tipo mexer no tempo que o Jboss verifica alterações e coisas do gênero.
Pois bem, não se trata de nada disso. O Jboss, em seu auge de loucura, não sei por que diabos cria, na pasta WEB-INF do seu projeto WAR (naquele mesmo local onde estão os xmls de configuração de algum framework) uns arquivos bizarros com extensões mais estranahas ainda. Por exemplo, ele cria um faces-config.xml.spadia, e uns outros arquivos com extensões loucas. A questão é que o Server pira se tiver qualquer coisa com essas extensões que não são apenas .xml na pasta do projeto exploded. Ou seja, basta deletar da pasta exploded E da pasta do seu projeto (não sei como, mas se você usa sincronizadores tipo FileSync, esses arquivos de extensão estranha vão parar na pasta do seu projeto também. É só isso. Delete esses arquivos e reinicie o Server. Tiro e queda =)
Caso 2 – Workspace do Eclipse enlouquece totalmente com uma tal de SAXParserException e não permite que eu mexa no meu projeto que usa Maven.
Pois é, essa aí me custou muitas horas torrando os neurônios. Vou resumir o que aconteceu, talvez você já tenha passado por um aperto desses.
Estava eu dando clean install em uma aplicação que usa Maven e EJbs com Jboss Seam, quando o Eclipse trava e tive que crashá-lo na força bruta. Normal acontecer isso, especialmente se você usa PC com Windows. Quando reabri o Eclipse, se eu clicasse em qualquer item ou em qualquer módulo do projeto aparecia essa janelinha de erro de SAXParserException e eu não conseguia fazer absolutamente nada no projeto! Até tentei criar uma nova workspace e dar um Import no projeto, mas de nada adiantou, continuou com essa Exception e nada do meu projeto abrir; bateu aquele desespero e aquele peso na consciência de “ó, não, por que não dei commit pro repositório antes disso acontecer??”
Depois de muitas horas perdidas procurando a solução, finalmente encontrei. De alguma forma, meu application.xml estava em branco. Já vi casos em que ele estava incompleto, e ocasionou o mesmo erro. Esse fato gerava esse erro. O mais estranho disso foi que mesmo com o auto-build desligado, o Eclipse permanecia instável. Fui manualmente, através dos diretórios, até a pasta do application.xml e reescrevi o mesmo (num editor de texto comum, porque o Eclipse de fato se recusava a abrir qualquer arquivo do meu projeto!). Após isso dei um refresh na workspace e tudo voltou a funcionar! #win
Espero que esse post tenha sido útil para ajudá-lo caso já tenha passado por um aperto similar!
Comparativo entre arquétipos Maven usando Jboss Seam
Escolhendo o melhor arquétipo Maven para usar com Seam
Enquanto o Seam 3 final não é lançado, uma das melhores formas de construir projetos utilizando Jboss Seam e Maven é através de arquétipos já existentes. Esse artigo lista três arquétipos que considero excelentes e as principais diferenças entre os três.
1 . Arquétipo contendo um WAR simples para ser hotdployed no Jboss AS (De preferência o Jboss AS 5.1) – Use esse arquétipo aqui – http://code.google.com/p/ctpjava/wiki/JBossSeamMavenArchetype
Simples mas agressivo, esse arquétipo é um dos mais completos que já vi. Especialmente pra quem curte e pratica TDD, ele já vem com uma infra de testes muito boa! Deem uma olhada no POM pra ver o que ele contém em suas dependências:
<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>hibernate-all</artifactId>
<version>${jboss.embedded.version}</version>
<scope>provided</scope>
</dependency></pre>
<!-- *************** Test Dependencies *************** -->
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.8</version>
<classifier>jdk15</classifier>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>jboss-embedded-all</artifactId>
<version>${jboss.embedded.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>jboss-embedded-api</artifactId>
<version>${jboss.embedded.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.jboss.seam.embedded</groupId>
<artifactId>thirdparty-all</artifactId>
<version>${jboss.embedded.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>${javax.faces.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>${javax.faces.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
Ele já vem com o testeng (para testes de integração, especialmente) e é possível mockar o Seam de uma forma muito simples para realizar testes unitários!
Fora isso ele já vem com toda a estrutura pronta para hotdeploy, de forma que basta baixar o projeto e dar um mvn:package que a pastinha do projeto já aparece no diretório de deloy do jboss! =)
O projeto em si é extremamente bem feito, com um arquivo de properties para configuração de banco e testes. A configuração dos aspectos do Jboss se encontram no POM do arquivo principal. Bem simples:
<properties></pre>
<java.source.version>1.5</java.source.version>
<jboss.seam.version>2.2.0.GA</jboss.seam.version>
<jboss.richfaces.version>3.3.2.SR1</jboss.richfaces.version>
<jboss.jbpm-jpdl.version>3.2.3</jboss.jbpm-jpdl.version>
<jboss.embedded.version>beta3.SP9</jboss.embedded.version>
<drools.version>5.0.1</drools.version>
<javax.faces.version>1.2_12</javax.faces.version>
<icefaces.version>1.8.1</icefaces.version>
<hotdeploy.version>0.3.3</hotdeploy.version>
<cli.version>0.7</cli.version>
<jboss.server>default</jboss.server>
<jboss.server.directory>F:\Eclipse\jboss-5.1.0.GA\jboss-5.1.0.GA</jboss.server.directory>
<jboss.servers.directory>${jboss.server.directory}/server</jboss.servers.directory>
<jboss.deploy.directory>${jboss.servers.directory}/${jboss.server}/deploy</jboss.deploy.directory>
</properties>
Atenção – só consegui baixar o projeto utilizando Maven 3. Utilizando algum Maven 2.x não rolou de forma alguma.
Único ponto falho que observei no projeto é que ele poderia já vir com FIleSync…. O hotdeploy é perfeito com o FIleSync, apesar de muitas pessoas reclamarem dele.
Os criadores do arquétipo até fizeram um vídeo explicativo: http://www.youtube.com/watch?v=Zpn-teo1l3E
Vale a pena conferir! =)
Bom, agora vamos partir pra alguma coisa mais pesada – Arquétipos de EAR, e não só com WAR. Conheço dois bons arquétipos de EAR:
2. Arquétipo de referência – RI – http://www.glxn.net/seam-maven-refimpl/doc/tutorial/01-gettingstarted.html – de cara é simples e muito eficiente.
Possui ferramentas de testes e usa o OpenEJB. Não cheguei a colocar nenhum projeto em prática com esse arquétipo, apenas baixei para ter uma idéia. A parte chata dele é que de fato, tal qual sugere o tutorial, você vai ter que puxar o arquétipo com o Tortoise do repositório. Mas no geral é um arquétipo muito bem estruturado e limpo.
3. Arquétipo do Akquinet – http://blog.akquinet.de/2009/09/14/getting-started-with-jboss-seam-and-maven-in-10-seconds/ – esse é pra agredir mesmo! Na minha opinião, em questão de estrutura é o mais completo, porém o menos organizado. O que chama atenção nele é o módulo de entidades. De fato, se você já passou pela experiência de tentar criar seu próprio arquétipo Maven para Seam, deve ter sofrido com o módulo de entidades se caso ele estivesse no mesmo projeto. Incrivelmente, o projeto do Akquinet TEM UM MÓDULO DE ENTIDADES!!! E FUNCIONA =D
Procure nos catálogos do seu Eclipse o arquétipo do akquinet. Costuma ter. Caso não tenha, basta puxá-lo digitando
mvn archetype:generate -DarchetypeGroupId=de.akquinet.jbosscc -DarchetypeArtifactId=jbosscc-seam-archetype -DarchetypeVersion=1.2 -DarchetypeCatalog=http://seam-archetype.sourceforge.net/jbosscc-seam-archetype/1.2/archetype-catalog.xml
Como os outros arquétipos, ele oferece um bom suporte a testes:
<dependency></pre> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymock</artifactId> <version>2.5.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.easymock</groupId> <artifactId>easymockclassextension</artifactId> <version>2.5.2</version> <scope>test</scope> </dependency>
Se bem que faltou algo mais aprimorado aí…. Como o tsteNG e o OpenEJB que não estão presentes…
Outra bomba nesse projeto é a ausência de uma estruturação para hotdeploy…. É preciso configurar o projeto war no braço pra conseguir… Meu post anterior possui um tutorial que ensina a fazer isso e ensina também a usar o FileSync com esse arquétipo. Ele também poderia conter mais arquivos de properties para facilitar algumas configurações.
Mas tirando essas questões, é um projeto bem completo, atent para configurações de cachê de segundo nível, Drools, Bootstrapper de EJBs e por aí vai. Recomendo fortemente!
Uma dica para os projetos EAR que ainda não testei (mas pretendo) – Colocar o Arquillian em um desses projetos! Ainda não conhece o Arquillian??? http://www.jboss.org/arquillian
O Arquillian na minha opinião foi um insight muito grande e é bastante promissor (pelo menos no meu ponto de vista). Seria ótimo vê-lo rodando com um desses arquétipos, mesmo que ele ainda esteja em sua versão alpha. O que acham? =)
Para aqueles que desejam construir um arquétipo do zero, a pedida é usar o Jboss Tools para dar uma mãozinha…. Vejam essa publicação: http://docs.redhat.com/docs/en-US/JBoss_Developer_Studio/4.0/html/Seam_Developer_Tools_Reference_Guide/mavenized_seam.html – A versão 3.5.1 para Eclipse Galileo e 3.5.2 para Eclipse Helios já fornecem suporte para uma integração nativa na hora de criar um projeto com Seam. Basta seguir os passos desse tutorial =)
E para quem quiser mais informações, aí vai algumas leituras que considero úteis:
- Publicação de Kasper Sørensen – http://kasper.eobjects.org/2009/04/seam-ejbs-and-ear-packaging-in-maven.html
- Artigo da JavaWorld sobre Jboss, Seam e Maven – me foi muito úil para entender a estruturação do arquétipo – http://www.javaworld.com/javaworld/jw-06-2008/jw-06-build-the-enterprise.html – Os comments possuem links úteis de arquétipos e modelos de projeto que funcionam e podem servir como referência
- Referências do seamframework.org – http://seamframework.org/Documentation/IsThereAMaven2ProjectTemplateForSeamApplications – tudo que você sempre quis saber sobe Seam e Maven aqui =)
É isso, pessoal, espero que aprendam algo! Até a próxima!
Tutorial – JBoss Seam + Jboss AS + Maven + EJB + Eclipse + Jboss Tools
Olá pessoal! Post de inauguração do blog! E pra começar bem, ele traz um tutorial que explica com alguns detalhes com configurar uma aplicação com JBoss Seam + Jboss AS 5 + Maven + EJB 3 + Eclipse Galileo + Jboss Tools + Hot Deploy. Isso é algo que não é muito trivial de se fazer. Graças a um arquétipo de Maven já pré-estruturado o processo se agiliza muito =) O tutorial ficou um pouco extenso, e reúne muitas informações úteis encontradas em diversos sites. Ele se encontra na minha conta do SlideShare e pode ser baixado aqui.
=)




