fabric3
Content
Documentation
Overview
Programming Concepts
Programming Concepts
search
attachments
weblink
advanced
image-effects
image-attributes
Paragraph
Paragraph
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Preformatted
Quote
Bold
Italic
Underline
Colour picker
More colours
Formatting
Strikethrough
Subscript
Superscript
Monospace
Clear formatting
Bullet list
Numbered list
Task list
Outdent
Indent
Align left
Align center
Align right
Page layout
Link
Table
Insert
Insert content
Files and images
Link
Symbol
Emoticon
Markup
Horizontal rule
Insert macro
User mention
Jira Issue/Filter
Info
Status
Gallery
Table of Contents
Jira timeline
Lucidchart Diagrams
Trello Board
Other macros
Page layout
No layout
Two column (simple)
Two column (simple, left sidebar)
Two column (simple, right sidebar)
Three column (simple)
Two column
Two column (left sidebar)
Two column (right sidebar)
Three column
Three column (left and right sidebars)
Find/Replace
Keyboard shortcuts help
You are not logged in. Any changes you make will be marked as
anonymous
. You may want to
Log In
if you already have an account.
<h2>Components</h2><p>In Fabric3, application code is organized as a set of components implemented as POJOs. A component may have one or more services it exposes to clients and may contain references to other services it depends on. The following illustrates a calculator component (taken from the samples) that is wired to operand services:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Component public class CalculatorServiceImpl implements CalculatorService { @Reference protected AddService addService; @Reference protected SubtractService subtractService; @Reference protected MultiplyService multiplyService; @Reference protected DivideService divideService; public double add(double n1, double n2) { return addService.add(n1, n2); } public double subtract(double n1, double n2) { return subtractService.subtract(n1, n2); } public double multiply(double n1, double n2) { return multiplyService.multiply(n1, n2); } public double divide(double n1, double n2) { return divideService.divide(n1, n2); } }</pre></td></tr></table><h2><span style="line-height: 1.5;">Bindings</span></h2><p>Components can provide one or more services to clients. Clients may be remote or local. For remote clients, a component service can be exposed as an endpoint using a <em>binding</em> such as WS-*, JAX-RS or JMS.</p><p><img class="confluence-embedded-image" loading="lazy" src="https://fabric3.atlassian.net/wiki/download/attachments/524361/Slide1.jpg?version=1&modificationDate=1374459119847&cacheVersion=1&api=v2" data-image-src="https://fabric3.atlassian.net/wiki/download/attachments/524361/Slide1.jpg?version=1&modificationDate=1374459119847&cacheVersion=1&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="1474562" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Slide1.jpg" data-base-url="https://fabric3.atlassian.net/wiki" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="524361" data-linked-resource-container-version="24" data-media-id="595be008-6ae3-4265-8576-6ad396b43559" data-media-type="file" title="fabric3 > Programming Concepts > Slide1.jpg" data-location="fabric3 > Programming Concepts > Slide1.jpg" data-image-height="405" data-image-width="720"></p><p>Fabric3 supports native JAX-RS annotations for binding a component service as an endpoint:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Path("/") @Consumes(MediaType.TEXT_PLAIN) @Produces(MediaType.TEXT_PLAIN) @Component public class CalculatorServiceImpl implements CalculatorService { @Reference protected AddService addService; @Reference protected SubtractService subtractService; @Reference protected MultiplyService multiplyService; @Reference protected DivideService divideService; @GET @Path("/{formula}") public String calculate(@PathParam("formula") String formula) { // ... } }</pre></td></tr></table><p>Fabric3 also provides annotations for binding services to other transports. The <code>WebServiceBinding</code> annotation exposes the calculator service as a WS-* endpoint:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@WebServiceBinding(uri = "CalculatorService") public class CalculatorServiceImpl implements CalculatorService { // ... }</pre></td></tr></table><p> </p><p>The following demonstrates how to expose an endpoint to a JMS queue:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Component @JMS(@JMSConfiguration(destination = "Queue")) public class ConsumerImpl implements Consumer { public String onMessage(String message) { return message; } } </pre></td></tr></table><h2><span class="legacy-color-text-default">Wires</span></h2><p>A component can act as a client to a service by wiring a reference.</p><p><img class="confluence-embedded-image" loading="lazy" src="https://fabric3.atlassian.net/wiki/download/attachments/524361/Slide2.jpg?version=1&modificationDate=1374459170152&cacheVersion=1&api=v2" data-image-src="https://fabric3.atlassian.net/wiki/download/attachments/524361/Slide2.jpg?version=1&modificationDate=1374459170152&cacheVersion=1&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="1474563" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="Slide2.jpg" data-base-url="https://fabric3.atlassian.net/wiki" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="524361" data-linked-resource-container-version="24" data-media-id="a1ec141b-46fa-423a-9ba0-c802270340f9" data-media-type="file" title="fabric3 > Programming Concepts > Slide2.jpg" data-location="fabric3 > Programming Concepts > Slide2.jpg" data-image-height="405" data-image-width="720"></p><p>The following shows how to wire a reference in a composite:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Component public class CalculatorServiceImpl implements CalculatorService { @Reference @Target("AddService") protected AddService addService; // ... } </pre></td></tr></table><p>In the above example, the wire from <code>CalculatorServiceImpl</code> to <code>AddService</code> can be local or remote (possibly passing through a message queue) depending on if the two components are collocated. For distributed services, bindings can be specified on references:</p><p> </p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>@Component public class CalculatorServiceImpl implements CalculatorService { @Reference @ZeroMQ("AddService") protected AddService addService; // ... }</pre></td></tr></table><p>The above example wires <code>CalculatorServiceImpl</code> to <code>AddService</code> using a ZeroMQ socket. Note that IP addresses and port bindings do not need to be specified - these will be resolved transparently to the application by the Fabric3 runtime.</p><h2>Composites</h2><p>Components can be defined using annotations (in which case they will be scanned by the runtime) or by XML or a Java-based DSL. If you prefer to define components using one of the latter methods, you must create a <em>composite</em> containing the components. A composite can be defined by an XML file containing a set of component definitions:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=xml" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9eG1sfQ&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre><composite xmlns='http://docs.oasis-open.org/ns/opencsa/sca/200912' targetNamespace='urn:tempuri.org' name='SampleComposite'> <component name='CalculatorService'> <implementation.java class="org.sample.CalculatorServiceImpl"/> </component> </composite> </pre></td></tr></table><p>Alternatively, a composite can be defined using the Fabric3 DSL:</p><p> </p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=java" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9amF2YX0&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre>public class CompositeProvider { @Provides public static Composite calculatorComposite() { QName name = new QName(Namespaces.F3, "CalculatorComposite"); JavaComponentDefinitionBuilder componentBuilder = JavaComponentDefinitionBuilder.newBuilder(CalculatorServiceImpl.class); return CompositeBuilder.newBuilder(name).component(componentBuilder.build()).build(); } }</pre></td></tr></table><p> </p><p>A composite is similar to a Spring application context but with several important differences:</p><ul><li>An application can be comprised of 1..n composites that are peers or nested in a top-level composite.</li><li>Composites define visibility boundaries for encapsulation. It is not possible to wire to components within a composite unless they are explcitly made visibile outside the composite through promotion. Promotion is similar to making a method public on a Java class. <br /><br /></li></ul><h2>Channels</h2><p>Fabric3 also supports pub/sub interactions where components pass events through a channel as opposed to being directly wired. A component producer is connected to a channel, which in turn may be connected to 0..N component consumers.</p><p><img class="confluence-embedded-image" loading="lazy" src="https://fabric3.atlassian.net/wiki/download/attachments/524361/Slide5.jpg?version=2&modificationDate=1374458886477&cacheVersion=1&api=v2" data-image-src="https://fabric3.atlassian.net/wiki/download/attachments/524361/Slide5.jpg?version=2&modificationDate=1374458886477&cacheVersion=1&api=v2" data-unresolved-comment-count="0" data-linked-resource-id="1179655" data-linked-resource-version="2" data-linked-resource-type="attachment" data-linked-resource-default-alias="Slide5.jpg" data-base-url="https://fabric3.atlassian.net/wiki" data-linked-resource-content-type="image/jpeg" data-linked-resource-container-id="524361" data-linked-resource-container-version="24" data-media-id="619c8fcf-c6d1-4122-8495-3a819e158b90" data-media-type="file" title="fabric3 > Programming Concepts > Slide5.jpg" data-location="fabric3 > Programming Concepts > Slide5.jpg" data-image-height="405" data-image-width="720"></p><p>The following shows how to create pub/sub interaction using a channel using XML:</p><table class="wysiwyg-macro" data-macro-name="code" data-macro-parameters="language=xml" data-macro-schema-version="1" style="background-image: url(https://fabric3.atlassian.net/wiki/plugins/servlet/confluence/placeholder/macro-heading?definition=e2NvZGU6bGFuZ3VhZ2U9eG1sfQ&locale=en_GB&version=2); background-repeat: no-repeat;" data-macro-body-type="PLAIN_TEXT"><tr><td class="wysiwyg-macro-body"><pre><composite ...> <channel name="SampleChannel"/> <component name='SampleComponent'> <implementation.java/> <producer name="channel" target="SampleChannel"/> </component> <component name='TargetComponent1'> <implementation.java/> <consumer name="channel" source="SampleChannel"/> </component> <component name='TargetComponent2'> <implementation.java/> <consumer name="channel" source="SampleChannel"/> </component> </composite> </pre></td></tr></table><p>Channels may be local or remote depending on where its producers and consumers are deployed. In the case where producers and consumers are remote, Fabric3 will bind a channel to a remote transport such as a JMS topic (channels may also be explicitly bound using the <binding> element in a composite).</p>
Save
Close
Edit
Preview
View changes
Revert to last published version
{"serverDuration": 427, "requestCorrelationId": "9904b6c538474a0980a5653c1c0cc4c2"}