Call Ejb Tomcat Glassfish

Supponendo di avere a che fare con un applicazione J2EE articolata a “Componenti” basata sul pattern del MVC (Model View Controller) realizzata con un layering similare a quello riportato in figura è interessate vedere come effettuare chiamate a metodi remoti deployati su di un altro server, ossia una “Call Ejb Tomcat Glassfish”.

strati web application

Layering J2EE per una Web Application


Nella struttura a componenti abbiamo vari livelli:
1. I componenti comunicano con i servizi mediante le interfacce;
2. I servizi vengono realizzati mediante una cosiddetta astrazione, dove le varie funzionalità di un services sono riepilogate in una interfaccia;
3. Livello di modello con il quale si prevedono le entità dell’intera struttura;
4. Sezione di view, ossia interazione con il client.

Lo scenario preso in esame è il seguente:
In questa struttura abbiamo delle chiamate a metodi remoti da parte della web application, essa risiederà su Tomcat, mentre gli EJB (Enterprise Java Bean) che sono lo strato che permetteno la comunicazione con la base di dati risiedono su Glassfish, pertanto sarà opportuno definire una procedura di chiamata degli ejb dalla web application, tale chiamata è detta chiamata JNDI (Java Naming Directory).

1 STEP: PARAMETRI DI CONFIGURAZIONE
Per le chiamate a metodi remoti si sono definiti nella factory del progetto (seguendo il pattern Singleton), chiamata dal ServletContextListener, dei parametri per l’inizializzazione della chiamata degli Enterprise Java Bean che risiedono su Glassfish mediante le seguenti righe di codice.

public class FactoryEjb extends BusinessFactory {
	private Properties properties = new Properties();
 
	public VideoshockFactoryEjb() {
		super();
		this.properties.setProperty("java.naming.factory.initial",
				"com.sun.enterprise.naming.SerialInitContextFactory");
		this.properties.setProperty("java.naming.factory.url.pkgs",
				"com.sun.enterprise.naming");
		this.properties.setProperty("java.naming.factory.state",
				"com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
		this.properties
				.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
		this.properties.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
	}
....
}

Dopo aver definito l’oggetto Properties a livello di classe, sarà opportuno sostituire i service della logica di business del progetto J2EE con le interfacce remote degli EJB.
Poi per l’effettiva chiamata sarà utilizzata la risorsa jndi del rispettivo ejb che si vuole invocare, si riporta a tal proposito un semplice esempio.

2 STEP: INVOCAZIONE RISORSA JNDI

	@Override
	public UserServiceRemote getUserService() {
		InitialContext context;
		try {
			context = new InitialContext(this.properties);
			String jndiName = 
                "java:global/videoshock-hibernate-ear/videoshock-hibernate-ejb/UserServiceHibernate";
			UserServiceRemote userService = (UserServiceRemote) context
					.lookup(jndiName);
			return userService;
		} catch (NamingException e) {
			e.printStackTrace();
			return null;
		}
	}

Quindi per il singolo services remoto sarà invocato dalle Servlet basterà chiamare il metodo dell’interfaccia remota nella seguente maniera:

SecurityServiceRemote service = VideoshockFactory.getInstance().getSecurityService();
Utente user = service.authenticate(args);

Chiaramente tutto ciò va effettuato dopo aver suddiviso le logiche e vi sarà quindi un progetto contenente il “model”, la “web-app” e il progetto ejb e aver impacchettato il model e gli ejb nel EAR (Enterprise Application Project).

Riportiamo di seguito anche la strutturazione dell’EJB remoto SecurityServiceRemote.

EJB Remoto SecurityServiceRemote.java

@Remote
public interface SecurityServiceRemote {
 
	Utente authenticate(String username);
 
}

Implementazione EJB Remoto SecurityServiceRemote.java

@Remote(SecurityServiceRemote.class)
@Stateless
public class SecurityServiceHibernate implements SecurityServiceRemote {
 
	@Resource(name = "videoshock")
	SessionFactory sessionFactory;
 
 
	/**
	 * Constructor per il client.
	 */
	public SecurityServiceHibernate() {
		new Configuration().configure().buildSessionFactory();
	}
 
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public Utente authenticate(String strUsername) throws BusinessException {
		// Utente da restituire per la login.
		Utente resultUtente = null;
		Session session = sessionFactory.openSession();
		resultUtente = (Utente) session
				.createQuery(
					"select u from Utente u "
					+ "left join fetch u.ruoli ur left join fetch ur.permessi "
					+ "left join fetch u.noleggi "
					+ "where u.username = :username")
				.setString("username", strUsername).uniqueResult();
		return resultUtente;
	}
 
}

3 STEP: LIBRERIE DA INCLUDERE
Affinchè il tutto funzioni è necessario importare determinate librerie di Glassfish nella web application eseguita su Tomcat, le librerie da importare le troverete nella cartella …\glassfish3\glassfish\modules della vostra installazione di Glassfish.
Le librerie da includere nel Build Path dell’applicazione sono le seguenti:
javax.ejb.jar
ejb-container.jar
deployment-common.jar
dol.jar
glassfish-corba-csiv2-idl.jar
glassfish-corba-codegen.jar
ssl-impl.jar
security.jar
ejb.security.jar
management-api.jar
gmbal.jar
glassfish-corba-asm-jar
glassfish-corba-newtimer.jar
glassfish-corba-orbgeneric.jar
bean-validator.jar
config-types.jar
kernel.jar
config.jar
config-api.jar
glassfish-corba-omgapi.jar
glassfish-corba-orb.jar
orb-connector.jar
orb-enabler.jar
orb-iiop.jar
glassfish-api.jar
auto-depends.jar
hk2-core.jar
internal-api.jar
common-util.jar
glassfish-corba-internal-api.jar
glassfish-naming.jar

Per ulteriori delucidazioni è possibile consultare anche il seguente link: http://edwin.baculsoft.com/2010/09/a-simple-java-client-server-application-using-ejb3-and-glassfish3/.

Call Ejb Tomcat Glassfish ultima modidfica: 2013-12-30T18:44:49+01:00 da admin
Posted in: Java

By on 30 Dicembre 2013

Tagged: , , , , , ,