jms lazy mdb Design pattern
bdevis May 14, 2007 4:28 PMHi, to all
i have this scenario
1)I have my entity with many collection (Lazy association)
2)This is my mdb
public class LoginRequest implements MessageListener { public LoginRequest() { } public void onMessage(Message message) { try { Clienti _msg = (Clienti) ((ObjectMessage)message).getObject(); System.out.println("MessageBean onMessage" +_msg.getNome()); ClientiFacadeLocal facade=(ClientiFacadeLocal)CachingServiceLocator.getInstance().getLocalHome(ClientiFacade.class); Clienti _cli=facade.findByName(_msg.getNome()); System.out.println("onMessage toString "+_cli.toString()); if(_cli!=null) Send(_cli); } catch (Exception e) { System.err.println("Exception in SimpleMessageBean"); e.printStackTrace(); } } public void Send(Clienti vo){ try { System.out.println("-->>"); TopicConnectionFactory connectionFactory; Topic queue; TopicSession session; Hashtable environment = new Hashtable(); environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); environment.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); // remote machine IP InitialContext ctx = new InitialContext(environment); Object obj = ctx.lookup("topic/VdeResponseLoginQueue"); //ejb-name System.out.println("-->> lookup object successfully"); queue = (Topic) obj; connectionFactory=(TopicConnectionFactory) ctx.lookup("/TopicConnectionFactory"); TopicConnection connection = connectionFactory.createTopicConnection(); session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); connection.start(); ObjectMessage message = session.createObjectMessage(); System.out.println("Ho ricevuto l'ordine da te ora "+vo.getNome()); message.setObject(vo); message.setJMSCorrelationID(vo.getNome()); System.out.println("Preparato message per "+vo.getCognome()+" "+vo.getNome()); MessageProducer messageProducer = session.createProducer(queue); messageProducer.send(message); session.close(); connection.close(); connection=null; } catch (Exception e) { System.out.println("Errroe in sendMessage "+e.getMessage()); e.printStackTrace(); } } } this is my Session Facade @Stateless //@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class ClientiFacade implements ClientiFacadeLocal,ClientiFacadeRemote { @PersistenceContext() private EntityManager em; //private EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("NuovVdeUN"); //EntityManager em = entityManagerFactory.createEntityManager(); /** Creates a new instance of ClientiFacade */ public ClientiFacade() { } public void create(Clienti clienti) { em.persist(clienti); } public void edit(Clienti clienti) { em.merge(clienti); } public void destroy(Clienti clienti) { em.merge(clienti); em.remove(clienti); } public Clienti find(Object pk) { return (Clienti) em.find(Clienti.class, pk); } public List findAll() { return em.createQuery("select object(o) from Clienti as o").getResultList(); } public Clienti findByName(String nome) { Clienti id=(Clienti) em.createNamedQuery("Clienti.findByNome").setParameter("nome",nome).getSingleResult(); return em.getReference(Clienti.class, id.getIdcliente()); } }
my client
public class TestTopic { public TestTopic() { } public void Send(String cosa){ try { System.out.println("-->>"); TopicConnectionFactory connectionFactory; Topic queue; TopicSession session; Hashtable environment = new Hashtable(); environment.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); environment.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); environment.put(Context.PROVIDER_URL, "jnp://127.0.0.1:1099"); // remote machine IP InitialContext ctx = new InitialContext(environment); Object obj = ctx.lookup("topic/VdeResponseLoginQueue"); //ejb-name System.out.println("-->> lookup object successfully"); queue = (Topic) obj; connectionFactory=(TopicConnectionFactory) ctx.lookup("/TopicConnectionFactory"); TopicConnection connection = connectionFactory.createTopicConnection(); session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); connection.start(); ObjectMessage message = session.createObjectMessage(); ClientiFacadeRemote facade=(ClientiFacadeRemote)CachingServiceLocator.getInstance().getRemoteHome(ClientiFacade.class); Clienti vo=facade.findByName(cosa); System.out.println("Ho ricevuto l'ordine da te ora "+vo.getNome()); System.out.println("Tarifa "+vo.getIdtariffa().getIdtariffa()); System.out.println("Lingue "+vo.getLingua().getStringa()); System.out.println("DVD Collection 9 "+vo.getLingua().getDvdCollection9().size()); message.setJMSCorrelationID(vo.getNome()); message.setObject(vo); System.out.println("Preparato message per "+message.getJMSCorrelationID()+" "+vo.getCognome()); MessageProducer messageProducer = session.createProducer(queue); messageProducer.send(message); session.close(); connection.close(); connection=null; } catch (Exception e) { System.out.println("Errroe in sendMessage "+e.getMessage()); e.printStackTrace(); } } public static void main(String args[]){ TestTopic t = new TestTopic(); t.Send("devis"); } }
When my client call
vo.getLingua().getDvdCollection9().size()
throw this error
Errroe in sendMessage failed to lazily initialize a collection of role: vde.com.ejb.vo.Lingue.dvdCollection9, no session or session was closed
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: vde.com.ejb.vo.Lingue.dvdCollection9, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
at org.hibernate.collection.PersistentBag.size(PersistentBag.java:225)
I have read about "Open Session in View" and AOP solution ... but i'dont use web app i have some Flex/Apollo (Adobe) application.
I have used also, PersistenceContext Extended, Transaction NOT_SUPPORTED etc.
Can you help me how i can design this scenario? i'm disperate... how i can use my Lazy Collection....?
Thanks in advance
Devis