[ RESOLVIDO ] - Passando um Objeto para o MDB

Tem como passar um objeto para um MDB consumir da fila? Sendo que, eu não queria usar nenhum framework, estou falando isso porque achei na net algumas coisas usando o XStream.
Estou usando o Glassfish V3, java 6, ejb 3.1.
Abaixo segue um exemplo:

...
public void onMessage(Message message){
 ObjectRemote obj = ( ObjectRemote ) message;
}...

[quote=Jedi_FeniX]Tem como passar um objeto para um MDB consumir da fila? Sendo que, eu não queria usar nenhum framework, estou falando isso porque achei na net algumas coisas usando o XStream.
Estou usando o Glassfish V3, java 6, ejb 3.1.
Abaixo segue um exemplo:

... public void onMessage(Message message){ ObjectRemote obj = ( ObjectRemote ) message; }... [/quote]

Não entendí muito bem a pergunta, mas acho que você quer isso:

ObjectMessage msg = (ObjectMessage) message;
ObjectRemote obj = (ObjectRemote)msg.getObject();

[]´s

Mas como o meu projeto ejb vai ver uma classe que não existe nele? O ObjectRemote está em war que fica enviando esses objetos para a fila, por exemplo.

Você tem que ter um Jar para clientes (como qualquer projeto EJB).

[]´s

Eu tenho que colocar o meu war dentro do projeto ejb? êh isso?
Desculpe a ignorÂncia, estou começando agora em projetos ejbs.

[quote=Jedi_FeniX]Eu tenho que colocar o meu war dentro do projeto ejb? êh isso?
Desculpe a ignorÂncia, estou começando agora em projetos ejbs.[/quote]

Fica mais ou menos assim…

  1. Os objetos do seu domínio ficam num JAR à parte do seu projeto WAR.
  2. Seu WAR (que, a rigor, não deveria fazer o envio da mensagem) referencia esse JAR.
  3. Os clientes da fila JMS também referenciam esse JAR.
  4. Quando um cliente precisar acessar a mensagem, ele deve estar usando a mesma versão do JAR de domínio que o WAR.
  5. Se isso for causar exposição excessiva do seu objeto para os clientes, crie DTOs e coloque-os nesse JAR, ao invés dos próprios objetos de domínio.

Acho que é isso… qualquer coisa, só perguntar aí :wink:

[]´s

Por que você colocou isso? Como eu iria popular a fila? Teria que ser no meu projeto ejb mesmo?

[quote]
…que, a rigor, não deveria fazer o envio da mensagem…[/quote]

[quote=Jedi_FeniX]Por que você colocou isso? Como eu iria popular a fila? Teria que ser no meu projeto ejb mesmo?

Sim, seria melhor você criar um ejb-jar para fazer o envio da mensagem (já que você tem recursos de, por exemplo, criar a conexão de acordo com o tópico, e esse tipo de coisa é gerenciada por um contêiner EJB).

[]´s

Cara agradeço a ajuda que você está me dando está sendo de grande importância, mas as coisas ainda estão meio confusas na minha cabeça.
Vou colocar aqui uma aplicação que eu desenvolvi e queria portar ela para ejb, para estudar como se fosse o dia a dia mesmo.
A aplicação ela fica de segundo em segundo verificando o banco e dependendo do que a query retornar ela dispara uma thread que fica populando uma fila, que foi feita em Vector, por ser thread-safe.
Ai para consumir esta fila eu disparo várias threads que vão fazendo requests, por socket, e tirando os objetos da fila e estas threads atualizam o banco.

Eu vi que eu re-inventei a roda… huahauauhauha
Porque isso é o que o App Server faz e ainda existe o MDB para ajudar . Agora o que está me deixando confuso é aonde as coisas se encaixam?
Por exemplo aonde ficaria a classe que vai ficar verificando o banco de segundo em segundo, sendo que, na outra aplicação eu usei o quartz que facilitou a minha vida, ele mesmo gerava a thread de segundos em segundos.
Aonde ficaria o MDB? Em um projeto separado da classe anterior? E se quisesse ter um web service seria outro projeto? Sendo que dentro destes projetos eu teria que ter vários persistence.xml do jpa?

Aproveitando você teria alguns artigos para me ajudar?

[quote=Jedi_FeniX]Cara agradeço a ajuda que você está me dando está sendo de grande importância, mas as coisas ainda estão meio confusas na minha cabeça.
Vou colocar aqui uma aplicação que eu desenvolvi e queria portar ela para ejb, para estudar como se fosse o dia a dia mesmo.
A aplicação ela fica de segundo em segundo verificando o banco e dependendo do que a query retornar ela dispara uma thread que fica populando uma fila, que foi feita em Vector, por ser thread-safe.
Ai para consumir esta fila eu disparo várias threads que vão fazendo requests, por socket, e tirando os objetos da fila e estas threads atualizam o banco.

Eu vi que eu re-inventei a roda… huahauauhauha
Porque isso é o que o App Server faz e ainda existe o MDB para ajudar . Agora o que está me deixando confuso é aonde as coisas se encaixam?
Por exemplo aonde ficaria a classe que vai ficar verificando o banco de segundo em segundo, sendo que, na outra aplicação eu usei o quartz que facilitou a minha vida, ele mesmo gerava a thread de segundos em segundos.
Aonde ficaria o MDB? Em um projeto separado da classe anterior? E se quisesse ter um web service seria outro projeto? Sendo que dentro destes projetos eu teria que ter vários persistence.xml do jpa?

Aproveitando você teria alguns artigos para me ajudar?[/quote]

Olha só…

Você tem dois pontos principais: um criador de mensagens e um consumidor, certo? Sua receita de bolo deveria (favor ler minha assinatura!) ficar assim:

  1. JAR com objetos que você deseja trafegar.
  2. WAR com Servlets e JSPs. (utiliza 1 e 3)
  3. EJB-JAR responsável pela criação de mensagens. (utiliza 1)
  4. EJB-JAR responsável pelo consumo de mensagens. (utiliza 1)

Em 2, você faz invocações para 3. 3 contém a lógica para fazer o envio da mensagem (e deve ficar num EJB-JAR porque quem gerencia filas é o contêiner EJB).

4 vai conter alguns MDBs (gerenciados pelo contêiner) que vão ler as filas e fazer o processamento das mensagens.

Quanto à especificação que você passou, algumas considerações:

  1. A leitura dos dados do banco está correta. Não há maneira de checar o banco somente quando algo for feito nele, você deve checar de tempos em tempos. Pra isso, recomendo o Quartz mesmo, mas até a API do Java, com TimerTask, serve.

  2. A leitura dos dados da fila não poderia estar mais errada. Você não deve, em hipótese alguma, checar a fila com sockets. Use MDBs!

  3. O persistence.xml deve ficar em todos os projetos que têm acesso a banco. Se esse banco é o mesmo ou não … whatever. O que pode ser feito é você criar outro JAR que vai conter a lógica de acesso ao banco, e fazer com que esse JAR seja referenciado pelos outros.

  4. No caso de webservices, a coisa muda completamente de figura. Você não tem praticamente dor de cabeça nenhuma (até um Tomcat da vida pode expor um web service). Então, você pode criar ele em qualquer lugar (respeitando, claro, os princípios de arquitetura).

[]´s

Cara você tirou várias nuvens e tempestades que existiam na minha cabeça… huahauhauha
Agora é pesquisar. Vou tentar usar a classe TimerTask em vez do quartz.
E outra coisa eu consigo fazer injections sem o spring dentro do glassfish?

[quote=Jedi_FeniX]Cara você tirou várias nuvens e tempestades que existiam na minha cabeça… huahauhauha
Agora é pesquisar. Vou tentar usar a classe TimerTask em vez do quartz.
E outra coisa eu consigo fazer injections sem o spring dentro do glassfish?[/quote]

Com EJB você consegue fazer alguns tipos de injeção… Qual o caso desse Spring? Se ele não vai estar no glassfish, vai estar onde?

[]´s

Ele estava no outro projeto e ele me ajudava com o quartz, commons-configuration, controle transacional e com as minhas DAOs.
Seria interessante usá-lo ele dentro do glassfish? Teve uma vez que eu vi um artigo, não lembro aonde, que não seria interessante usar um app server com spring, porque o app server já faz muita coisa que o spring faz. Isso procede?

[quote=Jedi_FeniX]Ele estava no outro projeto e ele me ajudava com o quartz, commons-configuration, controle transacional e com as minhas DAOs.
Seria interessante usá-lo ele dentro do glassfish? Teve uma vez que eu vi um artigo, não lembro aonde, que não seria interessante usar um app server com spring, porque o app server já faz muita coisa que o spring faz. Isso procede?[/quote]

É fato. EJB tem um mecanismo de injeção, mas Spring tb. EJB tem um temporizador, o Spring também… Isso dá longas discussões. Mas até aí, você decide o que fazer. É perfeitamente possível dispensar os recursos do app server para usar o Spring, bem como o contrário. Eu, particularmente, prefiro o Spring, mas isso vai de cada um…

[]´s

É eu também gosto muito do Spring ele auxilia muito no desenvolvimento. E estou muito inclinado a continuar usar ele mesmo usando um app server.
E esses projetos que você falou anteriormente, eu tenho que empacotá-los dentro de um ear, certo?

[quote=Jedi_FeniX]É eu também gosto muito do Spring ele auxilia muito no desenvolvimento. E estou muito inclinado a continuar usar ele mesmo usando um app server.
E esses projetos que você falou anteriormente, eu tenho que empacotá-los dentro de um ear, certo?[/quote]

De preferência!

[]´s