EJB Session Staleless: cosa sono
Gli EJB Session Bean sono delle classi con dei metodi invocabili da remoto (semplificando molto possiamo dire che sono come le servlet, ma le servlet hanno solo due metodi doget e dopost, i session invece possono avere tutti i metodi che vogliamo). Sono composti da una classe e due interfacce. Per poter invocare un EJB Session bisogna avere una delle interfacce. Le interfacce sono dette locali o remote, in basa a dove permettono di richiamare il session. Da remoto vengono utilizzati i protocolli distribuiti come RMI-IIOP (Remote Method Invocation o RMI è una tecnologia che consente l’invocazione remota dei metodi);
Gli EJB Session sono transazionali, ossia permettono di gestire le transazioni.
Esistono due tipi di session bean:
- stateful: viene memorizzato lo stato fra una richiesta e l’altra del client, ossia garantisce che tutti i campi dell’EJB Session saranno salvati per la successiva richiesta dello stesso client.
- stateless: non viene mantenuto alcun stato e vengono utilizzati per modellare quelle elaborazioni che si completano con una sola richiesta
EJB Session Staleless: esempio
HelloStateless.java
[java]
package com;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
/**
* Session Bean implementation class HelloStateless
*/
@Stateless
@LocalBean
public class HelloStateless implements HelloStatelessRemote, HelloStatelessLocal {
/**
* Default constructor.
*/
public HelloStateless() {
// TODO Auto-generated constructor stub
}
public String prova()
{
System.out.println(“chiamato metodo”);
return “hello”;
}
}
[/java]
In HelloStateless.java è definita la logica di business del metodo (ossia “prova()”) che vogliamo esporre.
HelloStatelessLocal.java
[java]
package com;
import javax.ejb.Local;
@Local
public interface HelloStatelessLocal {
public String prova();
}
[/java]
HelloStatelessRemote.java
[java]
package com;
import javax.ejb.Remote;
@Remote
public interface HelloStatelessRemote {
public String prova();
}
[/java]
HelloStatelessRemote.java e HelloStatelessLocal.java sono le due interfacce (Locale e Remota) dell’EJB Session. Avendo definito il metodo “prova()” in entrambe sarà visibile sia in locale che in remoto.
Prova.java
[java]
package com.servlet;
import java.io.IOException;
import java.util.Properties;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.HelloStatelessLocal;
import com.HelloStatelessRemote;
/**
* Servlet implementation class Prova
*/
@WebServlet(“/Prova”)
public class Prova extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
private HelloStatelessLocal beanStateless;
@Resource(mappedName = “java:jboss/exported/HelloWorldEJBSession/HelloStateless!com.HelloStatelessRemote”)
private HelloStatelessRemote ejbTestCase;
/**
* @see HttpServlet#HttpServlet()
*/
public Prova() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//1° modo
// beanStateless.prova();
// 2° modo di chiamare ejb
ejbTestCase.prova();
response.getWriter().append(“Served at: “).append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
public static void main(String[] args) {
try {
Properties jndiProperties=new Properties();
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, “org.jboss.naming.remote.client.InitialContextFactory”);
jndiProperties.put(Context.PROVIDER_URL, “http-remoting://127.0.0.1:8080”);
jndiProperties.put(Context.SECURITY_PRINCIPAL, “username”);
jndiProperties.put(Context.SECURITY_CREDENTIALS, “password”);
jndiProperties.put(“jboss.naming.client.ejb.context”, true);
Context context=new InitialContext(jndiProperties);
String jndi = “HelloWorldEJBSession/HelloStateless!com.HelloStatelessRemote”;
HelloStatelessRemote ee = (HelloStatelessRemote) context.lookup(jndi);
String i = ee.prova();
System.out.println(“chiamata da main:”+i);
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
[/java]
Prova.java è la servlet che rappresenta, in questo esempio, il client per invocare un EJBSession.
L’invocazione avviene nei tre possibili modi:
- @EJB, annotation utilizzabile solo per gli EJB.
- @Resouce(mappedName=…..) utilizzabile per l’invocazione di qualsiasi oggetto iniettabile.
- Metodo standard (nel main) ossia tramite invocazione JNDI