Pergunta sobre EJB

12 respostas
rodrigo.bossini

Pessoal,

Estou começando a estudar EJB.

Na verdade estou fazendo isso pois pretendo descobrir se posso utilizá-lo na empresa.

Hoje, temos uma aplicação que acessa N servidores FTP e baixa arquivos para as N pasta locais correspondentes. Ela faz uploads também. Cada servidor FTP pertence a um cliente específico, logo esta tem que ser uma aplicação multithreaded. E ela é. É uma aplicação que gerencia múltiplas threads, uma para cada servidor. Utilizamos a api de FTP da apache para fazer as operações de FTP.

O que pergunto é:

Se fosse desenvolver esta mesma aplicação utilizando EJB, uma das vantagens seria o gerenciamento multithread que o EJB proporciona?

Por exemplo, as atividades que passo para o método run das minhas threads hoje, eu passaria para o EJB e o mesmo executaria várias threads, uma para cada configuração que eu passar?

Outra coisa: Eu gostaria que este fosse um sistema transacional. Todos os downloads e uploads são registrados em banco. E logo depois de o registro ter sido gravado, o arquivo baixado é apagado do servidor FTP. Eu gostaria de garantir que, por exemplo, o arquivo só fosse apagado se o mesmo tivesse sido baixado e registrado no banco. Creio que isso seja um comportamento transacional, não? Se ocorrer alguma exceção, hoje, é possível que o arquivo seja baixado e salvo em banco, mas nunca deletado. O EJB me garantiria isso também?

Mais uma outra coisa: Em breve precisarei desenvolver um sistema especialista em envio e download de email. Como este serviço FTP que mencionei, ele também precisará ser multithreaded. Seria recomendável desenvolver um sistema assim em EJB?

12 Respostas

Foxlol

É cara, o EJB já faz tudo isso pra vc mesmo! Aí vc pode focar mais na parte de negócio.

Concorrência e Controle Transacional são serviços primários da tecnologia.

Abraços.

rodrigo.bossini

Foxlol:
É cara, o EJB já faz tudo isso pra vc mesmo! Aí vc pode focar mais na parte de negócio.

Concorrência e Controle Transacional são serviços primários da tecnologia.

Abraços.

Hehehe, pois é, essa parte que explica os serviços primários da tecnologia eu também já li no livro.

O que preciso é algo prático, comentando o problema que citei acima.

bruno.fantin

Dar para fazer isso.

Mas a questão aqui é, como você vai chamar os EBJs?

Por padrão os EJBs ficam quietinho no servidor até serem requisitados. Se você tiver uma aplicação web aonde seus clientes são requisitar o download dos arquivos, ai naturalmente tudo vai acontecer em modo multi-thread. Porém se for apenas uma aplicação desktop que chama, ai você vai ter de qualquer forma implementar o suporte multi-thread, pois quando você requisitar o primeiro EBJ, só vai poder requisitar o segundo quando esse terminar.

Soluções:

    • Usar a nova tecnologia de metodos assíncronos do EJB 3.1 (Nunca usei, não sei te dizer se funciona legal);
    • Usar JMS (Eu recomendaria isso)
    • Criar na aplicação desktop suporte para chamar varios EJBs em thread diferentes.

Uma outra solução, a se pensar, seria usar algum esquema com agendamento para chamar os EBJs.

Sobre a transação, ela é garantida no banco de dados, mas meio complicada em arquivos de disco. Se você deixar o servidor controlar a transação, ele só vai commitar se nenhuma excessão for lançada, em teoria se der erro ao apagar o arquivo no ftp, ele vai cancelar tudo que foi feito no banco. Mas leia bem, em teoria, pois já vi casos aonde o ftp diz que deletou o arquivo e não pagou coisa nenhuma.

Espero ter ajudado.

Falou.

rodrigo.bossini

Eu havia pensado em usar o serviço de Timer do próprio EJB, que, segundo o livro que mencionei, também se trata de um serviço primário. Se entendi bem, este serviço funciona de forma similar ao ScheduledThreadPoolExecutor do java SE, que já estou acostumado a usar.

G

Mas você quer manipular arquivos usando EJB?

EJB não é para isso não. Aliás uma das violações da especificação EJB fiz que você não pode manipular arquivos e streams. Para fazer upload e download você precisa trabalhar com streams, porém isso vai contra a especificação.

Dê uma olhada nesse link, onde é explicado cada uma das restrições: http://java.sun.com/blueprints/qanda/ejb_tier/restrictions.html

A idéia não apenas o EJB mas do JEE é você trabalhar com seu código sem precisar se preocupar com infraestrutura. Você quer usar N clusters? Ok, EJB permite isso e você não precisa fazer nada, ele faz isso. Você precisa de transação? JTA cuida disso para você.

Mas a sua idéia me pareceu um equivoco, pois não notei uma razão do uso de EJB. Os controles que você quer, por exemplo, apenas excluir arquivos quando inseridos no banco com sucesso, você pode fazer um controle manual, pois não há como ter uma “transação XA entre arquivos”, pelo menos não que eu conheça.

Obvio, peço desculpas se por acaso pareci um pouco rispido. Não é a intenção. Talvez eu não tenha entendido muito bem sua dúvida, mas pelo que entendi o EJB não servirá de nada a você nesse caso.

Abraços

B

Bom, como mencionado acima EJBs não devem manipular arquivos, nem threads, isso pode atrapalhar funcionalidades do componente…(existem outras contra indicações tbm como sobrescrever finalize, ter membros estáticos…), por isso vc terá que analizar melhor se essa será uma solução boa para o seu contexto…

Em relação a controle transacional os componentes de negócio são bem legais…Implicitamente vc terá transações gerenciadas pelo container, sem vc ter que codificar absolutamente nada em seu Bean, apenas terá que chamar uma ação de persistência através do EntityManager…

Isso mesmo, o TimerService é um serviço disponibilizado pelo container JEE para agendar suas tarefas, na especificação 3.0 vc anota métodos com @TimeOut ou implementa TimedObject, já na especificação 3.1 existem novas formas, vc terá que olhar a documentação…

espero ter te ajudado…

rodrigo.bossini

E quanto a uma aplicação especialista em envio de emails?

B

Aí tudo bem… Vc pode utilizar JMS…

rodrigo.bossini

breno500as:
“rod.attack”:

E quanto a uma aplicação especialista em envio de emails?

Aí tudo bem… Vc pode utilizar JMS…

Só que a ideia é a aplicação enviar e baixar emails. Pra isso ela vai manipular arquivos…

B

Bom, vc pode utilizar JMS fora de um componente EJB se necessita tanto de fazer essas manipulações de arquivos…

rodrigo.bossini

Eu não necessito “tanto”. Pra enviar um email, supondo que o mesmo tenha um anexo, eu vou precisar manipular arquivos. Pra baixar emails (e obviamente salvá-lo em algum lugar) também vou precisar manipular arquivos.

rodrigo.bossini

Alguém mais tem mais sugestões e ideias sobre o problema que postei originalmente no tópico?

Criado 3 de fevereiro de 2010
Ultima resposta 3 de fev. de 2010
Respostas 12
Participantes 5