Slide 1

Slide 1 text

GRAILS 3 EVENTS FOR LOOSELY COUPLED AND REACTIVE APPLICATIONS MICHAEL PLÖD

Slide 2

Slide 2 text

MICHAEL PLÖD ▸ Principal Consultant at innoQ ▸ Architecture and Software Development Consulting ▸ Areas of interest: Event Sourcing, Caching, Grails, Software Architecture ▸ Follow me on Twitter: @bitboss

Slide 3

Slide 3 text

REACTIVE? WHAT DOES IT MEAN

Slide 4

Slide 4 text

? Responsive ? Resilient ? Elastic ? Message driven

Slide 5

Slide 5 text

ASYNC FEATURES IN GRAILS 2.X ▸ Promises ▸ Async GORM ▸ Async Requens Handling ▸ Servlet 3.0 async

Slide 6

Slide 6 text

I WANT TO CREATE A LOOSELY COUPLED APPLICATION WITH A HIGH COHESION Some software craftsman

Slide 7

Slide 7 text

THESE QUALIFY FOR ASYNC PROCESSING ARE THEY _REALLY_ A CORE CONCERN OF THE ARTICLE CONTROLLER? COUPLING REVISED SAVE TO DATABASE WITH GORM PUBLISH ON TWITTER PUBLISH ON FACEBOOK NOTIFY CHIEF FOR REVIEW (BY MAIL) ARTICLE CONTROLLER
 
 SAVE()

Slide 8

Slide 8 text

EVEN BY USING PROMISES WE TIGHTLY COUPLE OUR COMPONENTS Some software craftsman

Slide 9

Slide 9 text

< THIS
 IS THE ANATOMY OF A TYPICAL SYSTEM AFTER A FEW YEARS LET’S BE HONEST

Slide 10

Slide 10 text

EVENTS: AN INTERESTING ALTERNATIVE SAVE TO DATABASE WITH GORM ARTICLE CONTROLLER
 
 SAVE() ARTICLE CREATED TWITTER HANDLER NOTIFICATION HANDLER FACEBOOK HANDLER

Slide 11

Slide 11 text

WHAT IS REACTOR ▸ Foundational Framework for asynchronous applications on the JVM ▸ Abstractions for Java, Groovy and other JVM languages ▸ Aims at making event and data-driven applications easier ▸ High performance (15.000.000 events / second with the fastest non-blocking dispatcher) ▸ https://github.com/reactor/reactor.

Slide 12

Slide 12 text

THE BASIC BUILDING BLOCKS ARE: 
 SELECTORS, CONSUMERS AND EVENTS IMPORT STATIC REACTOR.FN.$; REACTOR REACTOR = R.CREATE(); REACTOR.ON($("PARSE"), NEW CONSUMER>() { PUBLIC VOID CALL(EVENT EV) { SERVICE.HANDLEEVENT(EV); } }); REACTOR.NOTIFY("PARSE", FN.EVENT("HELLO WORLD!"));

Slide 13

Slide 13 text

REACTOR IN GRAILS 3 ▸ Configuration ▸ Consuming Events ▸ Sending Events ▸ Events trait for Services and Controllers ▸ Spring Annotations ▸ Events trait for other classes (that aren’t Services or Controllers) ▸ GORM Events ▸ Spring Events

Slide 14

Slide 14 text

REACTOR IN GRAILS 3: CONFIGURATION CONFIGURATION IN APPLICATION.YML reactor: dispatchers: default: myExecutor myExecutor: type: threadPoolExecutor size: 5 backlog: 2048

Slide 15

Slide 15 text

REACTOR IN GRAILS 3: CONSUMING EVENTS CONSUMING EVENTS WITH CONSUMERS AND SELECTORS on("myEvent") { println "Event fired!" } on(„articlePublishedEvent") { Article article -> //do something with the article }

Slide 16

Slide 16 text

REACTOR IN GRAILS 3: EVENTS TRAIT SERVICES AND CONTROLLERS IMPLEMENT THE EVENTS TRAIT class EventController {
 @PostConstruct
 void init()
 {
 on("articlePublished") { payload ->
 println "article published "
 }
 } … }

Slide 17

Slide 17 text

REACTOR IN GRAILS 3: EVENTS TRAIT SERVICES MUST BE ANNOTATED WITH @CONSUMER @Transactional
 @Consumer
 class TwitterService{
 @PostConstruct
 void init()
 {
 on("articlePublished") { payload ->
 println "article published"
 }
 } }

Slide 18

Slide 18 text

REACTOR IN GRAILS 3: EVENTS TRAIT YOU CAN ALSO USE SPRING ANNOTATIONS FOR SELECTORS @Transactional
 @Consumer
 class TwitterService{
 @Selector('articlePublished')
 void publishArticleOnTwitter()
 {
 ….. } }

Slide 19

Slide 19 text

REACTOR IN GRAILS 3: EVENTS TRAIT EVENTS OF NON-SERVICE OR -CONTROLLER CLASSES @Component
 @Consumer
 class TwitterPublisher implements Events {
 @PostConstruct
 void init()
 {
 on("articlePublished") { payload ->
 println "article published"
 }
 } }

Slide 20

Slide 20 text

REACTOR IN GRAILS 3: EVENTS FROM GORM YOU CAN EVEN REACT TO EVENTS FROM GORM ▸ gorm:preInsert ▸ gorm:postInsert ▸ gorm:preDelete ▸ gorm:postDelete ▸ gorm:preLoad ▸ gorm:postLoad ▸ gorm:preUpdate ▸ gorm:postUpdate ▸ gorm:saveOrUpdate ▸ gorm:datastoreInitialized ▸ gorm:validation on(„gorm:preInsert“) { PreInsertEvent e -> //do something with the event } GORM EVENTS ARE ASYNCHRONOUS: THEY CAN’T MODIFY PERSISTENCE OPERATIONS

Slide 21

Slide 21 text

REACTOR IN GRAILS 3: EVENTS FROM SPRINT SPRING ALSO FIRES EVENTS on("spring:applicationStarted") { ApplicationStartedEvent event -> // …. } on("spring:servletRequestHandled") { RequestHandledEvent event -> // …. }

Slide 22

Slide 22 text

LET’S GET OUR HANDS DIRTY DEMO

Slide 23

Slide 23 text

THANK YOU! MICHAEL PLOED - INNOQ @BITBOSS Example: https://github.com/mploed/grails-event-example