1 Reply Latest reply on May 15, 2007 2:37 AM by bdevis

    jms lazy mdb Design pattern

    bdevis

      Hi, 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


        • 1. Re: jms lazy mdb Design pattern
          bdevis

          i have made mistake in my post code

          public Clienti findByName(String nome) {

          Clienti id=(Clienti) em.createNamedQuery("Clienti.findByNome").setParameter("nome",nome).getSingleResult();
          return em.getReference(Clienti.class, id.getIdcliente());
          }



          public Clienti findByName(String nome) {

          return em.createNamedQuery("Clienti.findByNome").setParameter("nome",nome).getSingleResult();

          }


          pls have you some suggestion
          Devis