Tenho um aplicativo web (war - somente servlets e jsps) e preciso utilizar alguns recursos de aplicativos enterprise (ear - ejb, jms, wars…) então quero passar a distribuí-lo no JBoss, porém hoje fazemos deploy de várias instancias deste mesmo aplicativo no mesmo servidor (tomcat), porque temos um produto que mantemos para vários clientes (a única diferença entre as instancias é o banco de dados que cada uma acessa, e algumas configurações em properties).
Seria possível ter várias instancias do mesmo aplicativo (ear) no mesmo jboss?
E enquanto ao jndi dos ejbs, e namespaces do ejbs e datasources que compartilham o mesmo namespace?
Alguém faz esse tipo de coisa, ou sabe se é possível?
Bom dia André,
Essa solução não é muito ‘ortodoxa’. Vai te dar um trabalho doido para replicar além de sugar uma boa memória do seu JBOSS…
Pq a aplicação não trata o cliente e customiza de forma programática… é bem menos dor de cabeça! 
Abraços.
André,
Realmente, não é fácil, mas você pode utilizar o recurso de partições
Exatamente o mesmo não, mas acho que você poderia chegar a algo próximo disto usando o seguinte artifício:
-
Refatore seu código de forma que o código nos componentes do EAR façam referência apenas a nomes JNDI no namespace local (“comp”).
-
Use o mecanismo de “alt-dd” para injetar descritores específicos de cada cliente no ear básico, onde vc. fará as associações dos nomes lógicos de datasources utilizados com os nomes fisicos, resultando em um ear parametrizado para o cliente.
O passo 2 deve ser automatizado via ant ou algo semelhante, simplificando assim o processo de implantação.
Este recurso de alt-dd funciona com JBoss?
Na documentação não consta nada…
[quote=andrefariagomes]Este recurso de alt-dd funciona com JBoss?
Na documentação não costa nada…[/quote]
Faz parte da spec e o JBoss diz que está em conformidade, portanto assumo que sim. Note que alguns dos mapeamentos podem ser controlados via descritores específicos do JBoss (jboss-app, jboss-web). O princípio seria o mesmo: um ear “genérico” que seria customizado via adição de descritores, gerando assim um ear específico para o cliente.
Ótimo!!! Muito obrigdo pela dica!
Porém estou com um último problema…
No persistent unit eu tenho que definir um datasource (persistence.xml):
<persistence-unit name=“tecPU” transaction-type=“RESOURCE_LOCAL”>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/tecDS</non-jta-data-source>
e este datasource é criado através de um arquivo *-ds.xml que é colocado no JBoss e o JBoss sempre o cria em dominio publico no JNDI…
Sabe como eu poderia resolver este problema sem ter que criar um arquivo persistence.xml para cada cliente?
[quote=andrefariagomes]Ótimo!!! Muito obrigdo pela dica!
Porém estou com um último problema…
No persistent unit eu tenho que definir um datasource (persistence.xml):
<persistence-unit name=“tecPU” transaction-type=“RESOURCE_LOCAL”>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<non-jta-data-source>java:/tecDS</non-jta-data-source>
e este datasource é criado através de um arquivo *-ds.xml que é colocado no JBoss e o JBoss sempre o cria em dominio publico no JNDI…
Sabe como eu poderia resolver este problema sem ter que criar um arquivo persistence.xml para cada cliente?
[/quote]
Troque o “java:/tecDS” por um nome local à aplicação, p.ex java:comp/env/jdbc/tecDS.
No arquivo jboss.xml vc. faz o bind deste nome para o nome do datasource específico do cliente.
Dê uma olhada na documentação do JBoss sobre “ENC names”, onde há informação detalhada sobre o assunto.
Fiz o seguinte:
/META-INF/jboss.xml
<!DOCTYPE jboss PUBLIC
"-//JBoss//DTD JBOSS 4.2//EN"
"http://www.jboss.org/j2ee/dtd/jboss_4_2.dtd">
<jboss>
<resource-managers>
<resource-manager>
<res-name>tecDS</res-name>
<res-jndi-name>java:/testeDS</res-jndi-name>
</resource-manager>
</resource-managers>
</jboss>
No persistence.xml:
<non-jta-data-source>java:/comp/env/tecDS</non-jta-data-source>
No teste-ds.xml
<datasources>
<local-tx-datasource>
<jndi-name>testeDS</jndi-name>
O seguinte erro me é apresentado:
— MBeans waiting for other MBeans —
ObjectName: persistence.units:ear=tec-importer-ear.ear,jar=tec-ejb-finanImporter.jar,unitName=tecPU
State: NOTYETINSTALLED
I Depend On:
jboss.jca:name=comp/env/tecDS,service=DataSourceBinding
Depends On Me:
jboss.j2ee:ear=tec-importer-ear.ear,jar=tec-ejb-finanImporter.jar,name=TecFinanImporterBean,service=EJB3
O que pode estar faltando?
Tente colocar o “nome completo” (java:/comp/env…) no persistence.xml
Olá amigo,
você conseguiu resolver? estou com o mesmo problema!
Grato.