Integração - Sistemas JEE

Olá pessoal,

Estive conversando com um colega e uma dúvida surgiu: na empresa onde trabalho, teremos vários módulos (sistemas), cada um responsável por uma determinada área de negócio. Estamos supondo que cada módulo será um arquivo .ear, que terá um datasource *-ds.xml e que terá uma base de dados, com as tabelas específicas.

Porém, alguns módulos, já na parte de negócio, devem ser utilizados por outros. Imaginem uma escola: um aluno seria utilizado em todos os sistemas.

Como é feita essa integração? Vocês já passaram por esse tipo de decisão? Como diminuir acoplamento nesses casos?

Obrigada!
LISS

O que eu fiz neste caso:
Um sistema é o responsável pela informação, por exemplo a vida acadêmica e financeira do aluno, e este sistema resposnável disponibiliza serviços de interação com o aluno para os outros sistemas: EJBs, WebServices, etc…

[quote=Rafael Nunes]O que eu fiz neste caso:
(…) e este sistema resposnável disponibiliza serviços de interação com o aluno para os outros sistemas: EJBs, WebServices, etc…[/quote]

Oi Rafael.

Eu realmente imaginei fazer isso. Ou seja, a !integração" na verdade seria a disponibilização de serviços através de uma interface pública, através de EJBs ou web services.

Mas agora pensa assim: imagina que o sistema financeiro tenha as suas tabelas e classes (aqui pensando num ORM), assim como o sistema de gerenciamento de alunos. Em algum momento, as classes do financeiro precisariam conhecer as classes do gerenc. de aluno…ou não? Imaginem que eu queria mostrar no módulo financeiro um relatório onde consta as transações efetuadas pelos alunos. Por exemplo, uma classe Transação.java teria um objeto do tipo Aluno.java (apenas para exemplificar). Mas Aluno.java está no ear de gerenc. de alunos, cujo mapeamento indica q ele está na base de alunos e não na de financeiro. Como seria feito esse relacionamento? Muito confusa? :frowning:

[]s

Duas possibilidades:

O sistema financeiro tem também os seus registros de alunos, e o sistema responsável por manter essas informações é quem alimenta o sistema financeiro através de serviços.
(Mas eu particularmente não gosto muito dessa abordagem pois você começa a espalhar informações repetidas pelo sistema, talvez isso seja ruim no teu caso).

Ou, como um sistema é quem é o responsável pelas informações dos alunos, e ele é quem tem as informações das transações dos alunos, ele é quem deveria disponibilizar este relatório como um serviço para o sistema financeiro.

Olá

Meus pitacos:

  1. Se é tudo Java, fuja de web services. Quando muito use RMI e mesmo assim com muita parcimônia. O ideal seria a troca de mensagens JMS com ajuda de um servidor de mensageria. E melhor ainda que as mensagens fossem padronizadas usando padrões como os do Apache Camel.

  2. Se apenas compartilharão o uso da base de dados, não deve haver grandes problemas. Mas se pretendem compartilhar componentes, o ideal seria basear todas as aplicações em OSGI. Vantagem: evitar problemas com as diversas versões dos softwares. Desvantagem: complexidade adicional no desenvolvimento.

  3. Às vezes, tentar fazer um componente que sirva para todos os módulos acaba criando componentes ruins para quase todos para satisfazer um deles. Apesar de feio, pode ser mais seguro e mais rápido fazer copy&paste de um componente de um sistema para ter suas funcionalidades estendidas em outro. Avalie bem as conseqüências e documente.

[]s
Luca

[quote=liss][quote=Rafael Nunes]O que eu fiz neste caso:
(…) e este sistema resposnável disponibiliza serviços de interação com o aluno para os outros sistemas: EJBs, WebServices, etc…[/quote]

Oi Rafael.

Eu realmente imaginei fazer isso. Ou seja, a !integração" na verdade seria a disponibilização de serviços através de uma interface pública, através de EJBs ou web services.

Mas agora pensa assim: imagina que o sistema financeiro tenha as suas tabelas e classes (aqui pensando num ORM), assim como o sistema de gerenciamento de alunos. Em algum momento, as classes do financeiro precisariam conhecer as classes do gerenc. de aluno…ou não? Imaginem que eu queria mostrar no módulo financeiro um relatório onde consta as transações efetuadas pelos alunos. Por exemplo, uma classe Transação.java teria um objeto do tipo Aluno.java (apenas para exemplificar). Mas Aluno.java está no ear de gerenc. de alunos, cujo mapeamento indica q ele está na base de alunos e não na de financeiro. Como seria feito esse relacionamento? Muito confusa? :frowning:

[]s[/quote]

Evite a todo custo uma situação em que A depende de B e B depende de A. Este tipo de relacionamento conduz inevitavelmente a uma dor de cabeça terrível na manutenção.

A solução padrão é criar um módulo comum que não dependa de ninguem, colocando neles as classes que estão criando as interdependências.

Embora vc não tenha informado, vc. deve estar usando o JBoss ( *-ds.xml). Vc chegou a dar uma olhada nos pacotes “har” (Hibernate ARchive) ? Talvez facilitem sua vida.

Pelo o quê entendi, você vai ter modelos de negócio. Pensando numa arquitetura utilizando EJBs, você terá cada modelo (Financeiro, Acadêmico, etc) em um EAR. E cada modelo seu vai possuir um client, para que qualquer outro sistema o possa utilizar. Nos clients, você terá os objetos de domínio daquele modelo (ORMs, VOs ou que for).
A sua aplicação teria os jars dos clients que ela utilizaria (no seu caso Financeiro_client.jar e Academico_client.jar ou Aluno_client.jar), chamaria os métodos dos seus modelos e trabalharia com os objetos retornados.

Um problema dessa abordagem é a “dependência”. Por exemplo, a cada alteração num interface de um modelo você teria que regerar os clients e sair atualizando em todas as aplicações que o utilizam.

Não sei se me fiz entender… :cry:

Oi Adolfo. É que a minha vontade de deixar cada módulo como ear é de independência. Por exemplo, suponha que o Financeiro tenha uma nova versão. Se fossem dois ears diferentes, eu só precisaria fazer deploy no financeiro.

Pensando nesse caso, eu teria vários ears que poderiam ou não estar no mesmo application server.

Ae a minha dúvida: Como eu vou indicar, no financeiro, que ele vai usar objetos do alunos?

Obrigada!

Olá

[quote=liss] Por exemplo, suponha que o Financeiro tenha uma nova versão. Se fossem dois ears diferentes, eu só precisaria fazer deploy no financeiro.
[/quote]

Sem querer ser repetitivo mas já sendo…
http://www.springframework.org/osgi

[]s
Luca

[quote=liss]Oi Adolfo. É que a minha vontade de deixar cada módulo como ear é de independência. Por exemplo, suponha que o Financeiro tenha uma nova versão. Se fossem dois ears diferentes, eu só precisaria fazer deploy no financeiro.
Pensando nesse caso, eu teria vários ears que poderiam ou não estar no mesmo application server.
Ae a minha dúvida: Como eu vou indicar, no financeiro, que ele vai usar objetos do alunos?
[/quote]

Mas foi isso mesmo que eu visualizei. Você teria o Financeiro.ear e o Aluno.ear. Os seus ears são seus modelos de negócio, são independentes. Aí você teria uma outra aplicação (app X) que precisaria das informações que os seus modelos são capazes de disponibilizar. Então a app X teria um client do Financeiro.ear e um client do Aluno.ear (note que os modelos de negócio são sim independentes). Desta forma, você poderia manipular as informações do modelo Financeiro e do modelo Aluno a partir da sua app X.
O problema é que cada vez que você atualizar algo no Financeiro (uma interface, adicionar um método, etc) você vai precisar regerar o client e copiar na sua app X (mas imagine que você tenha 100 aplicações utilizando este client… pode ter um trabalhão pra controlar isso…)