1 4 package com.nightlabs.ipanema.asyncinvoke; 5 6 import javax.jms.ObjectMessage ; 7 import javax.naming.InitialContext ; 8 import javax.naming.NameNotFoundException ; 9 import javax.security.auth.login.LoginContext ; 10 11 import org.apache.log4j.Logger; 12 13 import com.nightlabs.ipanema.servermanager.IpanemaServerManager; 14 import com.nightlabs.ipanema.servermanager.IpanemaServerManagerFactory; 15 import com.nightlabs.ipanema.servermanager.j2ee.SecurityReflector; 16 17 20 public abstract class AsyncInvokerBaseBean 21 implements javax.ejb.MessageDrivenBean , javax.jms.MessageListener 22 { 23 protected Logger logger = Logger.getLogger(this.getClass()); 24 25 protected javax.ejb.MessageDrivenContext messageContext = null; 26 27 31 public void setMessageDrivenContext( 32 javax.ejb.MessageDrivenContext messageContext) 33 throws javax.ejb.EJBException 34 { 35 this.messageContext = messageContext; 36 } 37 38 44 public void ejbCreate() 45 { 46 } 48 49 53 public void ejbRemove() 54 { 55 messageContext = null; 56 } 57 58 59 public void onMessage(javax.jms.Message message) 60 { 61 try { 62 if (!(message instanceof ObjectMessage )) { 63 logger.error("Message is not an instance of ObjectMessage: " + message); 64 return; 65 } 66 67 Object obj = ((ObjectMessage )message).getObject(); 68 if (!(obj instanceof AsyncInvokeEnvelope)) { 69 logger.error("Object wrapped in ObjectMessage is not an instance of AsyncInvokeEnvelope: " + message); 70 return; 71 } 72 73 InitialContext initCtxNotAuthenticated = new InitialContext (); 74 75 logger.info("*****************************************************************"); 76 logger.info("*****************************************************************"); 77 logger.info("*****************************************************************"); 78 79 long startDT = System.currentTimeMillis(); 82 IpanemaServerManagerFactory ismf = null; 83 do { 84 logger.info("-----------------------------------------------------------------"); 85 86 if (System.currentTimeMillis() - startDT > 5 * 60 * 1000) 87 throw new IllegalStateException ("IpanemaServerManagerFactory did not pop up in JNDI within timeout (hardcoded 5 min)!"); 88 89 try { 90 ismf = (IpanemaServerManagerFactory) initCtxNotAuthenticated.lookup(IpanemaServerManagerFactory.JNDI_NAME); 91 } catch (NameNotFoundException x) { 92 ismf = null; 94 } 95 96 if (ismf == null) 97 try { Thread.sleep(3000); } catch (InterruptedException x) { } 98 99 } while (ismf == null); 100 101 startDT = System.currentTimeMillis(); 102 do { 103 logger.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"); 104 105 if (System.currentTimeMillis() - startDT > 10 * 60 * 1000) 106 throw new IllegalStateException ("IpanemaServer did not start within timeout (hardcoded 10 min)!"); 107 108 if (!ismf.isUpAndRunning()) 109 try { Thread.sleep(3000); } catch (InterruptedException x) { } 110 111 } while (!ismf.isUpAndRunning()); 112 113 logger.info("*****************************************************************"); 114 logger.info("*****************************************************************"); 115 116 AsyncInvokeEnvelope envelope = (AsyncInvokeEnvelope) obj; 117 118 Invocation invocation = envelope.getInvocation(); 119 120 SecurityReflector.UserDescriptor caller = envelope.getCaller(); 121 LoginContext loginContext; 122 IpanemaServerManager ism = ismf.getIpanemaServerManager(); 123 try { 124 loginContext = new LoginContext ( 125 "ipanema", new AuthCallbackHandler(ism, envelope)); 126 127 135 loginContext.login(); 136 try { 137 AsyncInvokerDelegateLocal invokerDelegate = null; 138 139 try { 140 invokerDelegate = AsyncInvokerDelegateUtil.getLocalHome().create(); 141 } catch (Exception x) { 142 logger.fatal("Obtaining stateless session bean AsyncInvokerDelegateLocal failed!", x); 143 messageContext.setRollbackOnly(); 144 } 145 146 if (invokerDelegate != null) 147 doInvoke(envelope, invokerDelegate); 148 149 } finally { 150 loginContext.logout(); 151 } 152 153 } finally { 154 ism.close(); 155 } 156 157 } catch (Throwable x) { 158 logger.fatal("Processing message failed!", x); 159 messageContext.setRollbackOnly(); 160 } 161 } 162 163 protected abstract void doInvoke(AsyncInvokeEnvelope envelope, AsyncInvokerDelegateLocal invokerDelegate); 164 } 165 | Popular Tags |