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