EJB et WS (Montreal JUG - 12 mai 2011)
-
Upload
montreal-jug -
Category
Documents
-
view
3.279 -
download
2
description
Transcript of EJB et WS (Montreal JUG - 12 mai 2011)
EJB and SOAP WS
Par Romain Rocèspour le Montréal JUG
About me
Teacher at Supinfo Montreal
Romain Rocès
Blue belt on BlackBelt Factory
Romain Rocès
Concept
Concept
Provides different services (Session Bean), communicates with another application (Message Bean), saves information (Entity Bean).
EJB regroups several concepts
Just like a brain, EJB is the center of the application.It proposes many functions.
Version 3
The previous version (2.1) was too complex
The version 3.0 tends to simplification :Less steps, less classes, less configurationImprovements from Java EE 5
AnnotationsGenericsJava Persistance API
Concepts remain the same, but Sun integrated many ideas from popular open-source projects like Spring or Hibernate.
Application servers
WebLogic, by BEA
Oracle Application Server, by Oracle
JBoss, by RedHat
GlassFish, by Sun MicroSystems
EJB session
Singleton, Stateless, Stateful
Facade pattern
The Session Bean acts as a “facade”.It's the client's interlocutor
Client accessDifferent clients can call the Session Bean methods if they possess its interface
Session Bean deployed on a serverWeb application
Desktop application
InterfaceImplementation
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-friendlyMore secure
Disadvantage :Local scope
Session Bean Local
Local interfaces are not mandatory
@Statelesspublic class HelloServiceBean { public String sayHello(){ return "Hello World"; }}
Session Bean RemoteSet @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 BeanA rich-client
Advantage :Open on the network
Disadvantage :Consumes more resources (uses RMI)Security
Session Bean Remote
@Remotepublic interface HelloService {public String sayHello();}
@Statelesspublic class HelloServiceBean implements HelloService{ public String sayHello(){ return "Hello World"; }}
Interface
Implementation
Stateless modeA Stateless Bean is not bound to any client
getPlaces() getPlaces()getTrips()
Exemples :Retrieve a list of productsHelloService
Advantage : Resource-friendly
Stateless mode
@Statelesspublic class HelloWorld { public String sayHelloTo(String name){ return "Hello " + name; }}
Stateful mode
getPlaces() getPlaces()
getTrips()
A Statefull Bean is bound to a client
Exemples :CartOrderService
Advantage : Impact on server performance
Stateful mode
@Statefulpublic class OrderService { public void setName(String name){…}; public void setAddress(String address){…}; public void buyDog(){…}; …}
Singleton modeOne Singleton Bean per JVM
Exemples :CounterCache
Advantage :Resource-friendlyOne instance
Disadvantage :One instance
Singleton mode
@Singletonpublic class Counter { private int i = 0; public int getCount(){ return ++i; }}
Asynchronous calls
How to have asynchronous call in EJBs ?
Threads don't integrate well
@Asynchronous
Method returns void or java.util.concurrent.Future<T>
Asynchronous calls@Statelesspublic class HelloWorld { @EJB MailManager mailManager; public String sayHelloTo(String name){ mailManager.sendMail(); return "Hello " + name; }}
@Statelesspublic class MailManager { @Asynchronous public void sendMail(){ ... }}
Timer Service
Programmatic and Calendar based scheduling« Last day of the month »« Every five minutes on Monday and Friday »
Cron-like syntaxsecond [0..59], minute[0..59], hour[0..23], yearDayOfMonth[1..31]dayOfWeek[0..7] or [sun, mon, tue..]Month[0..12] or [jan,feb..]
Timer Service
@Statelesspublic class WakeUpBean { @Schedule(dayOfWeek=“Mon-Fri”, hour=“9”) void wakeUp() { ... }}
Unit Test
JUnit
Not in EJB context
@Test public void myTest(){ StatelessBean statelessBean = new StatelessBean(); statelessBean.getCounter(); }
JUnit
With EJB context : embedded glassfish
@Testpublic void myTest() throws NamingException{ EJBContainer createEJBContainer = EJBContainer.createEJBContainer(); StatelessBean statelessBean = (StatelessBean)container.getContext() .lookup("java:global/classes/StatelessBean"); statelessBean.getCounter(); container.close();}
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.
Client connection
lookup & @EJB
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 !
EJB connection with lookup
GlassFish parametersjava.naming.factory.initial=com.sun.enterprise.naming.SerialInitContextFactoryjava.naming.factory.url.pkgs=com.sun.enterprise.namingjava.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl
jndi.properties file example
JBoss Parametersjava.naming.factory.initial=org.jnp.interfaces.NamingContextFactoryjava.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfacesjava.naming.provider.url = 127.0.0.1:1099
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;
...}
Soap WS in EJB moduleAdd @WebService and @Stateless annotation on a classIt run !
@WebService@Statelesspublic class MyBeanPublic { @WebMethod public String helloWorld() { return null; }}
Default WSDL address : http://localhost:8080/MyBeanPublicService/MyBeanPublic?wsdl
Soap WS in EJB moduleNow, we use our EJB @stateless in our SOAP WS.
@WebService@Statelesspublic class MyBeanPublic {
@EJB private MyBeanLocal ejbRef;
@WebMethod public String helloWorld() { return ejbRef.helloWorld(); }}
Soap WS in EJB moduleExemple with NetBeans 7
EJB entity
Persistence UnitThe persistence unit makes the link between your application and a DataSource
Persistence Unit
Different providers
Hibernate (use by default in JBoss)
TopLink (use by default in Glassfish v2)
EclipseLink (use by default in Glassfish v3)
Persistence Unit
<?xml version="1.0" encoding="UTF-8"?><persistence version="2.0" ...> <persistence-unit name="montrealjugPU" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/firone</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="eclipselink.ddl-generation" value="create-tables"/> </properties> </persistence-unit></persistence>
persistence.xml
Persistence Unit
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd"><resources> <jdbc-connection-pool ...> <property name="serverName" value="localhost"/> <property name="portNumber" value="1527"/> <property name="databaseName" value="firone"/> <property name="User" value="firone"/> <property name="Password" value="firone"/> <property name="URL" value="jdbc:derby://localhost:1527/firone"/> <property name="driverClass" value="org.apache.derby.jdbc.ClientDriver"/> </jdbc-connection-pool> <jdbc-resource enabled="true" jndi-name="jdbc/firone" object-type="user" pool-name="derby_net_firone_fironePool"/></resources>
glassfish-resources.xml
EntityManager in EJB
Obtain an EntityManager with injection
@Statelesspublic class DAO {
@PersistenceContext(unitName="montrealjugPU") protected EntityManager em;
public void createCat(Cat cat){ em.persist(cat); }}
EJB message
Java Message Service
JMS presentation
The same since 2002
Used when some information should be exchanged between
Two applications : point-to-point modelSeveral applications : publish and subscribe model
Asynchronous system : messages are received when the client request them
Similar to a mail system
Queue mode
Topic mode
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
Send a message
In order to send a message, we have to:
Reclaim required objects via JNDIA 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
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();
Receive a message
Two ways to receive a messageBlocking, waiting for a messageNon-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
Receive a message
Blocking modeMessageConsumer consumer = session.createConsumer(destination);// Retrieve a single messageMessage receivedMessage = consumer.receive();
Non-blocking mode, using a listenerMessageConsumer consumer = session.createConsumer(destination);// Set the listenerconsumer.setMessageListener(new MessageListener() { public void onMessage(Message message) { // Will be called each time a message is received}});
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.MessageListenerMethod public void onMessage(Message m)Called at the moment of receipt
Receive a message : Message Driven Bean
@MessageDriven( mappedName="queue/StockValue", activationConfig = {@ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue")})class MyDrivenBean implements MessageListener { public void onMessage(Message message) {TextMessage textMessage = (TextMessage) message;System.out.println(textMessage.getText());}}
Merci de votre attention
Sources
Supinfo : www.supinfo.com
ParisJUG : www.parisjug.org
License
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/