SlideShare a Scribd company logo
APACHE SLING & FRIENDS TECH MEETUP

BERLIN, 23-25 SEPTEMBER 2013

Inter-Sling communication with a message queue
Tomasz Rękawek
Agenda
•  Code bookmarks
•  http://bit.ly/adaptto-jms
•  Case 1: shared session
•  Running ActiveMQ in Sling
•  JMS connection provider
•  Case 2: JMS-based discovery API
implementation
•  Sling Message Listener
•  Case 3: Reverse replication request
•  Targeting instance by its run mode
adaptTo() 2013
 2	
  
adaptTo() 2013
 3
Solution overview
Shared session
Shared session
•  We have n publishes and the dispatcher
with stickySession enabled
•  We use the servlet session
•  In case one publish stops responding, the
user will be redirected to the other publish
•  We want the session to be transferred too
adaptTo() 2013
 4	
  
JMS-based shared session
Dispatcher+
Publish+1+
Publish+2+
Publish+3+
Publish+3+
JMS+
Update+shared+
session+
Session+has+been+changed+
Shared+session+storage+–+stores+session+from+all+
publishes,+with+assigned+unique+shared+session+id+
Request+
Cookie+containing+unique+shared+session+id+(different+
than+JSESSION_ID)+and+unique+instance+id+
adaptTo() 2013
 5	
  
Shared session
•  If a publish notices that the instance id in
the cookie is different from its own, it’ll
copy shared session values to the
HttpSession	
  
•  The Administrator can configure names of
the shared session properties (as a list of
regular expressions)	
  
adaptTo() 2013
 6	
  
Shared session – demo
•  Local infrastructure description:
•  One author + two publishes
•  All available under local.cq	
  domain
•  We can switch between publishes using ?publish2	
  
query string
•  http://local.cq/bin/cognifide/session.txt
•  http://local.cq/bin/cognifide/session.txt/add
•  http://local.cq/bin/cognifide/session.txt?
publish2
adaptTo() 2013
 7	
  
adaptTo() 2013
 8
Shared session implementation details
Integrating ActiveMQ
Rough start: dependencies
•  I tried to use the activemq-­‐core	
  package.
This is what I saw in the /system/console:
adaptTo() 2013
 9	
  
Providing necessary dependencies
•  Some dependencies are taken from other OSGi
bundles – we don’t worry about them
•  Some have to be embedded
<Embed-­‐Dependency>activemq-­‐core,geronimo-­‐j2ee-­‐
management_1.1_spec,ejb-­‐api,jaxrpc-­‐api</Embed-­‐Dependency>	
  
•  Some can be ignored
•  Check the original pom.xml	
  for optional
dependencies
<Import-­‐Package>	
  
!javax.jmdns.*,!org.apache.activeio.*,!
org.apache.activemq.jaas.*,!org.apache.camel.*,!
org.apache.commons.net.*,…,*	
  
</Import-­‐Package>	
  
adaptTo() 2013
 10	
  
Result: sling-­‐jms-­‐activemq	
  
•  We’ve created an OSGi bundle with all
necessary dependencies embedded
•  Optional dependencies are ignored and
marked not-to-import
•  Bundle provides ActiveMQ to any Sling
instance
adaptTo() 2013
 11	
  
adaptTo() 2013
 12
Shared session implementation details
JMS Connection Provider
Creating JMS connection with ActiveMQ
adaptTo() 2013
 13
import	
  javax.jms.Connection;	
  
import	
  org.apache.activemq.ActiveMQConnectionFactory;	
  
	
  
ActiveMQConnectionFactory	
  factory;	
  
factory	
  =	
  new	
  ActiveMQConnectionFactory();	
  
Connection	
  connection	
  =	
  factory.createConnection();	
  
•  In order to create JMS connection we need
to import some ActiveMQ classes:
•  So all JMS-related code will be also dependent
on the ActiveMQ
•  What if we want to change JMS
implementation?
JMS connection provider	
  
•  We use OSGi to separate JMS implementation
from it’s interface
•  JmsConnectionProvider – custom OSGi
service providing javax.jms.Connection	
  
•  Bundle sling-­‐jms-­‐api	
  contains service
interface
•  Implementation: sling-­‐jms-­‐impl-­‐activemq	
  
•  Using sling-­‐jms-­‐api	
  and the connection
provider makes us independent from the JMS
implementation
adaptTo() 2013
 14	
  
Example usage of JMS connection provider	
  
@Component	
  
public	
  class	
  MyComponent	
  implements	
  MessageListener	
  {	
  
	
  
	
  	
  	
  @Reference	
  
	
  	
  	
  private	
  JmsConnectionProvider	
  connectionProvider;	
  
	
  
	
  	
  	
  private	
  javax.jms.Connection	
  connection;	
  
	
  
	
  	
  	
  @Activate	
  
	
  	
  	
  protected	
  void	
  activate()	
  throws	
  JMSException	
  {	
  
	
  	
  	
  	
  	
  	
  connection	
  =	
  connectionProvider.getConnection();	
  
	
  	
  	
  }	
  
	
  
	
  	
  	
  @Deactivate	
  
	
  	
  	
  protected	
  void	
  deactivate()	
  throws	
  JMSException	
  {	
  
	
  	
  	
  	
  	
  	
  connection.close();	
  
	
  	
  	
  }	
  
}	
  
adaptTo() 2013
 15	
  
adaptTo() 2013
 16
API overview & our JMS implementation
Discovery API
Sling Discovery API
•  New Sling API
•  Each instance can expose a list of key-value
properties to other instances
•  Example usage: metadata for workflow
offloading in CQ
•  Properties are not meant to be messaging
tool, they shouldn’t change too often
•  Instances are grouped into clusters, each
cluster has elected leader
adaptTo() 2013
 17	
  
Topology
Red$cluster$ Blue$cluster$
$
$
$
Orange$cluster$
Instance$1$
Instance$2$ Instance$3$
Instance$A$
Instance$B$ Instance$C$
Single$Sling$
adaptTo() 2013
 18	
  
Discovery OSGi services
•  DiscoveryService provides TopologyView	
  
•  Custom instance properties can be added
with PropertyProvider implementations
•  Changes in topology can be observed with
TopologyEventListener
adaptTo() 2013
 19	
  
JMS discovery implementation
•  There is a default HTTP-based
implementation
•  requires providing all instance URLs on each
instance
•  But JMS is a natural choice for the
transport layer here
•  sling-­‐jms-­‐discovery	
  – a new, JMS-based
discovery implementation that doesn’t
require any configuration
adaptTo() 2013
 20	
  
Discovery election
•  If some instance notices there is no leader for
some cluster, it sends message: WHO_IS_LEADER	
  
•  If no one responds in 10 seconds, it sends the
second message: ELECTION	
  
•  Every instance in a given cluster has to
respond with their Sling instance id in the VOTE
message
•  After 5 seconds instance with the smallest id
is chosen and it sends the I_AM_LEADER
message
adaptTo() 2013
 21	
  
Discovery – demo
•  http://local.cq:4503/bin/jms/discovery/info.txt
adaptTo() 2013
 22	
  
adaptTo() 2013
 23
JMS discovery implementation details
Sling Message Consumer
Sling Message Listener
Writing JMS consumers in OSGi is all about
@Component	
  
public	
  class	
  MyComponent	
  implements	
  MessageListener	
  {	
  
	
  
	
  	
  	
  @Reference	
  
	
  	
  	
  private	
  JmsConnectionProvider	
  connectionProvider;	
  
	
  	
  	
  private	
  Connection	
  connection;	
  
	
  	
  	
  private	
  Session	
  session;	
  
	
  	
  	
  private	
  MessageConsumer	
  consumer;	
  
	
  
	
  	
  	
  @Activate	
  
	
  	
  	
  protected	
  void	
  activate()	
  throws	
  JMSException	
  {	
  
	
  	
  	
  	
  	
  	
  connection	
  =	
  connectionProvider.getConnection();	
  
	
  	
  	
  	
  	
  	
  session	
  =	
  connection.createSession(false,	
  Session.AUTO_ACKNOWLEDGE);	
  
	
  	
  	
  	
  	
  	
  Destination	
  dest	
  =	
  session.createTopic("my	
  topic");	
  
	
  	
  	
  	
  	
  	
  consumer	
  =	
  session.createConsumer(dest);	
  
	
  	
  	
  	
  	
  	
  consumer.setMessageListener(this);	
  
	
  	
  	
  	
  	
  	
  connection.start();	
  
	
  	
  	
  }	
  
	
  
	
  	
  	
  @Deactivate	
  
	
  	
  	
  protected	
  void	
  deactivate()	
  throws	
  JMSException	
  {	
  
	
  	
  	
  	
  	
  	
  consumer.close();	
  
	
  	
  	
  	
  	
  	
  session.close();	
  
	
  	
  	
  	
  	
  	
  connection.close();	
  
	
  	
  	
  }	
  
}	
  
adaptTo() 2013
 24	
  
Sling Message Listener
Why don’t we
@SlingMessageConsumer(	
  
	
  	
  	
  	
  destinationType	
  =	
  DestinationType.TOPIC,	
  
	
  	
  	
  	
  subject	
  =	
  "my	
  topic")	
  
public	
  class	
  MyComponent	
  implements	
  MessageListener	
  {	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  public	
  void	
  onMessage(Message	
  msg)	
  {	
  
//	
  …	
  
adaptTo() 2013
 25	
  
•  @SlingMessageConsumer annotation is transformed into @Service,
@Component	
  and @Properties by our sling-­‐jms-­‐scr	
  plugin	
  
•  MessageListener services are collected by our
MessageConsumerRegistry OSGi component
•  Registry component creates JMS consumers and forward messages to
appropriate listeners
Sling Message Listener – filtering
In the message listener configuration you can
add the filter property to filter out incoming
messages. Use the LDAP format:

@SlingMessageConsumer(	
  
	
  	
  	
  destinationType	
  =	
  DestinationType.TOPIC,	
  
	
  	
  	
  subject	
  =	
  "my	
  topic"	
  
	
  	
  	
  filter	
  =	
  "(requestType=VOTE)")	
  
adaptTo() 2013
 26	
  
adaptTo() 2013
 27
Solution overview
Reverse Replication Request
Reverse replication request
•  In CQ, the Author gathers content from publish
instances every 30 seconds (configurable in the
ReverseReplicator service)
•  Why can’t publish send user-generated content to
the Author (push instead of pull)?
•  Security issues – publishes are often in DMZ
•  But publish can inform the Author there is
something new to pull
adaptTo() 2013
 28	
  
Reverse replication request
•  OutboxEventHandler watches the outbox node
and sends information every time there is
some new content to pull
•  ReplicationAgentInvoker receives this
information and invokes the reverse
replication process
•  It’s a good idea to disable the out-of-the-box
ReverseReplicator service, so we don’t have
two reverse replications at the same moment
adaptTo() 2013
 29	
  
Reverse replication request flow
Author'Publish'
User/generated'content'
OutboxEventHandler' Replica<onAgentInvoker'
Reverse'replica<on'agent'Outbox'
Send'JMS'msg'
Pull'content'
adaptTo() 2013
 30	
  
adaptTo() 2013
 31
Reverse replication request implementation details
Targeting messages with the Sling run mode
Send messages only to the Author
•  The outbox event handler should send
messages only to the Author
•  We can filter it manually…
•  …or use @SlingMessageConsumer	
  for the
consumer and add
MessageConsumerProperties.DESTINATION_RUN_MODE	
  to
the message properties
•  Messages will be filtered automatically
adaptTo() 2013
 32	
  
adaptTo() 2013
 33
Final remarks
Extra tools created during JMS research
•  Embedded ActiveMQ broker configurable
within the OSGi component
•  Out-of-the-band JCR binaries transfer
•  You can send a message with metadata and
some JCR path and the binary itself will be
sent via HTTP
•  Utilities to deal with serialization problems
when sending ObjectMessage	
  
adaptTo() 2013
 34	
  
Bundles overview
•  sling-­‐jms-­‐activemq	
  
•  ActiveMQ + dependencies
•  sling-­‐jms-­‐api	
  
•  JMS Connection Provider
•  Sling Message Consumer
•  Blob & Object message utils
•  sling-­‐jms-­‐impl-­‐activemq	
  
•  Implementation of the API tools
•  sling-­‐jms-­‐scr	
  
•  Annotation processor for Sling Message Consumer
•  sling-­‐jms-­‐sandbox	
  
•  Example usage of the API tools
•  Open-sourced use cases
•  sling-­‐jms-­‐discovery	
  
•  cq-­‐jms-­‐replication	
  
•  sling-­‐jms-­‐session	
  
adaptTo() 2013
 35	
  
Try it yourself!
•  https://github.com/Cognifide/PoC-Sling-JMS
•  All bundles
•  Some documentation
•  Temporary repo, will be transferred, so clone it
while you can ;)
adaptTo() 2013
 36	
  
adaptTo() 2013
 37
That’s all folks!

More Related Content

What's hot

Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programmingAndrei Pangin
 
Heap Dump Analysis - AEM: Real World Issues
Heap Dump Analysis - AEM: Real World IssuesHeap Dump Analysis - AEM: Real World Issues
Heap Dump Analysis - AEM: Real World Issues
Kanika Gera
 
L04 Software Design Examples
L04 Software Design ExamplesL04 Software Design Examples
L04 Software Design Examples
Ólafur Andri Ragnarsson
 
OpenCV 에서 OpenCL 살짝 써보기
OpenCV 에서 OpenCL 살짝 써보기OpenCV 에서 OpenCL 살짝 써보기
OpenCV 에서 OpenCL 살짝 써보기
Seunghwa Song
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
National Cheng Kung University
 
Wishbone classic bus cycle
Wishbone classic bus cycleWishbone classic bus cycle
Wishbone classic bus cycle
dennis gookyi
 
Keeping innovation moving asml
Keeping innovation moving asmlKeeping innovation moving asml
Keeping innovation moving asml
ODINNNL
 
Rama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdf
Rama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdfRama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdf
Rama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdf
idsecconf
 
Crash course in verilog
Crash course in verilogCrash course in verilog
Crash course in verilog
Pantech ProLabs India Pvt Ltd
 
CNIT 127 Ch 1: Before you Begin
CNIT 127 Ch 1: Before you BeginCNIT 127 Ch 1: Before you Begin
CNIT 127 Ch 1: Before you Begin
Sam Bowne
 
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
Helder da Rocha
 

What's hot (11)

Java tricks for high-load server programming
Java tricks for high-load server programmingJava tricks for high-load server programming
Java tricks for high-load server programming
 
Heap Dump Analysis - AEM: Real World Issues
Heap Dump Analysis - AEM: Real World IssuesHeap Dump Analysis - AEM: Real World Issues
Heap Dump Analysis - AEM: Real World Issues
 
L04 Software Design Examples
L04 Software Design ExamplesL04 Software Design Examples
L04 Software Design Examples
 
OpenCV 에서 OpenCL 살짝 써보기
OpenCV 에서 OpenCL 살짝 써보기OpenCV 에서 OpenCL 살짝 써보기
OpenCV 에서 OpenCL 살짝 써보기
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
 
Wishbone classic bus cycle
Wishbone classic bus cycleWishbone classic bus cycle
Wishbone classic bus cycle
 
Keeping innovation moving asml
Keeping innovation moving asmlKeeping innovation moving asml
Keeping innovation moving asml
 
Rama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdf
Rama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdfRama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdf
Rama Tri Nanda - NFC Hacking Hacking NFC Reverse Power Supply Padlock.pdf
 
Crash course in verilog
Crash course in verilogCrash course in verilog
Crash course in verilog
 
CNIT 127 Ch 1: Before you Begin
CNIT 127 Ch 1: Before you BeginCNIT 127 Ch 1: Before you Begin
CNIT 127 Ch 1: Before you Begin
 
Threads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticasThreads 03: Ciclo de vida, aplicações e boas práticas
Threads 03: Ciclo de vida, aplicações e boas práticas
 

Similar to Inter-Sling communication with message queue

DDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkDDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFramework
banq jdon
 
Advanced Node.JS Meetup
Advanced Node.JS MeetupAdvanced Node.JS Meetup
Advanced Node.JS Meetup
LINAGORA
 
4Developers: Dominik Przybysz- Message Brokers
4Developers: Dominik Przybysz- Message Brokers4Developers: Dominik Przybysz- Message Brokers
4Developers: Dominik Przybysz- Message Brokers
PROIDEA
 
Grizzly 20080925 V2
Grizzly 20080925 V2Grizzly 20080925 V2
Grizzly 20080925 V2
Eduardo Pelegri-Llopart
 
OpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheConOpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheCon
os890
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slides
David Barreto
 
An approach to responsive, realtime with Backbone.js and WebSockets
An approach to responsive, realtime with Backbone.js and WebSocketsAn approach to responsive, realtime with Backbone.js and WebSockets
An approach to responsive, realtime with Backbone.js and WebSockets
Andrei Sebastian Cîmpean
 
Developing Microservices using Spring - Beginner's Guide
Developing Microservices using Spring - Beginner's GuideDeveloping Microservices using Spring - Beginner's Guide
Developing Microservices using Spring - Beginner's Guide
Mohanraj Thirumoorthy
 
Using Sumo Logic - Apr 2018
Using Sumo Logic - Apr 2018Using Sumo Logic - Apr 2018
Using Sumo Logic - Apr 2018
Sumo Logic
 
G pars
G parsG pars
OSGi Cloud Ecosystems (OSGi Users Forum Germany)
OSGi Cloud Ecosystems (OSGi Users Forum Germany)OSGi Cloud Ecosystems (OSGi Users Forum Germany)
OSGi Cloud Ecosystems (OSGi Users Forum Germany)
David Bosschaert
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?
Oliver Gierke
 
Android rest client applications-services approach @Droidcon Bucharest 2012
Android rest client applications-services approach @Droidcon Bucharest 2012Android rest client applications-services approach @Droidcon Bucharest 2012
Android rest client applications-services approach @Droidcon Bucharest 2012
Droidcon Eastern Europe
 
Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2 Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2
3camp
 
node.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoonnode.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoon
Jesang Yoon
 
The new and smart way to build microservices - Eclipse MicroProfile
The new and smart way to build microservices - Eclipse MicroProfileThe new and smart way to build microservices - Eclipse MicroProfile
The new and smart way to build microservices - Eclipse MicroProfile
Emily Jiang
 
Introduction to Lagom Framework
Introduction to Lagom FrameworkIntroduction to Lagom Framework
Introduction to Lagom Framework
Knoldus Inc.
 
Server-side JS with NodeJS
Server-side JS with NodeJSServer-side JS with NodeJS
Server-side JS with NodeJS
Lilia Sfaxi
 
OSGi DevCon 2009 Review
OSGi DevCon 2009 ReviewOSGi DevCon 2009 Review
OSGi DevCon 2009 Review
njbartlett
 
Liferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for DevelopersLiferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for Developers
Azilen Technologies Pvt. Ltd.
 

Similar to Inter-Sling communication with message queue (20)

DDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFrameworkDDD Framework for Java: JdonFramework
DDD Framework for Java: JdonFramework
 
Advanced Node.JS Meetup
Advanced Node.JS MeetupAdvanced Node.JS Meetup
Advanced Node.JS Meetup
 
4Developers: Dominik Przybysz- Message Brokers
4Developers: Dominik Przybysz- Message Brokers4Developers: Dominik Przybysz- Message Brokers
4Developers: Dominik Przybysz- Message Brokers
 
Grizzly 20080925 V2
Grizzly 20080925 V2Grizzly 20080925 V2
Grizzly 20080925 V2
 
OpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheConOpenWebBeans and DeltaSpike at ApacheCon
OpenWebBeans and DeltaSpike at ApacheCon
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slides
 
An approach to responsive, realtime with Backbone.js and WebSockets
An approach to responsive, realtime with Backbone.js and WebSocketsAn approach to responsive, realtime with Backbone.js and WebSockets
An approach to responsive, realtime with Backbone.js and WebSockets
 
Developing Microservices using Spring - Beginner's Guide
Developing Microservices using Spring - Beginner's GuideDeveloping Microservices using Spring - Beginner's Guide
Developing Microservices using Spring - Beginner's Guide
 
Using Sumo Logic - Apr 2018
Using Sumo Logic - Apr 2018Using Sumo Logic - Apr 2018
Using Sumo Logic - Apr 2018
 
G pars
G parsG pars
G pars
 
OSGi Cloud Ecosystems (OSGi Users Forum Germany)
OSGi Cloud Ecosystems (OSGi Users Forum Germany)OSGi Cloud Ecosystems (OSGi Users Forum Germany)
OSGi Cloud Ecosystems (OSGi Users Forum Germany)
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?
 
Android rest client applications-services approach @Droidcon Bucharest 2012
Android rest client applications-services approach @Droidcon Bucharest 2012Android rest client applications-services approach @Droidcon Bucharest 2012
Android rest client applications-services approach @Droidcon Bucharest 2012
 
Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2 Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2
 
node.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoonnode.js 실무 - node js in practice by Jesang Yoon
node.js 실무 - node js in practice by Jesang Yoon
 
The new and smart way to build microservices - Eclipse MicroProfile
The new and smart way to build microservices - Eclipse MicroProfileThe new and smart way to build microservices - Eclipse MicroProfile
The new and smart way to build microservices - Eclipse MicroProfile
 
Introduction to Lagom Framework
Introduction to Lagom FrameworkIntroduction to Lagom Framework
Introduction to Lagom Framework
 
Server-side JS with NodeJS
Server-side JS with NodeJSServer-side JS with NodeJS
Server-side JS with NodeJS
 
OSGi DevCon 2009 Review
OSGi DevCon 2009 ReviewOSGi DevCon 2009 Review
OSGi DevCon 2009 Review
 
Liferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for DevelopersLiferay (DXP) 7 Tech Meetup for Developers
Liferay (DXP) 7 Tech Meetup for Developers
 

More from Tomasz Rękawek

Radio ad blocker
Radio ad blockerRadio ad blocker
Radio ad blocker
Tomasz Rękawek
 
Deep-dive into cloud-native AEM deployments based on Kubernetes
Deep-dive into cloud-native AEM deployments based on KubernetesDeep-dive into cloud-native AEM deployments based on Kubernetes
Deep-dive into cloud-native AEM deployments based on Kubernetes
Tomasz Rękawek
 
Emulating Game Boy in Java
Emulating Game Boy in JavaEmulating Game Boy in Java
Emulating Game Boy in Java
Tomasz Rękawek
 
Zero downtime deployments for the Sling-based apps using Docker
Zero downtime deployments for the Sling-based apps using DockerZero downtime deployments for the Sling-based apps using Docker
Zero downtime deployments for the Sling-based apps using Docker
Tomasz Rękawek
 
CRX2Oak - all the secrets of repository migration
CRX2Oak - all the secrets of repository migrationCRX2Oak - all the secrets of repository migration
CRX2Oak - all the secrets of repository migration
Tomasz Rękawek
 
SlingQuery
SlingQuerySlingQuery
SlingQuery
Tomasz Rękawek
 
Code metrics
Code metricsCode metrics
Code metrics
Tomasz Rękawek
 
Sling Dynamic Include
Sling Dynamic IncludeSling Dynamic Include
Sling Dynamic Include
Tomasz Rękawek
 
Shooting rabbits with sling
Shooting rabbits with slingShooting rabbits with sling
Shooting rabbits with sling
Tomasz Rękawek
 

More from Tomasz Rękawek (9)

Radio ad blocker
Radio ad blockerRadio ad blocker
Radio ad blocker
 
Deep-dive into cloud-native AEM deployments based on Kubernetes
Deep-dive into cloud-native AEM deployments based on KubernetesDeep-dive into cloud-native AEM deployments based on Kubernetes
Deep-dive into cloud-native AEM deployments based on Kubernetes
 
Emulating Game Boy in Java
Emulating Game Boy in JavaEmulating Game Boy in Java
Emulating Game Boy in Java
 
Zero downtime deployments for the Sling-based apps using Docker
Zero downtime deployments for the Sling-based apps using DockerZero downtime deployments for the Sling-based apps using Docker
Zero downtime deployments for the Sling-based apps using Docker
 
CRX2Oak - all the secrets of repository migration
CRX2Oak - all the secrets of repository migrationCRX2Oak - all the secrets of repository migration
CRX2Oak - all the secrets of repository migration
 
SlingQuery
SlingQuerySlingQuery
SlingQuery
 
Code metrics
Code metricsCode metrics
Code metrics
 
Sling Dynamic Include
Sling Dynamic IncludeSling Dynamic Include
Sling Dynamic Include
 
Shooting rabbits with sling
Shooting rabbits with slingShooting rabbits with sling
Shooting rabbits with sling
 

Recently uploaded

GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
KatiaHIMEUR1
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
Quotidiano Piemontese
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
Neo4j
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
名前 です男
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
danishmna97
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Vladimir Iglovikov, Ph.D.
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
Rohit Gautam
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
ControlCase
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
innovationoecd
 
20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website
Pixlogix Infotech
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
Matthew Sinclair
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
SOFTTECHHUB
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
TIPNGVN2
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Speck&Tech
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems S.M.S.A.
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
Uni Systems S.M.S.A.
 

Recently uploaded (20)

GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !Securing your Kubernetes cluster_ a step-by-step guide to success !
Securing your Kubernetes cluster_ a step-by-step guide to success !
 
National Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practicesNational Security Agency - NSA mobile device best practices
National Security Agency - NSA mobile device best practices
 
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
GraphSummit Singapore | Neo4j Product Vision & Roadmap - Q2 2024
 
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
みなさんこんにちはこれ何文字まで入るの?40文字以下不可とか本当に意味わからないけどこれ限界文字数書いてないからマジでやばい文字数いけるんじゃないの?えこ...
 
How to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptxHow to Get CNIC Information System with Paksim Ga.pptx
How to Get CNIC Information System with Paksim Ga.pptx
 
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AIEnchancing adoption of Open Source Libraries. A case study on Albumentations.AI
Enchancing adoption of Open Source Libraries. A case study on Albumentations.AI
 
Large Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial ApplicationsLarge Language Model (LLM) and it’s Geospatial Applications
Large Language Model (LLM) and it’s Geospatial Applications
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
PCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase TeamPCI PIN Basics Webinar from the Controlcase Team
PCI PIN Basics Webinar from the Controlcase Team
 
Presentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of GermanyPresentation of the OECD Artificial Intelligence Review of Germany
Presentation of the OECD Artificial Intelligence Review of Germany
 
20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website20 Comprehensive Checklist of Designing and Developing a Website
20 Comprehensive Checklist of Designing and Developing a Website
 
20240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 202420240609 QFM020 Irresponsible AI Reading List May 2024
20240609 QFM020 Irresponsible AI Reading List May 2024
 
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
Goodbye Windows 11: Make Way for Nitrux Linux 3.5.0!
 
Data structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdfData structures and Algorithms in Python.pdf
Data structures and Algorithms in Python.pdf
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
Cosa hanno in comune un mattoncino Lego e la backdoor XZ?
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
Uni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdfUni Systems Copilot event_05062024_C.Vlachos.pdf
Uni Systems Copilot event_05062024_C.Vlachos.pdf
 
Microsoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdfMicrosoft - Power Platform_G.Aspiotis.pdf
Microsoft - Power Platform_G.Aspiotis.pdf
 

Inter-Sling communication with message queue

  • 1. APACHE SLING & FRIENDS TECH MEETUP BERLIN, 23-25 SEPTEMBER 2013 Inter-Sling communication with a message queue Tomasz Rękawek
  • 2. Agenda •  Code bookmarks •  http://bit.ly/adaptto-jms •  Case 1: shared session •  Running ActiveMQ in Sling •  JMS connection provider •  Case 2: JMS-based discovery API implementation •  Sling Message Listener •  Case 3: Reverse replication request •  Targeting instance by its run mode adaptTo() 2013 2  
  • 3. adaptTo() 2013 3 Solution overview Shared session
  • 4. Shared session •  We have n publishes and the dispatcher with stickySession enabled •  We use the servlet session •  In case one publish stops responding, the user will be redirected to the other publish •  We want the session to be transferred too adaptTo() 2013 4  
  • 6. Shared session •  If a publish notices that the instance id in the cookie is different from its own, it’ll copy shared session values to the HttpSession   •  The Administrator can configure names of the shared session properties (as a list of regular expressions)   adaptTo() 2013 6  
  • 7. Shared session – demo •  Local infrastructure description: •  One author + two publishes •  All available under local.cq  domain •  We can switch between publishes using ?publish2   query string •  http://local.cq/bin/cognifide/session.txt •  http://local.cq/bin/cognifide/session.txt/add •  http://local.cq/bin/cognifide/session.txt? publish2 adaptTo() 2013 7  
  • 8. adaptTo() 2013 8 Shared session implementation details Integrating ActiveMQ
  • 9. Rough start: dependencies •  I tried to use the activemq-­‐core  package. This is what I saw in the /system/console: adaptTo() 2013 9  
  • 10. Providing necessary dependencies •  Some dependencies are taken from other OSGi bundles – we don’t worry about them •  Some have to be embedded <Embed-­‐Dependency>activemq-­‐core,geronimo-­‐j2ee-­‐ management_1.1_spec,ejb-­‐api,jaxrpc-­‐api</Embed-­‐Dependency>   •  Some can be ignored •  Check the original pom.xml  for optional dependencies <Import-­‐Package>   !javax.jmdns.*,!org.apache.activeio.*,! org.apache.activemq.jaas.*,!org.apache.camel.*,! org.apache.commons.net.*,…,*   </Import-­‐Package>   adaptTo() 2013 10  
  • 11. Result: sling-­‐jms-­‐activemq   •  We’ve created an OSGi bundle with all necessary dependencies embedded •  Optional dependencies are ignored and marked not-to-import •  Bundle provides ActiveMQ to any Sling instance adaptTo() 2013 11  
  • 12. adaptTo() 2013 12 Shared session implementation details JMS Connection Provider
  • 13. Creating JMS connection with ActiveMQ adaptTo() 2013 13 import  javax.jms.Connection;   import  org.apache.activemq.ActiveMQConnectionFactory;     ActiveMQConnectionFactory  factory;   factory  =  new  ActiveMQConnectionFactory();   Connection  connection  =  factory.createConnection();   •  In order to create JMS connection we need to import some ActiveMQ classes: •  So all JMS-related code will be also dependent on the ActiveMQ •  What if we want to change JMS implementation?
  • 14. JMS connection provider   •  We use OSGi to separate JMS implementation from it’s interface •  JmsConnectionProvider – custom OSGi service providing javax.jms.Connection   •  Bundle sling-­‐jms-­‐api  contains service interface •  Implementation: sling-­‐jms-­‐impl-­‐activemq   •  Using sling-­‐jms-­‐api  and the connection provider makes us independent from the JMS implementation adaptTo() 2013 14  
  • 15. Example usage of JMS connection provider   @Component   public  class  MyComponent  implements  MessageListener  {          @Reference        private  JmsConnectionProvider  connectionProvider;          private  javax.jms.Connection  connection;          @Activate        protected  void  activate()  throws  JMSException  {              connection  =  connectionProvider.getConnection();        }          @Deactivate        protected  void  deactivate()  throws  JMSException  {              connection.close();        }   }   adaptTo() 2013 15  
  • 16. adaptTo() 2013 16 API overview & our JMS implementation Discovery API
  • 17. Sling Discovery API •  New Sling API •  Each instance can expose a list of key-value properties to other instances •  Example usage: metadata for workflow offloading in CQ •  Properties are not meant to be messaging tool, they shouldn’t change too often •  Instances are grouped into clusters, each cluster has elected leader adaptTo() 2013 17  
  • 19. Discovery OSGi services •  DiscoveryService provides TopologyView   •  Custom instance properties can be added with PropertyProvider implementations •  Changes in topology can be observed with TopologyEventListener adaptTo() 2013 19  
  • 20. JMS discovery implementation •  There is a default HTTP-based implementation •  requires providing all instance URLs on each instance •  But JMS is a natural choice for the transport layer here •  sling-­‐jms-­‐discovery  – a new, JMS-based discovery implementation that doesn’t require any configuration adaptTo() 2013 20  
  • 21. Discovery election •  If some instance notices there is no leader for some cluster, it sends message: WHO_IS_LEADER   •  If no one responds in 10 seconds, it sends the second message: ELECTION   •  Every instance in a given cluster has to respond with their Sling instance id in the VOTE message •  After 5 seconds instance with the smallest id is chosen and it sends the I_AM_LEADER message adaptTo() 2013 21  
  • 22. Discovery – demo •  http://local.cq:4503/bin/jms/discovery/info.txt adaptTo() 2013 22  
  • 23. adaptTo() 2013 23 JMS discovery implementation details Sling Message Consumer
  • 24. Sling Message Listener Writing JMS consumers in OSGi is all about @Component   public  class  MyComponent  implements  MessageListener  {          @Reference        private  JmsConnectionProvider  connectionProvider;        private  Connection  connection;        private  Session  session;        private  MessageConsumer  consumer;          @Activate        protected  void  activate()  throws  JMSException  {              connection  =  connectionProvider.getConnection();              session  =  connection.createSession(false,  Session.AUTO_ACKNOWLEDGE);              Destination  dest  =  session.createTopic("my  topic");              consumer  =  session.createConsumer(dest);              consumer.setMessageListener(this);              connection.start();        }          @Deactivate        protected  void  deactivate()  throws  JMSException  {              consumer.close();              session.close();              connection.close();        }   }   adaptTo() 2013 24  
  • 25. Sling Message Listener Why don’t we @SlingMessageConsumer(          destinationType  =  DestinationType.TOPIC,          subject  =  "my  topic")   public  class  MyComponent  implements  MessageListener  {                    public  void  onMessage(Message  msg)  {   //  …   adaptTo() 2013 25   •  @SlingMessageConsumer annotation is transformed into @Service, @Component  and @Properties by our sling-­‐jms-­‐scr  plugin   •  MessageListener services are collected by our MessageConsumerRegistry OSGi component •  Registry component creates JMS consumers and forward messages to appropriate listeners
  • 26. Sling Message Listener – filtering In the message listener configuration you can add the filter property to filter out incoming messages. Use the LDAP format: @SlingMessageConsumer(        destinationType  =  DestinationType.TOPIC,        subject  =  "my  topic"        filter  =  "(requestType=VOTE)")   adaptTo() 2013 26  
  • 27. adaptTo() 2013 27 Solution overview Reverse Replication Request
  • 28. Reverse replication request •  In CQ, the Author gathers content from publish instances every 30 seconds (configurable in the ReverseReplicator service) •  Why can’t publish send user-generated content to the Author (push instead of pull)? •  Security issues – publishes are often in DMZ •  But publish can inform the Author there is something new to pull adaptTo() 2013 28  
  • 29. Reverse replication request •  OutboxEventHandler watches the outbox node and sends information every time there is some new content to pull •  ReplicationAgentInvoker receives this information and invokes the reverse replication process •  It’s a good idea to disable the out-of-the-box ReverseReplicator service, so we don’t have two reverse replications at the same moment adaptTo() 2013 29  
  • 30. Reverse replication request flow Author'Publish' User/generated'content' OutboxEventHandler' Replica<onAgentInvoker' Reverse'replica<on'agent'Outbox' Send'JMS'msg' Pull'content' adaptTo() 2013 30  
  • 31. adaptTo() 2013 31 Reverse replication request implementation details Targeting messages with the Sling run mode
  • 32. Send messages only to the Author •  The outbox event handler should send messages only to the Author •  We can filter it manually… •  …or use @SlingMessageConsumer  for the consumer and add MessageConsumerProperties.DESTINATION_RUN_MODE  to the message properties •  Messages will be filtered automatically adaptTo() 2013 32  
  • 34. Extra tools created during JMS research •  Embedded ActiveMQ broker configurable within the OSGi component •  Out-of-the-band JCR binaries transfer •  You can send a message with metadata and some JCR path and the binary itself will be sent via HTTP •  Utilities to deal with serialization problems when sending ObjectMessage   adaptTo() 2013 34  
  • 35. Bundles overview •  sling-­‐jms-­‐activemq   •  ActiveMQ + dependencies •  sling-­‐jms-­‐api   •  JMS Connection Provider •  Sling Message Consumer •  Blob & Object message utils •  sling-­‐jms-­‐impl-­‐activemq   •  Implementation of the API tools •  sling-­‐jms-­‐scr   •  Annotation processor for Sling Message Consumer •  sling-­‐jms-­‐sandbox   •  Example usage of the API tools •  Open-sourced use cases •  sling-­‐jms-­‐discovery   •  cq-­‐jms-­‐replication   •  sling-­‐jms-­‐session   adaptTo() 2013 35  
  • 36. Try it yourself! •  https://github.com/Cognifide/PoC-Sling-JMS •  All bundles •  Some documentation •  Temporary repo, will be transferred, so clone it while you can ;) adaptTo() 2013 36