Paralelismo e EJB3.0

9 respostas
MaYaRa_SaN

Oi pessoal,

Espero que alguém possa me ajudar porque já estou a 2 dias pesquisando e não consegui encontrar uma solução ainda.

Meu problema é o seguinte:

Tenho uma aplicação que está usando o EJB3.0 e há uma rotina que faz leitura de arquivos, quebra esses arquivos em menores e salva os mesmos em banco, isso eu consegui fazer com Threads para que seja mais rápido já que a inserção no banco eu era obrigada a fazer no final desse processamento.

No entanto, depois disso, o sistema pega esses arquivos salvos, faz algumas verificações (consulta no banco), monta os obj com os dados do arquivo e salva essa informações em outras tabelas da base. Meu problema é esse… como ele precisa usar os EJBs pra manipular o banco, não consigo colocar esse processamento em uma classe simples que apenas implemente o Runnable porque a injeção dos EJBs que preciso não funciona… quando rodo a aplicação, ao tentar acessar o EJB ele está nulo.

Sou iniciante em EJB e por isso estou com bastante dificuldade de entender como fazer esse paralelismo.

Alguém já passou por isso ou conhece alguma referencia para que eu possa dar uma olhada e tentar entender?

Obrigada galera.

9 Respostas

I

Talvez uma solução para conseguir esse processamento paralelo seria usar JMS (fila).
Você coloca na fila as mensagens e para pegarlas vc usa MDBs.

Ferryman

Olá Mayara,

Na verdade, não é recomendável utilizar threads na mão em um servidor de aplicação. Para utilizar paralelismo em um ambiente ejb3, utilize JMS com Message Driven Beans. JMS serve para processamento assincrono e paralelo, e injeções de dependência funcionam nele normalmente.

Quando você quiser utilizar algum EJB em uma classe em que o container não faz injeção automática, é possível “pegar” uma referência para o EJB manualmente, através da classe InitialContext.
new InitialContext().lookup("[nome do ejb no JNDI]").

[]s

MaYaRa_SaN

Obrigada pela ajuda Italivio e Ferryman,

vou dar uma pesquisada nos conceitos de JMS e MDB pra entender como implementar isso.

Se vocês conhecerem um material legal, que uma iniciante no assunto consiga entender, eu ficarei muito grata!

Abraços.

MaYaRa_SaN

Ótimo material que encontrei falando sobre o que eu preciso:

http://www.cefetrn.br/~fellipe/lib/exe/fetch.php?id=disc%3Atds%3A20072%3Apiii&cache=cache&media=disc:tds:20072:parte_4_message_driven_bean.pdf

I

Tem o livro EJB 3 em Ação, que utilizei para aprender.
O material que você citou também é ótimo.
E qualquer dúvida vai postando aí que a gente vai dando as dicas.

Ok!

MaYaRa_SaN

Obrigada pela indicação Italivio,

há também um material legal no próprio site da Oracle que encontrei hoje pela manhã:

http://download.oracle.com/javaee/1.4/tutorial/doc/JMSJ2EEex2.html

Abraços.

MaYaRa_SaN

Olá galera,

Consegui resolver meu problema com o JMS e ficou show, agradeço a ajuda de vocês.

No entanto, gostaria de migrar a parte que eu havia feito com Threads para JMS também e é aí que está minha dúvida…

o problema é o seguinte:

Tenho vários arquivos com informações do estado inteiro e gero arquivos menores agrupando os dados por municipios. Isso ele já está fazendo mas o que preciso é que meu sistema faça essa quebra de arquivos de forma paralela e só quando terminar de processar um arquivo estadual, eu possa salvar os arquivos municipais na base.
Com threads eu usei o join() para que ele fique esperando terminar antes de salvar na base… com JMS, como faço para meu programa principal aguardar um retorno dessa mensagem assíncrona?

Espero ter explicado de uma forma clara… ehehe

Agradeço a ajuda de vocês desde já.

MaYaRa_SaN

Busquei mais alguns materiais que explicassem com maiores detalhes as questões dos Session Beans, MDB … e pelo que entendi, quando uso JMS e MDB estou trabalhando com processamento totalmente assíncrono, eu envio a mensagem e o MDB processa pra mim de forma independente.

Sendo assim, não há a possibilidade de fazer uma espécie de “thread.join()” nessas mensagens.

Pra eu poder processar coisas independentes mas aguardar o retorno eu teria que chamar um SessionBean statefull?

É mais ou menos isso ou estou viajando?

I

Pelo que entendi você particiona o arquivo, onde cada parte passa a ser uma mensagem que é enfileirada e consumida por um MDB.
Algumas considerações :

  • No servidor de aplicação, você terá um pool de MDBs, ou seja cada mensagem poderá ser processada por um MDB diferente;
  • Outro detalhe “não há garantia que a primeira mensagem será a primeira a ser processada pelo MDB”;
  • O cliente que enfilera a mensagem não recebe nenhuma informação de quando a mensagem foi processada;
    Neste caso, eu não vejo como Session Bean StateFull possa te ajudar.
    A saída que eu vejo seria você implementar algum controle que permitisse vc saber quando todas mensagens foram processadas.
    Por exemplo : Utilizar uma tabela de BD para registrar o controle das partes que foram processadas. Não sei se isto ficaria muito complicado para
    o seu caso, mas é a única solução que vejo neste momento.
Criado 29 de julho de 2011
Ultima resposta 6 de ago. de 2011
Respostas 9
Participantes 3