SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
Implementing Messaging
Patterns in JavaScript using
the OpenAjax Hub

Kevin Hakanson
Twin Cities Code Camp 11
8-9 October 2011
Are You In The Right Place?
● This talk:
○ Is your web application a tightly coupled, DOM event handler
mess? Use techniques from the Enterprise Integration Patterns book to
build better components. Concepts including message, publishsubscribe channel, request-reply and message filter will be demonstrated
in JavaScript (along with corresponding tests) using the OpenAjax Hub.

● This speaker:
○ Kevin Hakanson is an application architect for Thomson Reuters where
he is focused on highly, scalable web applications. His background
includes both .NET and Java, but he is most nostalgic about Lotus
Notes. He has been developing professionally since 1994 and holds a
Master’s degree in Software Engineering. When not staring at a
computer screen, he is probably staring at another screen, either
watching TV or playing video games with his family.
Kevin Hakanson
@hakanson
#tccc11

kevin.hakanson@gmail.com

github.com/hakanson/tccc11

stackoverflow.com/users/22514/kevin-hakanson
What to Expect
● "Based on a True Story"
○ derived from production code from large scale, web app
● Enterprise Integration Patterns
○ selected patterns from the book
● JavaScript Libraries
○ OpenAjax, jQuery, QUnit
● Problems + Patterns + Tests
● Living on the edge
○ Google docs presentation, Cloud9 IDE, github
● Questions (OK during presentation)
Let's Get Started!
Problem
● large scale web application
● multiple teams with separate code bases
● iterative development, but long duration project
● continuous integration, build/deploy on check in
● primary touch point is in browser
● automated regression tests
● make all this work without app constantly breaking
Architect Talk
● Treat UI components (widgets) like services in the browser
which operate independent of each other
○ however, some have no UI and are invisible services
● Think in terms of application level messages between
components instead of direct wiring/capturing another
components raw DOM events
○ internal component interaction can be DOM or custom
event based
● Hierarchical channels with naming standard and wildcard
subscriptions. Long lived and should be namespaced.
● Forwards and backwards version compatibility
insert "Ivory Tower Architect" joke here :)
Demo
$( ".slide[title='Demo']" ).focus( function() {
window.location.href = "demo.html";
});
Enterprise Integration Patterns
Enterprise Integration Patterns:
Designing, Building, and Deploying Messaging Solutions
By Gregor Hohpe, Bobby Woolf
Published Oct 10, 2003 by Addison-Wesley Professional. Part
of the Addison-Wesley Signature Series (Fowler) series.
ISBN-10: 0-321-20068-3
ISBN-13: 978-0-321-20068-6

http://www.enterpriseintegrationpatterns.com/
Pattern icon, pattern name, problem and solution
statements, and sketch available under the
Creative Commons Attribution license.
List of Patterns
Messaging Systems:
● Message Channel, Message, Pipes and Filters, Message Router, Message Translator, Message
Endpoint
Messaging Channels:
● Point-to-Point Channel, Publish-Subscribe Channel, Datatype Channel, Invalid Message Channel,
Dead Letter Channel, Guaranteed Delivery, Channel Adapter, Messaging Bridge, Message Bus
Message Construction:
● Command Message, Document Message, Event Message, Request-Reply, Return Address,
Correlation Identifier, Message Sequence, Message Expiration, Format Indicator
Message Routing:
● Content-Based Router, Message Filter, Dynamic Router, Recipient List, Splitter, Aggregator,
Resequencer, Composed Msg. Processor, Scatter-Gather, Routing Slip, Process Manager, Message
Broker
Message Transformation:
● Envelope Wrapper, Content Enricher, Content Filter, Claim Check, Normalizer, Canonical Data Model
Messaging Endpoints:
● Messaging Gateway, Messaging Mapper, Transactional Client, Polling Consumer, Event-Driven
Consumer, Competing Consumers, Message Dispatcher, Selective Consumer, Durable Subscriber,
Idempotent Receiver, Service Activator
System Management:
● Control Bus, Detour, Wire Tap, Message History, Message Store, Smart Proxy, Test Message,
Channel Purger
JavaScript Publish-Subscribe Options
● jQuery custom events (api.jquery.com/category/events/)
○ flat name with optional, restricting namespace
○ reflects DOM structure, including event bubbling
○ API: bind, unbind, trigger
● AmplifyJS Pub/Sub (amplifyjs.com/api/pubsub/)
○ cleaner interface that jQuery custom events
○ subscriptions can request priority and/or prevent
other callbacks from being invoked
○ API: subscribe, unsubscribe, publish
● OpenAjax Hub 1.0 (www.openajax.org)
○ simple and lightweight publish/subscribe engine
○ hierarchical event names with wildcard subscriptions
○ API: subscribe, unsubscribe, publish
QUnit
"QUnit is a powerful, easy-to-use, JavaScript test suite. It's
used by the jQuery project to test its code and plugins but is
capable of testing any generic JavaScript code."
http://docs.jquery.com/Qunit
QUnit Example
test("a basic test example", function() {
ok( true, "this test is fine" );
var value = "hello";
equal( value, "hello", "We expect value to be hello" );
});
Tests
● QUnit tests of jQuery custom events
○ https://github.com/hakanson/tccc11/blob/master/tests/jquery.tests.js

○ http://jsfiddle.net/hakanson/5bgjd/
● QUnit tests of AmplifyJS Pub/Sub
○ https://github.com/hakanson/tccc11/blob/master/tests/amplify.tests.js

○ http://jsfiddle.net/hakanson/zy6Dy/
$.hub
● jQuery plug-in created for this talk
○ derived from production code
● Builds on top of OpenAjax Hub functionality
● API:
○ subscribe, unsubscribe, publish
○ guid, message
○ createVersionFilter, createIdempotentFilter
○ reply, requestReply
Problem (again)
● make all this work without app constantly breaking
Message Channel (60)
How does one application communicate with another using
messaging?

Connect the applications using a Message Channel, where one
application writes information to the channel and the other one
reads that information from the channel.
Message (66)
How can two applications connected by a message channel
exchange a piece of information?

Package the information into a Message, a data record that the
messaging system can transmit through a message channel.
Publish-Subscribe Channel (106)
How can the sender broadcast an event to all interested
receivers?

Send the event on a Publish-Subscribe Channel, which delivers
a copy of a particular event to each receiver.
channel parameter
● the name of the event to listen for
○ OpenAjax - name
○ AmplifyJS - topic
○ jQuery custom events - eventType
○ elsewhere - subject
message parameter
● An arbitrary Object holding extra information that will be
passed as an argument to the handler function
○ OpenAjax - publisherData
○ jQuery custom events - extraParameters
○ AmplifyJS - additional parameters
callback parameter
● a function object reference to be called when a subscription
receives data
● should play nice and handle:
○ own errors and not throw exceptions
○ being called synchronous and not perform long running
operations
○ being called asynchronous (depending on implementation)
● scope parameter
○ what this is when callback is invoked (default window)
○ AmplifyJS - context
○ or use callback, scope with $.proxy( function, context )
Test Excerpt
$.hub.subscribe( "A", function( channel, message ) {
countA++;
});
$.hub.subscribe( "A.*", function( channel, message ) {
countAstar++;
});
$.hub.subscribe( "A.**", function( channel, message ) {
countAstarstar++;
});
$.hub.subscribe( "A.1", function( channel, message ) {
countA1++;
});
$.hub.subscribe( "A.1.a", function( channel, message ) {
countA1a++;
});
$.hub.publish( "A", message );
$.hub.publish( "A.1", message );
$.hub.publish( "A.1.a", message );
$.hub.publish( "A.1.b", message );
Demo (Updated)
$.get("demo.html", function(data) {
data.replace( "demo.js", "demo-updated.js" );
});
Architect Talk
● If messages published on a channel carry same type of
body, then channel names identify types of messages
○ Message is channel + headers + body
● Message body carries data payload; defined by specification
○ in future could use XML or JSON schema
● Message should be serializable (JSON) and not contain
functions or logic
○ better for immutability/tampering and cross domain
usages (iframes, client to server)
Datatype Channel (111)
How can the application send a data item such that the receiver
will know how to process it?

Use a separate Datatype Channel for each data type, so that
all data on a particular channel is of the same type.
Document Message (147)
How can messaging be used to transfer data between
applications?

Use a Document Message to reliably transfer a data structure
between applications.
$.hub.message
{
"timestamp": 1317961214398,
"messageId": "31525258-8ca4-464f-96da-668e52a6cad9",
"formatVersion": "0",
"body": {
"key1": "value1",
"key2": "value2"
}
}
Test Excerpt
var channel = "name",
messageBody = { "key1": "value1", "key2": "value2"},
actualMessage,
actualChannel;
var subscription = $.hub.subscribe( channel,
function( channel, message ) {
actualChannel = channel;
actualMessage = message;
});
var message = $.hub.message( messageBody );
$.hub.publish( channel, message );
$.hub.unsubscribe( subscription );
Problem
● Two components exist on a web page
○ first component subscribes to messages from the second
component
○ second component publishes message during initialization
● When <script> tags are reordered, the functionality breaks
because second component publishes its message before
first component has a chance to subscribe
○ components on page have temporal coupling
● Need the equivalent of jQuery $.ready() for hub
Durable Subscriber (522)
How can a subscriber avoid missing messages while it’s not
listening for them?

Use a Durable Subscriber to make the messaging system save
messages published while the subscriber is disconnected.
Test Excerpt
// tell hub to save messages
$.hub({ ready: false });
// publish before any active subscribers
$.hub.publish( channelA, messageA );
var subscriptionA = $.hub.subscribe(channelA,
function( channel, message ) {
actualChannel = channel;
actualMessage = message;
});
// tell hub to delivery saved messages
$.hub({ ready: true });
Architect Talk
● Need message body to be backwards compatible in both
structure and meaning
○ otherwise need versioning scheme and strategy for both
old and new versions of a message to be published
● A filter on version is important for backwards and forwards
compatibility, so your code doesn't break when a new
version of the message is published
○ using the filter parameter allows you to put the guard
outside of the callback instead of inside it (think of the filter
like an aspect)
Format Indicator (180)
How can a message’s data format be designed to allow for
possible future changes?

Design a data format that includes a Format Indicator, so that
the message specifies what format it is using.
Selective Consumer (515)
How can a message consumer select which messages it
wishes to receive?

Make the consumer a Selective Consumer, one that filteres the
messages delivered by its channel so that it only receives the
ones that match its criteria.
filter parameter
● A function that returns true or false to either match or deny a
match of the published event
Test Excerpt
var m1 = $.hub.message({
{ formatVersion: "1"
var m2 = $.hub.message({
{ formatVersion: "2"

name: "Kevin Hakanson" },
});
firstname: "Kevin", lastname: "Hakanson" },
});

function callbackV1( channel, message ) {
countV1++;
}
function callbackV2( channel, message ) {
countV2++;
}
$.hub.subscribe( "Person.*", callbackV1, null, null,
$.hub.createVersionFilter( "1" ) );
$.hub.subscribe( "Person.*", callbackV2, null, null,
$.hub.createVersionFilter( "2" ) );
$.hub.publish( "Person.Cool", m1 );
$.hub.publish( "Person.Cool", m2 );
Message Translator (85)
How can systems using different data formats communicate
with each other using messaging?

Use a special filter, a Message Translator, between other filters
or applications to translate one data format into another.
Test Excerpt
var m2 = $.hub.message({ firstname: "Kevin", lastname: "Hakanson" },
{ formatVersion: "2" });
function callbackV1(channel, message ) {
countV1++;
}
function callbackV2(channel, message ) {
countV2++;
var name = message.body.firstname + " " + message.body.lastname;
var translatedMessage = $.hub.message( { name: name },
{ formatVersion: "1" } );
$.hub.publish( channel, translatedMessage );
}
subscriber1 = $.hub.subscribe(
$.hub.createVersionFilter(
subscriber2 = $.hub.subscribe(
$.hub.createVersionFilter(

"Person.*", callbackV1, null, null,
"1" ) );
"Person.*", callbackV2, null, null,
"2" ) );

$.hub.publish( "Person.Cool", m2 );
Idempotent Receiver
How can a message receiver deal with duplicate messages?

Design a receiver to be an Idempotent Receiver--one that can
safely receive the same message multiple times.
Test Excerpt
var m1 = $.hub.message({}),
m2 = $.hub.message({});
function callback1( channel, message ) {
count1++;
}
function callback2( channel, message ) {
count2++;
}
$.hub.subscribe( channel, callback1, null, null, createIdempotentFilter
() );
$.hub.subscribe( channel, callback2, null, null, createIdempotentFilter
() );
$.hub.publish( channel, m1 );
$.hub.publish( channel, m1 );
$.hub.publish( channel, m2 );
$.hub.publish( channel, m2 );
$.hub.publish( channel, m2 );
Problem
● How to replace directly calling functions with messaging?
● Want to do something like below, without common coupling
(sharing a global variable).
○ var component1 = new Component1();
component1.command();
var reply = component1.request({});
Request-Reply (154)
When an application sends a message, how can it get a
response from the receiver?

Send a pair of Request-Reply messages, each on its own
channel.
Return Address (159)
How does a replier know where to send the reply?

The request message should contain a Return Address that
indicates where to send the reply message.
Correlation Identifier (163)
How does a requestor that has received a reply know which
request this is the reply for?

Each reply message should contain a Correlation Identifier, a
unique identifier that indicates which request message this
reply is for.
Test Excerpt
$.hub.subscribe(channel, function( channel, message ) {
actualChannel = channel;
actualMessage = message;
$.hub.reply( message, replyMessage );
});
$.hub.requestReply(channel, message,
function( channel, message ) {
actualReplyMessage = message;
correlationId = message.correlationId;
});
Command Message (145)
How can messaging be used to invoke a procedure in another
application?

Use a Command Message to reliably invoke a procedure in
another application.
Message Endpoint (95)
How does an application connect to a messaging channel to
send and receive messages?

Connect an application to a messaging channel using a
Message Endpoint, a client of the messaging system that the
application can then use to send or receive messages.
Test Excerpt
// create a message endpoint to call counter.increment()
var subscription = $.hub.subscribe( channel,
function( channel, message ) {
counter.increment( message );
});
counter.increment( 2 );
// send command message to increment by 2
$.hub.publish( channel, 2 );
Summary
● Patterns help us find appropriate solutions in the software
architecture and design process.
● Using Publish/Subscribe events for browser communication
adds a level of indirection between the JavaScript
components.
● Using a common messaging structure for the events
(including naming and versioning) make things more
predictable.
● Libraries are not enough; knowledge of JavaScript and the
DOM is essential for good widget design and interaction.
Q&A

Contenu connexe

Similaire à Implementing Messaging Patterns in JavaScript using the OpenAjax Hub

Serverless by Example: Building a Real-Time Chat System
Serverless by Example: Building a Real-Time Chat SystemServerless by Example: Building a Real-Time Chat System
Serverless by Example: Building a Real-Time Chat SystemAmazon Web Services
 
Android Trainning Session 2
Android Trainning  Session 2Android Trainning  Session 2
Android Trainning Session 2Shanmugapriya D
 
OpenSouthCode 2018 - Integrating your applications easily with Apache Camel
OpenSouthCode 2018 - Integrating your applications easily with Apache CamelOpenSouthCode 2018 - Integrating your applications easily with Apache Camel
OpenSouthCode 2018 - Integrating your applications easily with Apache CamelJosé Román Martín Gil
 
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin MeetingDDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin MeetingJaime Martin Losa
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWAREFIWARE
 
F5 Automation and service discovery
F5 Automation and service discoveryF5 Automation and service discovery
F5 Automation and service discoveryScott van Kalken
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performanceAndrew Rota
 
Azure Service Fabric and the Actor Model: when did we forget Object Orientation?
Azure Service Fabric and the Actor Model: when did we forget Object Orientation?Azure Service Fabric and the Actor Model: when did we forget Object Orientation?
Azure Service Fabric and the Actor Model: when did we forget Object Orientation?João Pedro Martins
 
Unified Messaging and Data Streaming 101
Unified Messaging and Data Streaming 101Unified Messaging and Data Streaming 101
Unified Messaging and Data Streaming 101Timothy Spann
 
Delivering IaaS with Open Source Software
Delivering IaaS with Open Source SoftwareDelivering IaaS with Open Source Software
Delivering IaaS with Open Source SoftwareMark Hinkle
 
Internationalizing The New York Times
Internationalizing The New York TimesInternationalizing The New York Times
Internationalizing The New York TimesScott Taylor
 
Azure + WP7 - CodePaLOUsa
Azure + WP7 - CodePaLOUsaAzure + WP7 - CodePaLOUsa
Azure + WP7 - CodePaLOUsaSam Basu
 
AxonHub beta release 11 april 2018
AxonHub beta release 11 april 2018AxonHub beta release 11 april 2018
AxonHub beta release 11 april 2018Frans van Buul
 
Windows Azure - Uma Plataforma para o Desenvolvimento de Aplicações
Windows Azure - Uma Plataforma para o Desenvolvimento de AplicaçõesWindows Azure - Uma Plataforma para o Desenvolvimento de Aplicações
Windows Azure - Uma Plataforma para o Desenvolvimento de AplicaçõesComunidade NetPonto
 
Building and deploying LLM applications with Apache Airflow
Building and deploying LLM applications with Apache AirflowBuilding and deploying LLM applications with Apache Airflow
Building and deploying LLM applications with Apache AirflowKaxil Naik
 

Similaire à Implementing Messaging Patterns in JavaScript using the OpenAjax Hub (20)

Signal R 2015
Signal R 2015Signal R 2015
Signal R 2015
 
Serverless by Example: Building a Real-Time Chat System
Serverless by Example: Building a Real-Time Chat SystemServerless by Example: Building a Real-Time Chat System
Serverless by Example: Building a Real-Time Chat System
 
Android Trainning Session 2
Android Trainning  Session 2Android Trainning  Session 2
Android Trainning Session 2
 
Event driven systems
Event driven systems Event driven systems
Event driven systems
 
OpenSouthCode 2018 - Integrating your applications easily with Apache Camel
OpenSouthCode 2018 - Integrating your applications easily with Apache CamelOpenSouthCode 2018 - Integrating your applications easily with Apache Camel
OpenSouthCode 2018 - Integrating your applications easily with Apache Camel
 
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin MeetingDDS Advanced Tutorial - OMG June 2013 Berlin Meeting
DDS Advanced Tutorial - OMG June 2013 Berlin Meeting
 
Developing your first application using FIWARE
Developing your first application using FIWAREDeveloping your first application using FIWARE
Developing your first application using FIWARE
 
F5 Automation and service discovery
F5 Automation and service discoveryF5 Automation and service discovery
F5 Automation and service discovery
 
Ten practical ways to improve front-end performance
Ten practical ways to improve front-end performanceTen practical ways to improve front-end performance
Ten practical ways to improve front-end performance
 
Micro service architecture
Micro service architectureMicro service architecture
Micro service architecture
 
Unit 1
Unit  1Unit  1
Unit 1
 
Azure Service Fabric and the Actor Model: when did we forget Object Orientation?
Azure Service Fabric and the Actor Model: when did we forget Object Orientation?Azure Service Fabric and the Actor Model: when did we forget Object Orientation?
Azure Service Fabric and the Actor Model: when did we forget Object Orientation?
 
Unified Messaging and Data Streaming 101
Unified Messaging and Data Streaming 101Unified Messaging and Data Streaming 101
Unified Messaging and Data Streaming 101
 
Delivering IaaS with Open Source Software
Delivering IaaS with Open Source SoftwareDelivering IaaS with Open Source Software
Delivering IaaS with Open Source Software
 
Internationalizing The New York Times
Internationalizing The New York TimesInternationalizing The New York Times
Internationalizing The New York Times
 
Azure + WP7 - CodePaLOUsa
Azure + WP7 - CodePaLOUsaAzure + WP7 - CodePaLOUsa
Azure + WP7 - CodePaLOUsa
 
AxonHub beta release 11 april 2018
AxonHub beta release 11 april 2018AxonHub beta release 11 april 2018
AxonHub beta release 11 april 2018
 
Windows Azure - Uma Plataforma para o Desenvolvimento de Aplicações
Windows Azure - Uma Plataforma para o Desenvolvimento de AplicaçõesWindows Azure - Uma Plataforma para o Desenvolvimento de Aplicações
Windows Azure - Uma Plataforma para o Desenvolvimento de Aplicações
 
Building and deploying LLM applications with Apache Airflow
Building and deploying LLM applications with Apache AirflowBuilding and deploying LLM applications with Apache Airflow
Building and deploying LLM applications with Apache Airflow
 
Rethinking The Policy Agent
Rethinking The Policy AgentRethinking The Policy Agent
Rethinking The Policy Agent
 

Plus de Kevin Hakanson

Sharpen your "Architectural Documentation" Saw
Sharpen your "Architectural Documentation" SawSharpen your "Architectural Documentation" Saw
Sharpen your "Architectural Documentation" SawKevin Hakanson
 
Who's in your Cloud? Cloud State Monitoring
Who's in your Cloud? Cloud State MonitoringWho's in your Cloud? Cloud State Monitoring
Who's in your Cloud? Cloud State MonitoringKevin Hakanson
 
Adopting Multi-Cloud Services with Confidence
Adopting Multi-Cloud Services with ConfidenceAdopting Multi-Cloud Services with Confidence
Adopting Multi-Cloud Services with ConfidenceKevin Hakanson
 
Introduction to Speech Interfaces for Web Applications
Introduction to Speech Interfaces for Web ApplicationsIntroduction to Speech Interfaces for Web Applications
Introduction to Speech Interfaces for Web ApplicationsKevin Hakanson
 
ng-owasp: OWASP Top 10 for AngularJS Applications
ng-owasp: OWASP Top 10 for AngularJS Applicationsng-owasp: OWASP Top 10 for AngularJS Applications
ng-owasp: OWASP Top 10 for AngularJS ApplicationsKevin Hakanson
 
Securing TodoMVC Using the Web Cryptography API
Securing TodoMVC Using the Web Cryptography APISecuring TodoMVC Using the Web Cryptography API
Securing TodoMVC Using the Web Cryptography APIKevin Hakanson
 
Make your own Print & Play card game using SVG and JavaScript
Make your own Print & Play card game using SVG and JavaScriptMake your own Print & Play card game using SVG and JavaScript
Make your own Print & Play card game using SVG and JavaScriptKevin Hakanson
 
Internationalize your JavaScript Application: Prepare for "the next billion" ...
Internationalize your JavaScript Application: Prepare for "the next billion" ...Internationalize your JavaScript Application: Prepare for "the next billion" ...
Internationalize your JavaScript Application: Prepare for "the next billion" ...Kevin Hakanson
 
Developer's Guide to JavaScript and Web Cryptography
Developer's Guide to JavaScript and Web CryptographyDeveloper's Guide to JavaScript and Web Cryptography
Developer's Guide to JavaScript and Web CryptographyKevin Hakanson
 

Plus de Kevin Hakanson (10)

Sharpen your "Architectural Documentation" Saw
Sharpen your "Architectural Documentation" SawSharpen your "Architectural Documentation" Saw
Sharpen your "Architectural Documentation" Saw
 
Who's in your Cloud? Cloud State Monitoring
Who's in your Cloud? Cloud State MonitoringWho's in your Cloud? Cloud State Monitoring
Who's in your Cloud? Cloud State Monitoring
 
Adopting Multi-Cloud Services with Confidence
Adopting Multi-Cloud Services with ConfidenceAdopting Multi-Cloud Services with Confidence
Adopting Multi-Cloud Services with Confidence
 
Introduction to Speech Interfaces for Web Applications
Introduction to Speech Interfaces for Web ApplicationsIntroduction to Speech Interfaces for Web Applications
Introduction to Speech Interfaces for Web Applications
 
ng-owasp: OWASP Top 10 for AngularJS Applications
ng-owasp: OWASP Top 10 for AngularJS Applicationsng-owasp: OWASP Top 10 for AngularJS Applications
ng-owasp: OWASP Top 10 for AngularJS Applications
 
Securing TodoMVC Using the Web Cryptography API
Securing TodoMVC Using the Web Cryptography APISecuring TodoMVC Using the Web Cryptography API
Securing TodoMVC Using the Web Cryptography API
 
Make your own Print & Play card game using SVG and JavaScript
Make your own Print & Play card game using SVG and JavaScriptMake your own Print & Play card game using SVG and JavaScript
Make your own Print & Play card game using SVG and JavaScript
 
HTTP Potpourri
HTTP PotpourriHTTP Potpourri
HTTP Potpourri
 
Internationalize your JavaScript Application: Prepare for "the next billion" ...
Internationalize your JavaScript Application: Prepare for "the next billion" ...Internationalize your JavaScript Application: Prepare for "the next billion" ...
Internationalize your JavaScript Application: Prepare for "the next billion" ...
 
Developer's Guide to JavaScript and Web Cryptography
Developer's Guide to JavaScript and Web CryptographyDeveloper's Guide to JavaScript and Web Cryptography
Developer's Guide to JavaScript and Web Cryptography
 

Dernier

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????blackmambaettijean
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rick Flair
 

Dernier (20)

Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
What is Artificial Intelligence?????????
What is Artificial Intelligence?????????What is Artificial Intelligence?????????
What is Artificial Intelligence?????????
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...Rise of the Machines: Known As Drones...
Rise of the Machines: Known As Drones...
 

Implementing Messaging Patterns in JavaScript using the OpenAjax Hub

  • 1. Implementing Messaging Patterns in JavaScript using the OpenAjax Hub Kevin Hakanson Twin Cities Code Camp 11 8-9 October 2011
  • 2. Are You In The Right Place? ● This talk: ○ Is your web application a tightly coupled, DOM event handler mess? Use techniques from the Enterprise Integration Patterns book to build better components. Concepts including message, publishsubscribe channel, request-reply and message filter will be demonstrated in JavaScript (along with corresponding tests) using the OpenAjax Hub. ● This speaker: ○ Kevin Hakanson is an application architect for Thomson Reuters where he is focused on highly, scalable web applications. His background includes both .NET and Java, but he is most nostalgic about Lotus Notes. He has been developing professionally since 1994 and holds a Master’s degree in Software Engineering. When not staring at a computer screen, he is probably staring at another screen, either watching TV or playing video games with his family.
  • 4. What to Expect ● "Based on a True Story" ○ derived from production code from large scale, web app ● Enterprise Integration Patterns ○ selected patterns from the book ● JavaScript Libraries ○ OpenAjax, jQuery, QUnit ● Problems + Patterns + Tests ● Living on the edge ○ Google docs presentation, Cloud9 IDE, github ● Questions (OK during presentation)
  • 6. Problem ● large scale web application ● multiple teams with separate code bases ● iterative development, but long duration project ● continuous integration, build/deploy on check in ● primary touch point is in browser ● automated regression tests ● make all this work without app constantly breaking
  • 7. Architect Talk ● Treat UI components (widgets) like services in the browser which operate independent of each other ○ however, some have no UI and are invisible services ● Think in terms of application level messages between components instead of direct wiring/capturing another components raw DOM events ○ internal component interaction can be DOM or custom event based ● Hierarchical channels with naming standard and wildcard subscriptions. Long lived and should be namespaced. ● Forwards and backwards version compatibility
  • 8. insert "Ivory Tower Architect" joke here :)
  • 9. Demo $( ".slide[title='Demo']" ).focus( function() { window.location.href = "demo.html"; });
  • 10. Enterprise Integration Patterns Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions By Gregor Hohpe, Bobby Woolf Published Oct 10, 2003 by Addison-Wesley Professional. Part of the Addison-Wesley Signature Series (Fowler) series. ISBN-10: 0-321-20068-3 ISBN-13: 978-0-321-20068-6 http://www.enterpriseintegrationpatterns.com/ Pattern icon, pattern name, problem and solution statements, and sketch available under the Creative Commons Attribution license.
  • 11. List of Patterns Messaging Systems: ● Message Channel, Message, Pipes and Filters, Message Router, Message Translator, Message Endpoint Messaging Channels: ● Point-to-Point Channel, Publish-Subscribe Channel, Datatype Channel, Invalid Message Channel, Dead Letter Channel, Guaranteed Delivery, Channel Adapter, Messaging Bridge, Message Bus Message Construction: ● Command Message, Document Message, Event Message, Request-Reply, Return Address, Correlation Identifier, Message Sequence, Message Expiration, Format Indicator Message Routing: ● Content-Based Router, Message Filter, Dynamic Router, Recipient List, Splitter, Aggregator, Resequencer, Composed Msg. Processor, Scatter-Gather, Routing Slip, Process Manager, Message Broker Message Transformation: ● Envelope Wrapper, Content Enricher, Content Filter, Claim Check, Normalizer, Canonical Data Model Messaging Endpoints: ● Messaging Gateway, Messaging Mapper, Transactional Client, Polling Consumer, Event-Driven Consumer, Competing Consumers, Message Dispatcher, Selective Consumer, Durable Subscriber, Idempotent Receiver, Service Activator System Management: ● Control Bus, Detour, Wire Tap, Message History, Message Store, Smart Proxy, Test Message, Channel Purger
  • 12. JavaScript Publish-Subscribe Options ● jQuery custom events (api.jquery.com/category/events/) ○ flat name with optional, restricting namespace ○ reflects DOM structure, including event bubbling ○ API: bind, unbind, trigger ● AmplifyJS Pub/Sub (amplifyjs.com/api/pubsub/) ○ cleaner interface that jQuery custom events ○ subscriptions can request priority and/or prevent other callbacks from being invoked ○ API: subscribe, unsubscribe, publish ● OpenAjax Hub 1.0 (www.openajax.org) ○ simple and lightweight publish/subscribe engine ○ hierarchical event names with wildcard subscriptions ○ API: subscribe, unsubscribe, publish
  • 13. QUnit "QUnit is a powerful, easy-to-use, JavaScript test suite. It's used by the jQuery project to test its code and plugins but is capable of testing any generic JavaScript code." http://docs.jquery.com/Qunit QUnit Example test("a basic test example", function() { ok( true, "this test is fine" ); var value = "hello"; equal( value, "hello", "We expect value to be hello" ); });
  • 14. Tests ● QUnit tests of jQuery custom events ○ https://github.com/hakanson/tccc11/blob/master/tests/jquery.tests.js ○ http://jsfiddle.net/hakanson/5bgjd/ ● QUnit tests of AmplifyJS Pub/Sub ○ https://github.com/hakanson/tccc11/blob/master/tests/amplify.tests.js ○ http://jsfiddle.net/hakanson/zy6Dy/
  • 15. $.hub ● jQuery plug-in created for this talk ○ derived from production code ● Builds on top of OpenAjax Hub functionality ● API: ○ subscribe, unsubscribe, publish ○ guid, message ○ createVersionFilter, createIdempotentFilter ○ reply, requestReply
  • 16. Problem (again) ● make all this work without app constantly breaking
  • 17. Message Channel (60) How does one application communicate with another using messaging? Connect the applications using a Message Channel, where one application writes information to the channel and the other one reads that information from the channel.
  • 18. Message (66) How can two applications connected by a message channel exchange a piece of information? Package the information into a Message, a data record that the messaging system can transmit through a message channel.
  • 19. Publish-Subscribe Channel (106) How can the sender broadcast an event to all interested receivers? Send the event on a Publish-Subscribe Channel, which delivers a copy of a particular event to each receiver.
  • 20. channel parameter ● the name of the event to listen for ○ OpenAjax - name ○ AmplifyJS - topic ○ jQuery custom events - eventType ○ elsewhere - subject
  • 21. message parameter ● An arbitrary Object holding extra information that will be passed as an argument to the handler function ○ OpenAjax - publisherData ○ jQuery custom events - extraParameters ○ AmplifyJS - additional parameters
  • 22. callback parameter ● a function object reference to be called when a subscription receives data ● should play nice and handle: ○ own errors and not throw exceptions ○ being called synchronous and not perform long running operations ○ being called asynchronous (depending on implementation) ● scope parameter ○ what this is when callback is invoked (default window) ○ AmplifyJS - context ○ or use callback, scope with $.proxy( function, context )
  • 23. Test Excerpt $.hub.subscribe( "A", function( channel, message ) { countA++; }); $.hub.subscribe( "A.*", function( channel, message ) { countAstar++; }); $.hub.subscribe( "A.**", function( channel, message ) { countAstarstar++; }); $.hub.subscribe( "A.1", function( channel, message ) { countA1++; }); $.hub.subscribe( "A.1.a", function( channel, message ) { countA1a++; }); $.hub.publish( "A", message ); $.hub.publish( "A.1", message ); $.hub.publish( "A.1.a", message ); $.hub.publish( "A.1.b", message );
  • 24. Demo (Updated) $.get("demo.html", function(data) { data.replace( "demo.js", "demo-updated.js" ); });
  • 25. Architect Talk ● If messages published on a channel carry same type of body, then channel names identify types of messages ○ Message is channel + headers + body ● Message body carries data payload; defined by specification ○ in future could use XML or JSON schema ● Message should be serializable (JSON) and not contain functions or logic ○ better for immutability/tampering and cross domain usages (iframes, client to server)
  • 26. Datatype Channel (111) How can the application send a data item such that the receiver will know how to process it? Use a separate Datatype Channel for each data type, so that all data on a particular channel is of the same type.
  • 27. Document Message (147) How can messaging be used to transfer data between applications? Use a Document Message to reliably transfer a data structure between applications.
  • 29. Test Excerpt var channel = "name", messageBody = { "key1": "value1", "key2": "value2"}, actualMessage, actualChannel; var subscription = $.hub.subscribe( channel, function( channel, message ) { actualChannel = channel; actualMessage = message; }); var message = $.hub.message( messageBody ); $.hub.publish( channel, message ); $.hub.unsubscribe( subscription );
  • 30. Problem ● Two components exist on a web page ○ first component subscribes to messages from the second component ○ second component publishes message during initialization ● When <script> tags are reordered, the functionality breaks because second component publishes its message before first component has a chance to subscribe ○ components on page have temporal coupling ● Need the equivalent of jQuery $.ready() for hub
  • 31. Durable Subscriber (522) How can a subscriber avoid missing messages while it’s not listening for them? Use a Durable Subscriber to make the messaging system save messages published while the subscriber is disconnected.
  • 32. Test Excerpt // tell hub to save messages $.hub({ ready: false }); // publish before any active subscribers $.hub.publish( channelA, messageA ); var subscriptionA = $.hub.subscribe(channelA, function( channel, message ) { actualChannel = channel; actualMessage = message; }); // tell hub to delivery saved messages $.hub({ ready: true });
  • 33. Architect Talk ● Need message body to be backwards compatible in both structure and meaning ○ otherwise need versioning scheme and strategy for both old and new versions of a message to be published ● A filter on version is important for backwards and forwards compatibility, so your code doesn't break when a new version of the message is published ○ using the filter parameter allows you to put the guard outside of the callback instead of inside it (think of the filter like an aspect)
  • 34. Format Indicator (180) How can a message’s data format be designed to allow for possible future changes? Design a data format that includes a Format Indicator, so that the message specifies what format it is using.
  • 35. Selective Consumer (515) How can a message consumer select which messages it wishes to receive? Make the consumer a Selective Consumer, one that filteres the messages delivered by its channel so that it only receives the ones that match its criteria.
  • 36. filter parameter ● A function that returns true or false to either match or deny a match of the published event
  • 37. Test Excerpt var m1 = $.hub.message({ { formatVersion: "1" var m2 = $.hub.message({ { formatVersion: "2" name: "Kevin Hakanson" }, }); firstname: "Kevin", lastname: "Hakanson" }, }); function callbackV1( channel, message ) { countV1++; } function callbackV2( channel, message ) { countV2++; } $.hub.subscribe( "Person.*", callbackV1, null, null, $.hub.createVersionFilter( "1" ) ); $.hub.subscribe( "Person.*", callbackV2, null, null, $.hub.createVersionFilter( "2" ) ); $.hub.publish( "Person.Cool", m1 ); $.hub.publish( "Person.Cool", m2 );
  • 38. Message Translator (85) How can systems using different data formats communicate with each other using messaging? Use a special filter, a Message Translator, between other filters or applications to translate one data format into another.
  • 39. Test Excerpt var m2 = $.hub.message({ firstname: "Kevin", lastname: "Hakanson" }, { formatVersion: "2" }); function callbackV1(channel, message ) { countV1++; } function callbackV2(channel, message ) { countV2++; var name = message.body.firstname + " " + message.body.lastname; var translatedMessage = $.hub.message( { name: name }, { formatVersion: "1" } ); $.hub.publish( channel, translatedMessage ); } subscriber1 = $.hub.subscribe( $.hub.createVersionFilter( subscriber2 = $.hub.subscribe( $.hub.createVersionFilter( "Person.*", callbackV1, null, null, "1" ) ); "Person.*", callbackV2, null, null, "2" ) ); $.hub.publish( "Person.Cool", m2 );
  • 40. Idempotent Receiver How can a message receiver deal with duplicate messages? Design a receiver to be an Idempotent Receiver--one that can safely receive the same message multiple times.
  • 41. Test Excerpt var m1 = $.hub.message({}), m2 = $.hub.message({}); function callback1( channel, message ) { count1++; } function callback2( channel, message ) { count2++; } $.hub.subscribe( channel, callback1, null, null, createIdempotentFilter () ); $.hub.subscribe( channel, callback2, null, null, createIdempotentFilter () ); $.hub.publish( channel, m1 ); $.hub.publish( channel, m1 ); $.hub.publish( channel, m2 ); $.hub.publish( channel, m2 ); $.hub.publish( channel, m2 );
  • 42. Problem ● How to replace directly calling functions with messaging? ● Want to do something like below, without common coupling (sharing a global variable). ○ var component1 = new Component1(); component1.command(); var reply = component1.request({});
  • 43. Request-Reply (154) When an application sends a message, how can it get a response from the receiver? Send a pair of Request-Reply messages, each on its own channel.
  • 44. Return Address (159) How does a replier know where to send the reply? The request message should contain a Return Address that indicates where to send the reply message.
  • 45. Correlation Identifier (163) How does a requestor that has received a reply know which request this is the reply for? Each reply message should contain a Correlation Identifier, a unique identifier that indicates which request message this reply is for.
  • 46. Test Excerpt $.hub.subscribe(channel, function( channel, message ) { actualChannel = channel; actualMessage = message; $.hub.reply( message, replyMessage ); }); $.hub.requestReply(channel, message, function( channel, message ) { actualReplyMessage = message; correlationId = message.correlationId; });
  • 47. Command Message (145) How can messaging be used to invoke a procedure in another application? Use a Command Message to reliably invoke a procedure in another application.
  • 48. Message Endpoint (95) How does an application connect to a messaging channel to send and receive messages? Connect an application to a messaging channel using a Message Endpoint, a client of the messaging system that the application can then use to send or receive messages.
  • 49. Test Excerpt // create a message endpoint to call counter.increment() var subscription = $.hub.subscribe( channel, function( channel, message ) { counter.increment( message ); }); counter.increment( 2 ); // send command message to increment by 2 $.hub.publish( channel, 2 );
  • 50. Summary ● Patterns help us find appropriate solutions in the software architecture and design process. ● Using Publish/Subscribe events for browser communication adds a level of indirection between the JavaScript components. ● Using a common messaging structure for the events (including naming and versioning) make things more predictable. ● Libraries are not enough; knowledge of JavaScript and the DOM is essential for good widget design and interaction.
  • 51. Q&A