softshake 2014 - Java EE

81
Avec JavaEE, fais ce que tu veux… Alexis Hassler

description

Le temps est révolu où Java EE ne serait qu’à développer des applications de mise à jour de données, avec JSF / EJB / JPA. Aujourd’hui Java EE s’est assoupli et s’est ouvert sur le monde, avec CDI comme clé de voûte et a repoussé nos limites grâce à des capacités d’extension puissantes et faciles d’utilisation comme JCA. Dans un premier temps, nous reviendrons rapidement sur la place de CDI dans JavaEE 7 et sur ses mécanismes d’extension. Dans un deuxième temps, nous verrons les techniques de connecteurs JCA et comment ils peuvent aussi constituer une possibilité d’ouverture simple à mettre en œuvre. JCA fournit des techniques pour gérer des connexions sortantes ou entrantes, sur des formats ou protocoles variés.

Transcript of softshake 2014 - Java EE

Page 1: softshake 2014 - Java EE

Avec JavaEE, fais ce que tu veux…

Alexis Hassler

Page 2: softshake 2014 - Java EE

Alexis Hassler• Développeur, formateur Java

• Indépendant

• Co-leader du

• @AlexisHassler

Page 3: softshake 2014 - Java EE

Java EE1° partie

http://www.public-domain-image.com/

Page 4: softshake 2014 - Java EE

CDI

Java EEJSF

EJB 3

JPA

JAX-RSWebSocket

Page 5: softshake 2014 - Java EE

CDI

JCA

Page 6: softshake 2014 - Java EE

MQTT

Broker

Consumer

Consumer

Consumer

Producer

Producer

Producer

Topic

Topic

Topic

Topic

SubscribePublish

Page 7: softshake 2014 - Java EE

MQTT

http://www.galuzzi.it/

Page 8: softshake 2014 - Java EE

MQTT

http://commons.wikimedia.org/wiki/File:St_Jude_Medical_pacemaker_with_ruler.jpg

Page 9: softshake 2014 - Java EE

MQTT

Page 10: softshake 2014 - Java EE

JCA2° partie

http://www.public-domain-image.com/

Page 11: softshake 2014 - Java EE

Java Connector

Architecture

Page 12: softshake 2014 - Java EE

Java EE

EISApp

Con

nect

or

Java EE

Page 13: softshake 2014 - Java EE

Outbound

Page 14: softshake 2014 - Java EE

Java EE

EISApp

Con

nect

or

Page 15: softshake 2014 - Java EE

Java EE

App

Dat

aSou

rce

Page 16: softshake 2014 - Java EE

Resourcepublic class SomeNiceBean { @Resource(name="jdbc/SomeDS") DataSource dataSource; public void doTheJob() { Connection connection = dataSource.getConnection(); ... }}

Page 17: softshake 2014 - Java EE

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

ImplementationAPI

ManagedConnection Factory

ConnectionFactory

ManagedConnectionConnection

Resource Adapter

Page 19: softshake 2014 - Java EE

ManagedConnection Factory

ConnectionFactorynew

ManagedConnection

new

ConnectionManager

Connection

ResourceAdapter

new

ConnectionEventListener XAResource

LocalTransaction

ManagedConnectionMetaData

Page 20: softshake 2014 - Java EE

Inbound

Page 21: softshake 2014 - Java EE

Java EE

App

Con

nect

or

EIS

Page 22: softshake 2014 - Java EE

Message Driven Bean

Java EE

MDBJMS

Destination

Con

nect

or

Page 23: softshake 2014 - Java EE

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

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

ImplementationAPI

ResourceAdapterListener

ActivationSpecMessage

XAResource

WorkerManager

BootstrapContext

Page 26: softshake 2014 - Java EE

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

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

Connector

mqtt-ra.rar

Application(w. MDB)

mqtt-ra-example.war

WildFly

MQTTBroker

(mosquitto)

MQTT Clientmosquitto pub/sub

Page 29: softshake 2014 - Java EE

C D I3° partie

http://www.picturesdepot.com/

Page 30: softshake 2014 - Java EE

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 31: softshake 2014 - Java EE

http://commons.wikimedia.org/

Bean

Page 32: softshake 2014 - Java EE

@Inject

Page 33: softshake 2014 - Java EE

Dependency Injection

public class MessageService { @Override public String message() { return "Bonjour le monde !"; } }

Page 34: softshake 2014 - Java EE

Dependency Injectionpublic class HelloBean { @Inject MessageService service; public void displayHello() { display( frService.message() ); } }

Page 35: softshake 2014 - Java EE

Highlander Rule

there can be only one

http://pixabay.com/

Page 36: softshake 2014 - Java EE

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

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

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

Qualifiers

public class HelloBean { @Inject @French MessageService service; public void displayHello() { display(service.message()); } }

Page 40: softshake 2014 - Java EE

Programmatic Lookup

http://pixabay.com/

Page 41: softshake 2014 - Java EE

Programmatic lookuppublic class HelloBean { @Inject Instance<MessageService> service; public void displayHello() { if (! service.isUnsatisfied()) { display(service.get().message()); } } }

Page 42: softshake 2014 - Java EE

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

Contexts

@ApplicationScopedpublic class MessageService { ... }

@RequestScoped@ConversationScoped@SessionScoped

@Dependent

Page 44: softshake 2014 - Java EE

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

Interceptors

http://commons.wikimedia.org/

Page 46: softshake 2014 - Java EE

Interceptors

@InterceptorBinding@Target({METHOD, TYPE}) @Retention(RUNTIME) public @interface Loggable {}

Page 47: softshake 2014 - Java EE

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

Interceptors

@Loggablepublic class HelloBean { @Inject MessageService service; public void displayHello() { display(service.message()); } }

Page 49: softshake 2014 - Java EE

Producers

http://commons.wikimedia.org/

Page 50: softshake 2014 - Java EE

Producers

public class FacesProducer { @Produces @RequestScoped public FacesContext produceFacesContext() { return FacesContext.getCurrentInstance(); } }

Page 51: softshake 2014 - Java EE

Producers

@Produces public Logger produceLogger( InjectionPoint injectionPoint) { String loggerName = injectionPoint .getMember() .getDeclaringClass() .getName(); return Logger.getLogger(loggerName); }

Page 52: softshake 2014 - Java EE

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

Events

public class MessageReceiver { public void receive(@Observes Message message) { System.out.println("Received: " + message.text); } }

Page 54: softshake 2014 - Java EE

Synthèse

ContextInjection

Decoration Interception Event JavaEE Integration

Portable Extension

Page 55: softshake 2014 - Java EE

CDI Portable Extensions

Page 56: softshake 2014 - Java EE

Bean Manager

https://www.kingbean.com/

Page 57: softshake 2014 - Java EE

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

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

Comment ?En observant les

événements déclenchés par le

conteneur CDI

Page 60: softshake 2014 - Java EE

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

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

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

Application

mqtt-cdi-example.war

WildFly

MQTTBroker

(mosquitto)

MQTT Clientmosquitto pub/sub

http://pixabay.com/

Page 64: softshake 2014 - Java EE

4° partieJCA // CDI

Page 65: softshake 2014 - Java EE

CDI

JCA

Page 66: softshake 2014 - Java EE

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

JCA

CDI

Page 68: softshake 2014 - Java EE

public class SomeNiceBean { @Inject MqttConnectionFactory connectionFactory; public void doTheJob() { Connection connection = connectionFactory.getConnection(); ... }}

javax.enterprise.inject. UnsatisfiedResolutionException

Page 69: softshake 2014 - Java EE

Java EE 8• Implicit Producers ?

• Ambiguities ?

• Qualifiers ?

Page 70: softshake 2014 - Java EE

JCA // CDI

Page 71: softshake 2014 - Java EE

JCA

ManagedConnection Factory

ConnectionFactorynew

ManagedConnection

new

ConnectionManager

Connection

ResourceAdapter

new

ConnectionEventListener

XAResource

LocalTransaction

ManagedConnectionMetaData

WorkerManager

Page 72: softshake 2014 - Java EE

CDIUserTransaction

ManagedExecutorService

ConnectionFactory Producer

ConnectionFactorynew

ConnectionLocalTransaction

Page 73: softshake 2014 - Java EE

Outbound Connector

JCA < CDI

Page 74: softshake 2014 - Java EE

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

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

Threads

https://www.flickr.com/photos/mckaysavage/6491930649/

Page 77: softshake 2014 - Java EE

Inbound Connector

JCA > CDI

Page 78: softshake 2014 - Java EE

Java EE Application Server

App

CDI

App

CDI

App

CDI

JCA

Page 79: softshake 2014 - Java EE

?http://pixabay.com/fr/point-d-interrogation-boule-demande-65833/

Page 80: softshake 2014 - Java EE

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

Version longue• Part 1 : Intro + CDI• https://parleys.com/play/536749d1e4b04bb59f502706

• Part 2 : JCA + Synthèse• https://parleys.com/play/5369f1f9e4b04bb59f502725