4. Concept
EJB regroups several concepts
Provides different services (Session Bean),
communicates with another application (Message Bean),
saves information (Entity Bean).
Just like a brain, EJB is the
center of the application.
It proposes many functions.
5. Version 3
The previous version (2.1) was too complex
The version 3.0 tends to simplification :
Less steps, less classes, less configuration
Improvements from Java EE 5
Annotations
Generics
Java Persistance API
Concepts remain the same, but Sun integrated many ideas
from popular open-source projects like Spring or Hibernate.
6. Application servers
WebLogic, by BEA
Oracle Application Server, by Oracle
JBoss, by RedHat
GlassFish, by Sun MicroSystems
8. Facade pattern
The Session Bean acts as a “facade”.
It's the client's interlocutor
9. Client access
Different clients can call the Session Bean methods if they
possess its interface
Desktop application
Interface
Implementation
Session Bean deployed on a server
Web application
10.
11.
12. Session Bean Local
Set @Local on the interface (not mandatory)
Used when the client is deployed in the same virtual
machine
Example :
A Web application deployed in the same server as the
Session Bean
Advantage :
Resource-friendly
More secure
Disadvantage :
Local scope
13. Session Bean Local
Local interfaces are not mandatory
@Stateless
public class HelloServiceBean {
public String sayHello(){
return "Hello World";
}
}
14. Session Bean Remote
Set @Remote on the interface
Used when the client is located in a different virtual
machine
Example :
A web application deployed in a different server than the
Session Bean
A rich-client
Advantage :
Open on the network
Disadvantage :
Consumes more resources (uses RMI)
Security
15. Session Bean Remote
Interface
@Remote
public interface HelloService {
public String sayHello();
}
Implementation
@Stateless
public class HelloServiceBean implements HelloService{
public String sayHello(){
return "Hello World";
}
}
16. Stateless mode
A Stateless Bean is not bound to any client
Exemples :
Retrieve a list of
products
HelloService
getPlaces() getPlaces()
Advantage : getTrips()
Resource-friendly
17. Stateless mode
@Stateless
public class HelloWorld {
public String sayHelloTo(String name){
return "Hello " + name;
}
}
18. Stateful mode
A Statefull Bean is bound to a client
Exemples :
Cart
OrderService getPlaces()
getPlaces()
Advantage : getTrips()
Impact on server
performance
19. Stateful mode
@Stateful
public class OrderService {
public void setName(String name){…};
public void setAddress(String address){…};
public void buyDog(){…};
…
}
20. Singleton mode
One Singleton Bean per JVM
Exemples :
Counter
Cache
Advantage :
Resource-friendly
One instance
Disadvantage :
One instance
21. Singleton mode
@Singleton
public class Counter {
private int i = 0;
public int getCount(){
return ++i;
}
}
22. Asynchronous calls
How to have asynchronous call in EJBs ?
Threads don't integrate well
@Asynchronous
Method returns void or java.util.concurrent.Future<T>
23. Asynchronous calls
@Stateless
public class HelloWorld {
@EJB MailManager mailManager;
public String sayHelloTo(String name){
mailManager.sendMail();
return "Hello " + name;
}
}
@Stateless
public class MailManager {
@Asynchronous
public void sendMail(){
...
}
}
24. Timer Service
Programmatic and Calendar based scheduling
« Last day of the month »
« Every five minutes on Monday and Friday »
Cron-like syntax
second [0..59], minute[0..59], hour[0..23], year
DayOfMonth[1..31]
dayOfWeek[0..7] or [sun, mon, tue..]
Month[0..12] or [jan,feb..]
29. Unit Test
Cactus is a simple test framework for
unit testing server-side java code
(Servlets, EJBs, Tag Libs, Filters, ...).
The Ejb3Unit project automates Entity and Session
bean testing outside the container for the EJB 3.0
specification.
31. EJB connection with lookup
The client needs the JNDI context to connect to the server.
The client also needs the Session Bean interface
Retrieve the Session Bean with a lookup()
Then it's possible to call methods from the Bean
Context context = new InitialContext();
HelloService hello = (HelloService)
context.lookup(HelloService.class.getName());
System.out.println(hello.sayHello());
The Session Bean will send you a message !
32. EJB connection with lookup
jndi.properties file example
GlassFish parameters
java.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactory
java.naming.factory.url.pkgs=com.sun.enterprise.naming
java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
JBoss Parameters
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url = 127.0.0.1:1099
33. EJB injection
In the same JVM, it's not necessary to do a lookup()
Obtain a Session Bean with resource injection
Used in other EJBs, web applications
public class ClientServiceBean
implements ClientService {
@EJB
private OrderService orderService;
...
}
34. Soap WS in EJB module
Add @WebService and @Stateless annotation on a class
It run !
@WebService
@Stateless
public class MyBeanPublic {
@WebMethod
public String helloWorld() {
return null;
}
}
Default WSDL address : http://localhost:
8080/MyBeanPublicService/MyBeanPublic?wsdl
35. Soap WS in EJB module
Now, we use our EJB @stateless in our SOAP WS.
@WebService
@Stateless
public class MyBeanPublic {
@EJB
private MyBeanLocal ejbRef;
@WebMethod
public String helloWorld() {
return ejbRef.helloWorld();
}
}
39. Persistence Unit
Different providers
Hibernate (use by default in JBoss)
TopLink (use by default in Glassfish v2)
EclipseLink (use by default in Glassfish v3)
42. EntityManager in EJB
Obtain an EntityManager with injection
@Stateless
public class DAO {
@PersistenceContext(unitName="montrealjugPU")
protected EntityManager em;
public void createCat(Cat cat){
em.persist(cat);
}
}
44. JMS presentation
The same since 2002
Used when some information should be exchanged
between
Two applications : point-to-point model
Several applications : publish and subscribe model
Asynchronous system : messages are received when the
client request them
Similar to a mail system
47. Messages
There are three different types of messages
TextMessage to send simple text
ObjectMessage for a serialized object
MapMessage contains a map with strings as keys and
objects as values
48. Send a message
In order to send a message, we have to:
Reclaim required objects via JNDI
A ConnectionFactory (service provider)
A Destination (Queue or Topic)
Create a Connection using the factory
Open a Session using the connection
Create a MessageProducer
Send the message
49. Send a message
Context ctx = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) ctx
.lookup("ConnectionFactory");
Destination destination = (Destination) ctx.lookup("queue/StockValue");
Connection cnx = connectionFactory.createConnection();
Session session = cnx.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage();
message.setText("Your'microsoft' stock has been sold !");
producer.send(message);
cnx.close();
50. Receive a message
Two ways to receive a message
Blocking, waiting for a message
Non-blocking, using a message listener
A message listener is similar to an event listener : it
"subscribes" to a particular destination and receives
messages each time there's a new one
51. Receive a message
Blocking mode
MessageConsumer consumer = session.createConsumer
(destination);
// Retrieve a single message
Message receivedMessage = consumer.receive();
Non-blocking mode, using a listener
MessageConsumer consumer = session.createConsumer(destination);
// Set the listener
consumer.setMessageListener(new MessageListener() {
public void onMessage(Message message) {
// Will be called each time a message is received
}
});
52. Receive a message : Message Driven Bean
A Message Driven Bean is a specific component for
receiving messages
Annotation used is @MessageDriven
Destination name and type are declared in the annotation
Implements javax.jms.MessageListener
Method public void onMessage(Message m)
Called at the moment of receipt