diff --git a/pom.xml b/pom.xml index 3064f3c0d..e01dc1001 100644 --- a/pom.xml +++ b/pom.xml @@ -80,6 +80,7 @@ message-channel fluentinterface reactor + publish-subscribe diff --git a/publish-subscribe/.gitignore b/publish-subscribe/.gitignore new file mode 100644 index 000000000..b83d22266 --- /dev/null +++ b/publish-subscribe/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/publish-subscribe/etc/publish-subscribe.png b/publish-subscribe/etc/publish-subscribe.png new file mode 100644 index 000000000..99867da66 Binary files /dev/null and b/publish-subscribe/etc/publish-subscribe.png differ diff --git a/publish-subscribe/etc/publish-subscribe.ucls b/publish-subscribe/etc/publish-subscribe.ucls new file mode 100644 index 000000000..1b121506e --- /dev/null +++ b/publish-subscribe/etc/publish-subscribe.ucls @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/publish-subscribe/index.md b/publish-subscribe/index.md new file mode 100644 index 000000000..efd40f021 --- /dev/null +++ b/publish-subscribe/index.md @@ -0,0 +1,17 @@ +--- +layout: pattern +title: Publish Subscribe +folder: publish-subscribe +permalink: /patterns/publish-subscribe/ +categories: Integration +tags: Java +--- + +**Intent:** When applications communicate using a messaging system they do it by using logical addresses +of the system, so called Publish Subscribe Channel. The publisher broadcasts a message to all registered Subscriber. + +![alt text](./etc/publish-subscribe.png "Publish Subscribe Channel") + +**Applicability:** Use the Publish Subscribe Channel pattern when + +* two or more applications need to communicate using a messaging system for broadcasts. diff --git a/publish-subscribe/pom.xml b/publish-subscribe/pom.xml new file mode 100644 index 000000000..04b76690a --- /dev/null +++ b/publish-subscribe/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.7.0 + + publish-subscribe + + + org.apache.camel + camel-core + + + org.apache.camel + camel-stream + + + junit + junit + + + \ No newline at end of file diff --git a/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java b/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java new file mode 100644 index 000000000..1f433f517 --- /dev/null +++ b/publish-subscribe/src/main/java/com/iluwatar/publish/subscribe/App.java @@ -0,0 +1,55 @@ +package com.iluwatar.publish.subscribe; + +import org.apache.camel.CamelContext; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultCamelContext; + +/** + * + * When applications communicate with each other using a messaging system + * they first need to establish a communication channel that will carry the + * data. Message Channel decouples Message producers (publisher) and consumers (subscriber). + *

+ * The sending application doesn't necessarily know what particular applications + * will end up retrieving it, but it can be assured that the application that + * retrieves the information is interested in that information. This is because + * the messaging system has different Message Channels for different types of + * information the applications want to communicate. When an application sends + * information, it doesn't randomly add the information to any channel available; + * it adds it to a channel whose specific purpose is to communicate that sort of + * information. Likewise, an application that wants to receive particular information + * doesn't pull info off some random channel; it selects what channel to get information + * from based on what type of information it wants. + *

+ * In this example we use Apache Camel to establish different Message Channels. The first + * one reads from standard input and delivers messages to Direct endpoints (Publish; Broadcast). The other Message + * Channels are established from the Direct component to different Endpoints (Subscriber). No actual messages are sent, + * only the established routes are printed to standard output. + * + */ +public class App { + + /** + * Program entry point + * + * @param args command line args + * @throws Exception + */ + public static void main(String[] args) throws Exception { + CamelContext context = new DefaultCamelContext(); + + context.addRoutes(new RouteBuilder() { + + @Override + public void configure() throws Exception { + from("stream:in") + .multicast() + .to("direct:greetings1", "direct:greetings2", "direct:greetings3"); + } + }); + + context.start(); + context.getRoutes().stream().forEach((r) -> System.out.println(r)); + context.stop(); + } +} diff --git a/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java b/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java new file mode 100644 index 000000000..743e4200d --- /dev/null +++ b/publish-subscribe/src/test/java/com/iluwatar/publish/subscribe/AppTest.java @@ -0,0 +1,17 @@ +package com.iluwatar.publish.subscribe; + +import org.junit.Test; + +/** + * + * Application test + * + */ +public class AppTest { + + @Test + public void test() throws Exception { + String[] args = {}; + App.main(args); + } +} \ No newline at end of file