softshake 2014 - Java EE
-
Upload
alexis-hassler -
Category
Software
-
view
254 -
download
2
description
Transcript of softshake 2014 - Java EE
![Page 1: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/1.jpg)
Avec JavaEE, fais ce que tu veux…
Alexis Hassler
![Page 2: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/2.jpg)
Alexis Hassler• Développeur, formateur Java
• Indépendant
• Co-leader du
• @AlexisHassler
![Page 3: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/3.jpg)
Java EE1° partie
http://www.public-domain-image.com/
![Page 4: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/4.jpg)
CDI
Java EEJSF
EJB 3
JPA
JAX-RSWebSocket
![Page 5: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/5.jpg)
CDI
JCA
![Page 6: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/6.jpg)
MQTT
Broker
Consumer
Consumer
Consumer
Producer
Producer
Producer
Topic
Topic
Topic
Topic
SubscribePublish
![Page 8: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/8.jpg)
MQTT
http://commons.wikimedia.org/wiki/File:St_Jude_Medical_pacemaker_with_ruler.jpg
![Page 9: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/9.jpg)
MQTT
![Page 10: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/10.jpg)
JCA2° partie
http://www.public-domain-image.com/
![Page 11: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/11.jpg)
Java Connector
Architecture
![Page 12: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/12.jpg)
Java EE
EISApp
Con
nect
or
Java EE
![Page 13: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/13.jpg)
Outbound
![Page 14: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/14.jpg)
Java EE
EISApp
Con
nect
or
![Page 15: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/15.jpg)
Java EE
App
Dat
aSou
rce
![Page 16: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/16.jpg)
Resourcepublic class SomeNiceBean { @Resource(name="jdbc/SomeDS") DataSource dataSource; public void doTheJob() { Connection connection = dataSource.getConnection(); ... }}
![Page 17: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/17.jpg)
MQTT Connection Factory
public class SomeNiceBean { @Resource(name="mqtt/QuestionCF") ConnectionFactory connectionFactory; public void doTheJob() { connectionFactory.getConnection() .publish(message); }}
![Page 18: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/18.jpg)
ImplementationAPI
ManagedConnection Factory
ConnectionFactory
ManagedConnectionConnection
Resource Adapter
![Page 19: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/19.jpg)
ManagedConnection Factory
ConnectionFactorynew
ManagedConnection
new
ConnectionManager
Connection
ResourceAdapter
new
ConnectionEventListener XAResource
LocalTransaction
ManagedConnectionMetaData
![Page 20: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/20.jpg)
Inbound
![Page 21: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/21.jpg)
Java EE
App
Con
nect
or
EIS
![Page 22: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/22.jpg)
Message Driven Bean
Java EE
MDBJMS
Destination
Con
nect
or
![Page 23: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/23.jpg)
JMS Message Driven Bean
@MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName="destinationLookup", propertyValue="swt/Question"), @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"), }) public class MyJmsBean implements MessageListener { @Override public void onMessage(Message message) { ... } }
![Page 24: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/24.jpg)
MQTT Message Driven Bean
@MessageDriven( activationConfig = { @ActivationConfigProperty(propertyName = "topicName", propertyValue = "swt/Question") } ) public class MyMqttBean implements MqttListener { @Override public void onMessage(Message message) { ... } }
![Page 25: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/25.jpg)
ImplementationAPI
ResourceAdapterListener
ActivationSpecMessage
XAResource
WorkerManager
BootstrapContext
![Page 26: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/26.jpg)
Connector APIpublic interface MqttListener { void onMessage(Message message); }
public class Message { private byte[] payload; public Message(byte[] payload) { this.payload = payload; } // + Getter}
![Page 27: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/27.jpg)
Message Driven Bean ++@MessageDrivenpublic class MyMqttBean implements MqttListener { @TopicName("swt/Question") public void onQuestion(Message message) { ... }
@TopicName("swt/Answer") public void onAnswer(Message message) { ... }
}
![Page 28: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/28.jpg)
Connector
mqtt-ra.rar
Application(w. MDB)
mqtt-ra-example.war
WildFly
MQTTBroker
(mosquitto)
MQTT Clientmosquitto pub/sub
![Page 29: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/29.jpg)
C D I3° partie
http://www.picturesdepot.com/
![Page 30: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/30.jpg)
Context & Dependency Injection
• IoC pour Java EE et Java SE
• Gestion des contextes
• Liant pour la plupart des spec Java EE
• Moteur d’extensions pour Java EE
![Page 32: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/32.jpg)
@Inject
![Page 33: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/33.jpg)
Dependency Injection
public class MessageService { @Override public String message() { return "Bonjour le monde !"; } }
![Page 34: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/34.jpg)
Dependency Injectionpublic class HelloBean { @Inject MessageService service; public void displayHello() { display( frService.message() ); } }
![Page 36: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/36.jpg)
Qualifiers
public class EnglishMessageService implements MessageService { public String message() { return "Hello World!"; } }
public class FrenchMessageService implements MessageService { public String message() { return "Bonjour le monde !"; } }
![Page 37: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/37.jpg)
Qualifiers
@Qualifier@Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER})public @interface English {}
@Qualifier@Retention(RUNTIME) @Target({FIELD, TYPE, METHOD, PARAMETER})public @interface French {}
![Page 38: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/38.jpg)
Qualifiers
@English public class EnglishMessageService implements MessageService { public String message() { return "Hello World!"; } }
@French public class FrenchMessageService implements MessageService { public String message() { return "Bonjour le monde !"; } }
![Page 39: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/39.jpg)
Qualifiers
public class HelloBean { @Inject @French MessageService service; public void displayHello() { display(service.message()); } }
![Page 41: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/41.jpg)
Programmatic lookuppublic class HelloBean { @Inject Instance<MessageService> service; public void displayHello() { if (! service.isUnsatisfied()) { display(service.get().message()); } } }
![Page 42: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/42.jpg)
Programmatic lookuppublic class HelloBean { @Inject @Any Instance<MessageService> services; public void displayHello() { for (MessageService service : services) { display(service.message()); } } }
![Page 43: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/43.jpg)
Contexts
@ApplicationScopedpublic class MessageService { ... }
@RequestScoped@ConversationScoped@SessionScoped
@Dependent
![Page 44: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/44.jpg)
Decorators@Decorator@Priority(Interceptor.Priority.APPLICATION) public class MessageDecorator implements MessageService { @Inject @Delegate @Any MessageService service; public String message() { return service.message() + " -decorated"; } }
http://pixabay.com/
![Page 45: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/45.jpg)
Interceptors
http://commons.wikimedia.org/
![Page 46: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/46.jpg)
Interceptors
@InterceptorBinding@Target({METHOD, TYPE}) @Retention(RUNTIME) public @interface Loggable {}
![Page 47: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/47.jpg)
Interceptors@Interceptor @Loggablepublic class LogInterceptor { @AroundInvoke public Object log(InvocationContext ic) throws Exception { System.out.println("Entering " + ic.getMethod().getName()); try { return ic.proceed(); } finally { System.out.println("Exiting " + ic.getMethod().getName()); } }}
![Page 48: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/48.jpg)
Interceptors
@Loggablepublic class HelloBean { @Inject MessageService service; public void displayHello() { display(service.message()); } }
![Page 49: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/49.jpg)
Producers
http://commons.wikimedia.org/
![Page 50: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/50.jpg)
Producers
public class FacesProducer { @Produces @RequestScoped public FacesContext produceFacesContext() { return FacesContext.getCurrentInstance(); } }
![Page 51: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/51.jpg)
Producers
@Produces public Logger produceLogger( InjectionPoint injectionPoint) { String loggerName = injectionPoint .getMember() .getDeclaringClass() .getName(); return Logger.getLogger(loggerName); }
![Page 52: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/52.jpg)
public class HelloBean { @Inject MessageService service; @Inject Event<Message> messageEvent; public void displayHello() { display(service.message()); messageEvent.fire( new Message(frService.message())); } }
Events
![Page 53: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/53.jpg)
Events
public class MessageReceiver { public void receive(@Observes Message message) { System.out.println("Received: " + message.text); } }
![Page 54: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/54.jpg)
Synthèse
ContextInjection
Decoration Interception Event JavaEE Integration
Portable Extension
![Page 55: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/55.jpg)
CDI Portable Extensions
![Page 57: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/57.jpg)
Bean Manager• Interagir avec le conteneur CDI• Lecture seule
• Injectable
• JNDI• java:comp/BeanManager
public class HelloBean { @Inject BeanManager beanManager; ...}
![Page 58: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/58.jpg)
Extension•Manipuler les métadonnées du container• AnnotatedType
• InjectionPoint / InjectionTarget
• BeanAttributes / Beans
• Producer, Observer
• Pendant le démarrage
![Page 59: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/59.jpg)
Comment ?En observant les
événements déclenchés par le
conteneur CDI
![Page 60: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/60.jpg)
Exemple (-)• Exclure les entités JPA
public class VetoEntityExtension implements Extension { public void vetoEntity( @Observes @WithAnnotations({Entity.class}) ProcessAnnotatedType<?> pat) { pat.veto(); }
}
![Page 61: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/61.jpg)
Exemple (+)• Ajouter un bean
public class HashMapAsBeanExtension implements Extension { public void addHashMapAsAnnotatedType( @Observes BeforeBeanDiscovery bbd, BeanManager beanManager) { bbd.addAnnotatedType( beanManager.createAnnotatedType(HashMap.class) ); } }
![Page 62: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/62.jpg)
CDI 1.1 LifecycleBefore Bean Discovery
Process BeanProcess
Annotated Type
ScanArchive
ApplicationRunning
After Deployment Validation
Before Shutdown
Undeploy Application
Process Producer
After Bean Discovery
ProcessInjection Target
Process Observer Method
ProcessInjection
Point
Process Bean Attributes
After Type Discovery
événement unique
événements multiples
étape interne
Deployment starts
Bean eligibility
check
![Page 63: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/63.jpg)
Application
mqtt-cdi-example.war
WildFly
MQTTBroker
(mosquitto)
MQTT Clientmosquitto pub/sub
http://pixabay.com/
![Page 64: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/64.jpg)
4° partieJCA // CDI
![Page 65: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/65.jpg)
CDI
JCA
![Page 66: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/66.jpg)
Managed Connection Factory
@ConnectionDefinition (connectionFactory = MqttConnectionFactoryImpl.class, connectionFactoryImpl = MqttConnectionFactoryImpl.class, connection = BlockingConnection.class, connectionImpl = BlockingConnection.class) public class MqttManagedConnectionFactory implements ManagedConnectionFactory, ResourceAdapterAssociation, Serializable { @Inject ResourceAdapter ra;
}
![Page 67: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/67.jpg)
JCA
CDI
![Page 68: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/68.jpg)
public class SomeNiceBean { @Inject MqttConnectionFactory connectionFactory; public void doTheJob() { Connection connection = connectionFactory.getConnection(); ... }}
javax.enterprise.inject. UnsatisfiedResolutionException
![Page 69: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/69.jpg)
Java EE 8• Implicit Producers ?
• Ambiguities ?
• Qualifiers ?
![Page 70: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/70.jpg)
JCA // CDI
![Page 71: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/71.jpg)
JCA
ManagedConnection Factory
ConnectionFactorynew
ManagedConnection
new
ConnectionManager
Connection
ResourceAdapter
new
ConnectionEventListener
XAResource
LocalTransaction
ManagedConnectionMetaData
WorkerManager
![Page 72: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/72.jpg)
CDIUserTransaction
ManagedExecutorService
ConnectionFactory Producer
ConnectionFactorynew
ConnectionLocalTransaction
![Page 73: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/73.jpg)
Outbound Connector
JCA < CDI
![Page 74: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/74.jpg)
Message Driven Bean@MqttDrivenpublic class MyMqttBean { @TopicName("swt/Question") public void onQuestion(Message message) { ... }
@TopicName("swt/Answer") public void onAnswer(Message message) { ... }
}
![Page 75: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/75.jpg)
Message Observer@ApplicationScopedpublic class MyMqttBean { public void onQuestion( @Observes @TopicName(value = "swt/Question") Message message) { ... } public void onAnswer( @Observes @TopicName("swt/QuestionBis") Message message) { ... }
}
![Page 76: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/76.jpg)
Threads
https://www.flickr.com/photos/mckaysavage/6491930649/
![Page 77: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/77.jpg)
Inbound Connector
JCA > CDI
![Page 78: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/78.jpg)
Java EE Application Server
App
CDI
App
CDI
App
CDI
JCA
![Page 79: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/79.jpg)
?http://pixabay.com/fr/point-d-interrogation-boule-demande-65833/
![Page 80: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/80.jpg)
Exemples• https://github.com/antoinesd/cdi-demo
• https://github.com/sewatech/mqtt-ra/
• https://github.com/hasalex/mqtt-cdi
• http://fr.slideshare.net/sewatech/
![Page 81: softshake 2014 - Java EE](https://reader030.fdocument.pub/reader030/viewer/2022012405/549225a1ac795949288b46b1/html5/thumbnails/81.jpg)
Version longue• Part 1 : Intro + CDI• https://parleys.com/play/536749d1e4b04bb59f502706
• Part 2 : JCA + Synthèse• https://parleys.com/play/5369f1f9e4b04bb59f502725