From 9983b2129bd111e9f97ff964eebfb77ef79c9523 Mon Sep 17 00:00:00 2001 From: ctasada Date: Tue, 9 Apr 2024 16:52:40 +0000 Subject: [PATCH] deploy: 9b4bd369b2fef630b378c100ed59b2fa7971b5cd --- 404.html | 2 +- .../{1fb40151.274d666d.js => 1fb40151.b1420d7b.js} | 2 +- .../{ad7e3673.5591c06b.js => ad7e3673.52d6031a.js} | 2 +- ...ime~main.9da98919.js => runtime~main.44a073b6.js} | 2 +- docs/behind-the-scenes/index.html | 6 +++--- docs/configuration/customizing/index.html | 2 +- docs/configuration/documenting-bindings/index.html | 12 ++++++------ docs/configuration/documenting-consumers/index.html | 2 +- docs/configuration/documenting-messages/index.html | 2 +- docs/configuration/documenting-producers/index.html | 2 +- docs/configuration/index.html | 2 +- docs/faq/index.html | 2 +- docs/introduction/index.html | 2 +- docs/introduction/supported-protocols/index.html | 2 +- docs/quickstart/index.html | 2 +- index.html | 2 +- 16 files changed, 23 insertions(+), 23 deletions(-) rename assets/js/{1fb40151.274d666d.js => 1fb40151.b1420d7b.js} (54%) rename assets/js/{ad7e3673.5591c06b.js => ad7e3673.52d6031a.js} (97%) rename assets/js/{runtime~main.9da98919.js => runtime~main.44a073b6.js} (77%) diff --git a/404.html b/404.html index a624c95..8349531 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ Page Not Found | Springwolf - + diff --git a/assets/js/1fb40151.274d666d.js b/assets/js/1fb40151.b1420d7b.js similarity index 54% rename from assets/js/1fb40151.274d666d.js rename to assets/js/1fb40151.b1420d7b.js index 12c13a6..7c68544 100644 --- a/assets/js/1fb40151.274d666d.js +++ b/assets/js/1fb40151.b1420d7b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkspringwolf_docs=self.webpackChunkspringwolf_docs||[]).push([[847],{5241:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var t=s(5893),i=s(1151);const o={sidebar_position:70},r="Behind the scenes",c={id:"behind-the-scenes",title:"Behind the scenes",description:"The following paragraphs describe how Springwolf works internally.",source:"@site/docs/behind-the-scenes.md",sourceDirName:".",slug:"/behind-the-scenes",permalink:"/docs/behind-the-scenes",draft:!1,unlisted:!1,editUrl:"https://github.com/springwolf/springwolf.github.io/edit/master/docs/behind-the-scenes.md",tags:[],version:"current",sidebarPosition:70,frontMatter:{sidebar_position:70},sidebar:"tutorialSidebar",previous:{title:"Customizing",permalink:"/docs/configuration/customizing"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq"}},a={},d=[{value:"Big Picture",id:"big-picture",level:2},{value:"Plugins",id:"plugins",level:2},{value:"Scanners",id:"scanners",level:2},{value:"Building an example payload",id:"building-an-example-payload",level:2},{value:"ModelConverters",id:"modelconverters",level:3},{value:"Putting it all together",id:"putting-it-all-together",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"behind-the-scenes",children:"Behind the scenes"}),"\n",(0,t.jsx)(n.p,{children:"The following paragraphs describe how Springwolf works internally."}),"\n",(0,t.jsx)(n.h2,{id:"big-picture",children:"Big Picture"}),"\n",(0,t.jsxs)(n.p,{children:["When the Spring Boot application is started, Springwolf uses its scanners to find defined consumers and producers within the application.\nBased on the results, the channels/topics are extracted including payload type and merged together into an ",(0,t.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0",children:"AsyncAPI conform document"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The AsyncAPI document is accessible an endpoint.\nWhen the Springwolf UI is opened, the browser fetches the document and renders it (see demo)."}),"\n",(0,t.jsx)(n.p,{children:"When publishing is enabled, the user can publish a message through the UI to another endpoint.\nFrom there, Springwolf forwards the message to the protocol specific producer."}),"\n",(0,t.jsx)(n.h2,{id:"plugins",children:"Plugins"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"springwolf-core"})," provides the base functionality to orchestrate the scanning and building of the AsyncAPI document.\nThe different protocol (AMQP, Cloud-Stream, JMS, Kafka, SNS, SQS) are supported through plugins.\nThese plugins are found through the Spring dependency injection functionality.\nWhen building own scanner plugins, your plugin will need to implement the ",(0,t.jsx)(n.code,{children:"ChannelsScanner"})," interface."]}),"\n",(0,t.jsx)(n.h2,{id:"scanners",children:"Scanners"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"springwolf-core"})," runs all scanners and merges the found results together into one AsyncAPI document.\nWhen the same channel/topic is found multiple times, it's merged as well."]}),"\n",(0,t.jsxs)(n.p,{children:["The result is a ",(0,t.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0#channelItemObject",children:(0,t.jsx)(n.code,{children:"ChannelItem"})}),".\nThe ",(0,t.jsx)(n.code,{children:"ChannelObject"})," contains the ",(0,t.jsx)(n.code,{children:"Message"})," for the receive and/or send operation."]}),"\n",(0,t.jsx)(n.h2,{id:"building-an-example-payload",children:"Building an example payload"}),"\n",(0,t.jsxs)(n.p,{children:["When the scanners scan and build the result, they also extract the payload type.\nThe payload is registered in the ",(0,t.jsx)(n.code,{children:"ComponentsService"}),", which allows to split the ",(0,t.jsx)(n.code,{children:"Message"})," from the schema definition - within the AsyncAPI doc a ",(0,t.jsx)(n.code,{children:"$ref"})," references is used."]}),"\n",(0,t.jsxs)(n.p,{children:["Using ",(0,t.jsx)(n.code,{children:"swagger-core"})," any class can be converted into an OpenApi schema.\nThe schema is ",(0,t.jsx)(n.a,{href:"https://www.asyncapi.com/docs/tutorials/getting-started/coming-from-openapi",children:"mapped into an AsyncAPI schema"})," and included in the AsyncAPI document.\nAdditionally, Springwolf generates an example based on the provided schema."]}),"\n",(0,t.jsxs)(n.p,{children:["By using ",(0,t.jsx)(n.code,{children:"swagger-parser"}),", all the ",(0,t.jsx)(n.code,{children:"@Schema"})," and other swagger annotations are supported as well as ",(0,t.jsx)(n.code,{children:"@JsonProperty"})," through the use of the ObjectMapper."]}),"\n",(0,t.jsx)(n.h3,{id:"modelconverters",children:"ModelConverters"}),"\n",(0,t.jsx)(n.p,{children:"ModelConverters provide a way to improve documentation for classes, which can't be modified, for example because they're part of an external library.\nThey follow the same plugin model."}),"\n",(0,t.jsx)(n.h2,{id:"putting-it-all-together",children:"Putting it all together"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"AsyncApiService"})," collects all the channels, schemas and general info and builds the AsyncApi document.\nThe controller access this services to serve the document to the UI."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>r});var t=s(7294);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkspringwolf_docs=self.webpackChunkspringwolf_docs||[]).push([[847],{5241:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>h,frontMatter:()=>o,metadata:()=>c,toc:()=>d});var t=s(5893),i=s(1151);const o={sidebar_position:70},r="Behind the scenes",c={id:"behind-the-scenes",title:"Behind the scenes",description:"The following paragraphs describe how Springwolf works internally.",source:"@site/docs/behind-the-scenes.md",sourceDirName:".",slug:"/behind-the-scenes",permalink:"/docs/behind-the-scenes",draft:!1,unlisted:!1,editUrl:"https://github.com/springwolf/springwolf.github.io/edit/master/docs/behind-the-scenes.md",tags:[],version:"current",sidebarPosition:70,frontMatter:{sidebar_position:70},sidebar:"tutorialSidebar",previous:{title:"Customizing",permalink:"/docs/configuration/customizing"},next:{title:"Frequently Asked Questions",permalink:"/docs/faq"}},a={},d=[{value:"Big Picture",id:"big-picture",level:2},{value:"Plugins",id:"plugins",level:2},{value:"Scanners",id:"scanners",level:2},{value:"Building an example payload",id:"building-an-example-payload",level:2},{value:"ModelConverters",id:"modelconverters",level:3},{value:"Putting it all together",id:"putting-it-all-together",level:2}];function l(e){const n={a:"a",code:"code",h1:"h1",h2:"h2",h3:"h3",p:"p",...(0,i.a)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.h1,{id:"behind-the-scenes",children:"Behind the scenes"}),"\n",(0,t.jsx)(n.p,{children:"The following paragraphs describe how Springwolf works internally."}),"\n",(0,t.jsx)(n.h2,{id:"big-picture",children:"Big Picture"}),"\n",(0,t.jsxs)(n.p,{children:["When the Spring Boot application is started, Springwolf uses its scanners to find defined consumers and producers within the application.\nBased on the results, the channels/topics are extracted including payload type and merged together into an ",(0,t.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0",children:"AsyncAPI conform document"}),"."]}),"\n",(0,t.jsx)(n.p,{children:"The AsyncAPI document is accessible an endpoint.\nWhen the Springwolf UI is opened, the browser fetches the document and renders it (see demo)."}),"\n",(0,t.jsx)(n.p,{children:"When publishing is enabled, the user can publish a message through the UI to another endpoint.\nFrom there, Springwolf forwards the message to the protocol specific producer."}),"\n",(0,t.jsx)(n.h2,{id:"plugins",children:"Plugins"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"springwolf-core"})," provides the base functionality to orchestrate the scanning and building of the AsyncAPI document.\nThe different protocol (AMQP, Cloud-Stream, JMS, Kafka, SNS, SQS) are supported through plugins.\nThese plugins are found through the Spring dependency injection functionality.\nWhen building own scanner plugins, your plugin will need to implement the ",(0,t.jsx)(n.code,{children:"ChannelsScanner"})," interface."]}),"\n",(0,t.jsx)(n.h2,{id:"scanners",children:"Scanners"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.code,{children:"springwolf-core"})," runs all scanners and merges the found results together into one AsyncAPI document.\nWhen the same channel/topic is found multiple times, it's merged as well."]}),"\n",(0,t.jsxs)(n.p,{children:["The result is a ",(0,t.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0#channelObject",children:(0,t.jsx)(n.code,{children:"ChannelItem"})}),".\nThe ",(0,t.jsx)(n.code,{children:"ChannelObject"})," contains the ",(0,t.jsx)(n.code,{children:"Message"})," for the receive and/or send operation."]}),"\n",(0,t.jsx)(n.h2,{id:"building-an-example-payload",children:"Building an example payload"}),"\n",(0,t.jsxs)(n.p,{children:["When the scanners scan and build the result, they also extract the payload type.\nThe payload is registered in the ",(0,t.jsx)(n.code,{children:"ComponentsService"}),", which allows to split the ",(0,t.jsx)(n.code,{children:"Message"})," from the schema definition - within the AsyncAPI doc a ",(0,t.jsx)(n.code,{children:"$ref"})," references is used."]}),"\n",(0,t.jsxs)(n.p,{children:["Using ",(0,t.jsx)(n.code,{children:"swagger-core"})," any class can be converted into an OpenApi schema.\nThe schema is ",(0,t.jsx)(n.a,{href:"https://www.asyncapi.com/docs/tutorials/getting-started/coming-from-openapi",children:"mapped into an AsyncAPI schema"})," and included in the AsyncAPI document.\nAdditionally, Springwolf generates an example based on the provided schema."]}),"\n",(0,t.jsxs)(n.p,{children:["By using ",(0,t.jsx)(n.code,{children:"swagger-parser"}),", all the ",(0,t.jsx)(n.code,{children:"@Schema"})," and other swagger annotations are supported as well as ",(0,t.jsx)(n.code,{children:"@JsonProperty"})," through the use of the ObjectMapper."]}),"\n",(0,t.jsx)(n.h3,{id:"modelconverters",children:"ModelConverters"}),"\n",(0,t.jsx)(n.p,{children:"ModelConverters provide a way to improve documentation for classes, which can't be modified, for example because they're part of an external library.\nThey follow the same plugin model."}),"\n",(0,t.jsx)(n.h2,{id:"putting-it-all-together",children:"Putting it all together"}),"\n",(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"AsyncApiService"})," collects all the channels, schemas and general info and builds the AsyncApi document.\nThe controller access this services to serve the document to the UI."]})]})}function h(e={}){const{wrapper:n}={...(0,i.a)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},1151:(e,n,s)=>{s.d(n,{Z:()=>c,a:()=>r});var t=s(7294);const i={},o=t.createContext(i);function r(e){const n=t.useContext(o);return t.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ad7e3673.5591c06b.js b/assets/js/ad7e3673.52d6031a.js similarity index 97% rename from assets/js/ad7e3673.5591c06b.js rename to assets/js/ad7e3673.52d6031a.js index 2c1afdf..8bb02b1 100644 --- a/assets/js/ad7e3673.5591c06b.js +++ b/assets/js/ad7e3673.52d6031a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkspringwolf_docs=self.webpackChunkspringwolf_docs||[]).push([[987],{6376:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>r});var s=i(5893),o=i(1151);const a={sidebar_position:66},t="Bindings",d={id:"configuration/documenting-bindings",title:"Bindings",description:"To indicate the binding (protocol) that's documented, there are multiple options to document them.",source:"@site/docs/configuration/documenting-bindings.md",sourceDirName:"configuration",slug:"/configuration/documenting-bindings",permalink:"/docs/configuration/documenting-bindings",draft:!1,unlisted:!1,editUrl:"https://github.com/springwolf/springwolf.github.io/edit/master/docs/configuration/documenting-bindings.md",tags:[],version:"current",sidebarPosition:66,frontMatter:{sidebar_position:66},sidebar:"tutorialSidebar",previous:{title:"Producers",permalink:"/docs/configuration/documenting-producers"},next:{title:"Messages",permalink:"/docs/configuration/documenting-messages"}},c={},r=[{value:"Protocol specific annotations",id:"protocol-specific-annotations",level:2},{value:"@AmqpAsyncOperationBinding",id:"amqpasyncoperationbinding",level:3},{value:"@KafkaAsyncOperationBinding",id:"kafkaasyncoperationbinding",level:3},{value:"@JmsAsyncOperationBinding",id:"jmsasyncoperationbinding",level:3},{value:"@SnsAsyncOperationBinding",id:"snsasyncoperationbinding",level:3},{value:"@SqsAsyncOperationBinding",id:"sqsasyncoperationbinding",level:3},{value:"Generic annotation",id:"generic-annotation",level:2},{value:"@AsyncGenericOperationBinding",id:"asyncgenericoperationbinding",level:3},{value:"Binding properties",id:"binding-properties",level:2},{value:"General",id:"general",level:3},{value:"Queue Name (Channel Name)",id:"queue-name-channel-name",level:4},{value:"Description",id:"description",level:4},{value:"Payload Type",id:"payload-type",level:4},{value:"Headers",id:"headers",level:4},{value:"AMQP",id:"amqp",level:3},{value:"Exchange Name",id:"exchange-name",level:4},{value:"Routing Key",id:"routing-key",level:4},{value:"Kafka",id:"kafka",level:3},{value:"Group Id",id:"group-id",level:4},{value:"Client Id",id:"client-id",level:4},{value:"Google PubSub binding annotations",id:"google-pubsub-binding-annotations",level:3},{value:"Channel Binding Object",id:"channel-binding-object",level:4},{value:"Message Binding Object",id:"message-binding-object",level:4}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"bindings",children:"Bindings"}),"\n",(0,s.jsx)(n.p,{children:"To indicate the binding (protocol) that's documented, there are multiple options to document them.\nAdd at least one binding so that readers know the protocol in use and functionality like publishing works."}),"\n",(0,s.jsxs)(n.p,{children:["To use the protocol specific bindings, ensure that you have added the corresponding ",(0,s.jsx)(n.a,{href:"/docs/introduction/supported-protocols",children:"plugin"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"protocol-specific-annotations",children:"Protocol specific annotations"}),"\n",(0,s.jsx)(n.h3,{id:"amqpasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@AmqpAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with AMQP, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@AmqpAsyncOperationBinding(cc = "example-topic-routing-key")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"kafkaasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@KafkaAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with Kafka, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@KafkaAsyncOperationBinding(\n bindingVersion = "1"\n)\n'})}),"\n",(0,s.jsx)(n.h3,{id:"jmsasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@JmsAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with JMS, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"@JmsAsyncOperationBinding\n"})}),"\n",(0,s.jsx)(n.h3,{id:"snsasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@SnsAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with SNS, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"@SnsAsyncOperationBinding\n"})}),"\n",(0,s.jsx)(n.h3,{id:"sqsasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@SqsAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with SQS, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v2.6.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"@SqsAsyncOperationBinding\n"})}),"\n",(0,s.jsx)(n.h2,{id:"generic-annotation",children:"Generic annotation"}),"\n",(0,s.jsx)(n.p,{children:"This binding is generic, so that any properties can be specified."}),"\n",(0,s.jsx)(n.h3,{id:"asyncgenericoperationbinding",children:(0,s.jsx)(n.code,{children:"@AsyncGenericOperationBinding"})}),"\n",(0,s.jsx)(n.p,{children:"You can define anything and there is no validation."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@AsyncGenericOperationBinding(\n type = "custom-binding",\n fields = {\n "internal-field=customValue",\n "nested.key=nestedValue"\n }\n)\n'})}),"\n",(0,s.jsx)(n.h2,{id:"binding-properties",children:"Binding properties"}),"\n",(0,s.jsx)(n.p,{children:"Explanation of the different binding properties."}),"\n",(0,s.jsx)(n.h3,{id:"general",children:"General"}),"\n",(0,s.jsx)(n.p,{children:"The following properties are the same for all bindings."}),"\n",(0,s.jsx)(n.h4,{id:"queue-name-channel-name",children:"Queue Name (Channel Name)"}),"\n",(0,s.jsx)(n.p,{children:"The queue name that will be used to publish messages to by the UI."}),"\n",(0,s.jsx)(n.h4,{id:"description",children:"Description"}),"\n",(0,s.jsxs)(n.p,{children:["Optional. The description allows for human-friendly text to verbosely explain the ",(0,s.jsx)(n.em,{children:"message"}),", like specific domain, what the topic is used for and which data it contains."]}),"\n",(0,s.jsx)(n.h4,{id:"payload-type",children:"Payload Type"}),"\n",(0,s.jsx)(n.p,{children:"The class object of the payload that will be published to this channel."}),"\n",(0,s.jsx)(n.h4,{id:"headers",children:"Headers"}),"\n",(0,s.jsx)(n.p,{children:"The Kafka headers describing the metadata of the payload, more details in the generic ProducerData."}),"\n",(0,s.jsxs)(n.p,{children:["The Springwolf comes with a special ",(0,s.jsx)(n.code,{children:"AsyncHeadersCloudEventConstants"})," to document CloudEvents."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"kafka"})," header ",(0,s.jsx)(n.code,{children:"__TypeId__"})," (constant from ",(0,s.jsx)(n.code,{children:" AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME"}),") can be documented as well."]}),"\n",(0,s.jsx)(n.h3,{id:"amqp",children:"AMQP"}),"\n",(0,s.jsx)(n.h4,{id:"exchange-name",children:"Exchange Name"}),"\n",(0,s.jsx)(n.p,{children:"The exchange name that will be used to bind queues to."}),"\n",(0,s.jsx)(n.h4,{id:"routing-key",children:"Routing Key"}),"\n",(0,s.jsx)(n.p,{children:"The routing key used when publishing a message."}),"\n",(0,s.jsx)(n.h3,{id:"kafka",children:"Kafka"}),"\n",(0,s.jsx)(n.h4,{id:"group-id",children:"Group Id"}),"\n",(0,s.jsx)(n.p,{children:"The group id that will be used during message consumption"}),"\n",(0,s.jsx)(n.h4,{id:"client-id",children:"Client Id"}),"\n",(0,s.jsx)(n.p,{children:"The client id to identify the consumer"}),"\n",(0,s.jsx)(n.h3,{id:"google-pubsub-binding-annotations",children:"Google PubSub binding annotations"}),"\n",(0,s.jsx)(n.h4,{id:"channel-binding-object",children:"Channel Binding Object"}),"\n",(0,s.jsx)(n.p,{children:"The Channel Bindings Object is used to describe the Google Cloud Pub/Sub Topic details."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@GooglePubSubAsyncChannelBinding(\n messageRetentionDuration = "messageRetentionDuration",\n messageStoragePolicy =\n @GooglePubsubAsyncMessageStoragePolicy(allowedPersistenceRegions = {"region1", "region2"}),\n schemaSettings =\n @GooglePubSubAsyncSchemaSetting(\n encoding = "BINARY",\n firstRevisionId = "firstRevisionId",\n lastRevisionId = "lastRevisionId",\n name = "projects/{project}/schemas/{schema}"))\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"MessageRetentionDuration"}),": Indicates the minimum duration to retain a message after it's published to the topic"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Message Storage Policy"}),": The Message Storage Policy Object is used to describe the Google Cloud Pub/Sub MessageStoragePolicy."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A list of IDs of GCP regions where messages that are published to the topic may be persisted in storage"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Schema Settings"}),":The"," Schema Settings Object is used to describe the Google Cloud Pub/Sub SchemaSettings."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"encoding: The encoding of the message"}),"\n",(0,s.jsx)(n.li,{children:"firstRevisionId: The minimum (inclusive) revision allowed for validating messages"}),"\n",(0,s.jsx)(n.li,{children:"lastRevisionId: The maximum (inclusive) revision allowed for validating messages"}),"\n",(0,s.jsxs)(n.li,{children:["name: The name of the schema that messages published should be validated against (The format is ",(0,s.jsx)(n.code,{children:"projects/{project}/schemas/{schema}"}),".)"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"message-binding-object",children:"Message Binding Object"}),"\n",(0,s.jsx)(n.p,{children:"The Message Binding Object is used to describe the Google Cloud Pub/Sub PubsubMessage details, alongside with pertinent parts of the Google Cloud Pub/Sub Schema Object."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@GooglePubSubAsyncMessageBinding(\n orderingKey = "key",\n schema = @GooglePubSubAsyncMessageSchema(name = "projects/{project}/schemas/{schema}"))\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"OrderingKey"}),": If non-empty, identifies related messages for which publish order should be respected"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Schema Definition"}),": The Schema Definition Object is used to describe the Google Cloud Pub/Sub Schema Object with AsyncAPI. While some of this information could be, or is, described using native AsyncAPI, for consistency it makes sense to provide this information here at all times, especially for cases where AsyncAPI doesn't natively support describing payloads using a supported Google Cloud Pub/Sub schema format like Protobuf"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"name: The name of the schema"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(7294);const o={},a=s.createContext(o);function t(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(self.webpackChunkspringwolf_docs=self.webpackChunkspringwolf_docs||[]).push([[987],{6376:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>c,contentTitle:()=>t,default:()=>h,frontMatter:()=>a,metadata:()=>d,toc:()=>r});var s=i(5893),o=i(1151);const a={sidebar_position:66},t="Bindings",d={id:"configuration/documenting-bindings",title:"Bindings",description:"To indicate the binding (protocol) that's documented, there are multiple options to document them.",source:"@site/docs/configuration/documenting-bindings.md",sourceDirName:"configuration",slug:"/configuration/documenting-bindings",permalink:"/docs/configuration/documenting-bindings",draft:!1,unlisted:!1,editUrl:"https://github.com/springwolf/springwolf.github.io/edit/master/docs/configuration/documenting-bindings.md",tags:[],version:"current",sidebarPosition:66,frontMatter:{sidebar_position:66},sidebar:"tutorialSidebar",previous:{title:"Producers",permalink:"/docs/configuration/documenting-producers"},next:{title:"Messages",permalink:"/docs/configuration/documenting-messages"}},c={},r=[{value:"Protocol specific annotations",id:"protocol-specific-annotations",level:2},{value:"@AmqpAsyncOperationBinding",id:"amqpasyncoperationbinding",level:3},{value:"@KafkaAsyncOperationBinding",id:"kafkaasyncoperationbinding",level:3},{value:"@JmsAsyncOperationBinding",id:"jmsasyncoperationbinding",level:3},{value:"@SnsAsyncOperationBinding",id:"snsasyncoperationbinding",level:3},{value:"@SqsAsyncOperationBinding",id:"sqsasyncoperationbinding",level:3},{value:"Generic annotation",id:"generic-annotation",level:2},{value:"@AsyncGenericOperationBinding",id:"asyncgenericoperationbinding",level:3},{value:"Binding properties",id:"binding-properties",level:2},{value:"General",id:"general",level:3},{value:"Queue Name (Channel Name)",id:"queue-name-channel-name",level:4},{value:"Description",id:"description",level:4},{value:"Payload Type",id:"payload-type",level:4},{value:"Headers",id:"headers",level:4},{value:"AMQP",id:"amqp",level:3},{value:"Exchange Name",id:"exchange-name",level:4},{value:"Routing Key",id:"routing-key",level:4},{value:"Kafka",id:"kafka",level:3},{value:"Group Id",id:"group-id",level:4},{value:"Client Id",id:"client-id",level:4},{value:"Google PubSub binding annotations",id:"google-pubsub-binding-annotations",level:3},{value:"Channel Binding Object",id:"channel-binding-object",level:4},{value:"Message Binding Object",id:"message-binding-object",level:4}];function l(e){const n={a:"a",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.a)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h1,{id:"bindings",children:"Bindings"}),"\n",(0,s.jsx)(n.p,{children:"To indicate the binding (protocol) that's documented, there are multiple options to document them.\nAdd at least one binding so that readers know the protocol in use and functionality like publishing works."}),"\n",(0,s.jsxs)(n.p,{children:["To use the protocol specific bindings, ensure that you have added the corresponding ",(0,s.jsx)(n.a,{href:"/docs/introduction/supported-protocols",children:"plugin"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"protocol-specific-annotations",children:"Protocol specific annotations"}),"\n",(0,s.jsx)(n.h3,{id:"amqpasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@AmqpAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with AMQP, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@AmqpAsyncOperationBinding(cc = "example-topic-routing-key")\n'})}),"\n",(0,s.jsx)(n.h3,{id:"kafkaasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@KafkaAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with Kafka, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@KafkaAsyncOperationBinding(\n bindingVersion = "1"\n)\n'})}),"\n",(0,s.jsx)(n.h3,{id:"jmsasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@JmsAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with JMS, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"@JmsAsyncOperationBinding\n"})}),"\n",(0,s.jsx)(n.h3,{id:"snsasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@SnsAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with SNS, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"@SnsAsyncOperationBinding\n"})}),"\n",(0,s.jsx)(n.h3,{id:"sqsasyncoperationbinding",children:(0,s.jsx)(n.code,{children:"@SqsAsyncOperationBinding"})}),"\n",(0,s.jsxs)(n.p,{children:["Associate this operation with SQS, see ",(0,s.jsx)(n.a,{href:"https://www.asyncapi.com/docs/reference/specification/v3.0.0#operationBindingsObject",children:"operation-binding"})," for details."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:"@SqsAsyncOperationBinding\n"})}),"\n",(0,s.jsx)(n.h2,{id:"generic-annotation",children:"Generic annotation"}),"\n",(0,s.jsx)(n.p,{children:"This binding is generic, so that any properties can be specified."}),"\n",(0,s.jsx)(n.h3,{id:"asyncgenericoperationbinding",children:(0,s.jsx)(n.code,{children:"@AsyncGenericOperationBinding"})}),"\n",(0,s.jsx)(n.p,{children:"You can define anything and there is no validation."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@AsyncGenericOperationBinding(\n type = "custom-binding",\n fields = {\n "internal-field=customValue",\n "nested.key=nestedValue"\n }\n)\n'})}),"\n",(0,s.jsx)(n.h2,{id:"binding-properties",children:"Binding properties"}),"\n",(0,s.jsx)(n.p,{children:"Explanation of the different binding properties."}),"\n",(0,s.jsx)(n.h3,{id:"general",children:"General"}),"\n",(0,s.jsx)(n.p,{children:"The following properties are the same for all bindings."}),"\n",(0,s.jsx)(n.h4,{id:"queue-name-channel-name",children:"Queue Name (Channel Name)"}),"\n",(0,s.jsx)(n.p,{children:"The queue name that will be used to publish messages to by the UI."}),"\n",(0,s.jsx)(n.h4,{id:"description",children:"Description"}),"\n",(0,s.jsxs)(n.p,{children:["Optional. The description allows for human-friendly text to verbosely explain the ",(0,s.jsx)(n.em,{children:"message"}),", like specific domain, what the topic is used for and which data it contains."]}),"\n",(0,s.jsx)(n.h4,{id:"payload-type",children:"Payload Type"}),"\n",(0,s.jsx)(n.p,{children:"The class object of the payload that will be published to this channel."}),"\n",(0,s.jsx)(n.h4,{id:"headers",children:"Headers"}),"\n",(0,s.jsx)(n.p,{children:"The Kafka headers describing the metadata of the payload, more details in the generic ProducerData."}),"\n",(0,s.jsxs)(n.p,{children:["The Springwolf comes with a special ",(0,s.jsx)(n.code,{children:"AsyncHeadersCloudEventConstants"})," to document CloudEvents."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"kafka"})," header ",(0,s.jsx)(n.code,{children:"__TypeId__"})," (constant from ",(0,s.jsx)(n.code,{children:" AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME"}),") can be documented as well."]}),"\n",(0,s.jsx)(n.h3,{id:"amqp",children:"AMQP"}),"\n",(0,s.jsx)(n.h4,{id:"exchange-name",children:"Exchange Name"}),"\n",(0,s.jsx)(n.p,{children:"The exchange name that will be used to bind queues to."}),"\n",(0,s.jsx)(n.h4,{id:"routing-key",children:"Routing Key"}),"\n",(0,s.jsx)(n.p,{children:"The routing key used when publishing a message."}),"\n",(0,s.jsx)(n.h3,{id:"kafka",children:"Kafka"}),"\n",(0,s.jsx)(n.h4,{id:"group-id",children:"Group Id"}),"\n",(0,s.jsx)(n.p,{children:"The group id that will be used during message consumption"}),"\n",(0,s.jsx)(n.h4,{id:"client-id",children:"Client Id"}),"\n",(0,s.jsx)(n.p,{children:"The client id to identify the consumer"}),"\n",(0,s.jsx)(n.h3,{id:"google-pubsub-binding-annotations",children:"Google PubSub binding annotations"}),"\n",(0,s.jsx)(n.h4,{id:"channel-binding-object",children:"Channel Binding Object"}),"\n",(0,s.jsx)(n.p,{children:"The Channel Bindings Object is used to describe the Google Cloud Pub/Sub Topic details."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@GooglePubSubAsyncChannelBinding(\n messageRetentionDuration = "messageRetentionDuration",\n messageStoragePolicy =\n @GooglePubsubAsyncMessageStoragePolicy(allowedPersistenceRegions = {"region1", "region2"}),\n schemaSettings =\n @GooglePubSubAsyncSchemaSetting(\n encoding = "BINARY",\n firstRevisionId = "firstRevisionId",\n lastRevisionId = "lastRevisionId",\n name = "projects/{project}/schemas/{schema}"))\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"MessageRetentionDuration"}),": Indicates the minimum duration to retain a message after it's published to the topic"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Message Storage Policy"}),": The Message Storage Policy Object is used to describe the Google Cloud Pub/Sub MessageStoragePolicy."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"A list of IDs of GCP regions where messages that are published to the topic may be persisted in storage"}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Schema Settings"}),":The"," Schema Settings Object is used to describe the Google Cloud Pub/Sub SchemaSettings."]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"encoding: The encoding of the message"}),"\n",(0,s.jsx)(n.li,{children:"firstRevisionId: The minimum (inclusive) revision allowed for validating messages"}),"\n",(0,s.jsx)(n.li,{children:"lastRevisionId: The maximum (inclusive) revision allowed for validating messages"}),"\n",(0,s.jsxs)(n.li,{children:["name: The name of the schema that messages published should be validated against (The format is ",(0,s.jsx)(n.code,{children:"projects/{project}/schemas/{schema}"}),".)"]}),"\n"]}),"\n",(0,s.jsx)(n.h4,{id:"message-binding-object",children:"Message Binding Object"}),"\n",(0,s.jsx)(n.p,{children:"The Message Binding Object is used to describe the Google Cloud Pub/Sub PubsubMessage details, alongside with pertinent parts of the Google Cloud Pub/Sub Schema Object."}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-java",children:'@GooglePubSubAsyncMessageBinding(\n orderingKey = "key",\n schema = @GooglePubSubAsyncMessageSchema(name = "projects/{project}/schemas/{schema}"))\n'})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"OrderingKey"}),": If non-empty, identifies related messages for which publish order should be respected"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.code,{children:"Schema Definition"}),": The Schema Definition Object is used to describe the Google Cloud Pub/Sub Schema Object with AsyncAPI. While some of this information could be, or is, described using native AsyncAPI, for consistency it makes sense to provide this information here at all times, especially for cases where AsyncAPI doesn't natively support describing payloads using a supported Google Cloud Pub/Sub schema format like Protobuf"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"name: The name of the schema"}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.a)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},1151:(e,n,i)=>{i.d(n,{Z:()=>d,a:()=>t});var s=i(7294);const o={},a=s.createContext(o);function t(e){const n=s.useContext(a);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function d(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:t(e.components),s.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.9da98919.js b/assets/js/runtime~main.44a073b6.js similarity index 77% rename from assets/js/runtime~main.9da98919.js rename to assets/js/runtime~main.44a073b6.js index 9225572..2714625 100644 --- a/assets/js/runtime~main.9da98919.js +++ b/assets/js/runtime~main.44a073b6.js @@ -1 +1 @@ -(()=>{"use strict";var e,t,r,a,o,n={},f={};function i(e){var t=f[e];if(void 0!==t)return t.exports;var r=f[e]={exports:{}};return n[e].call(r.exports,r,r.exports,i),r.exports}i.m=n,e=[],i.O=(t,r,a,o)=>{if(!r){var n=1/0;for(b=0;b=o)&&Object.keys(i.O).every((e=>i.O[e](r[d])))?r.splice(d--,1):(f=!1,o0&&e[b-1][2]>o;b--)e[b]=e[b-1];e[b]=[r,a,o]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);i.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var f=2&a&&e;"object"==typeof f&&!~t.indexOf(f);f=r(f))Object.getOwnPropertyNames(f).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,i.d(o,n),o},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"assets/js/"+({47:"6e4be760",49:"74876495",53:"935f2afb",84:"96d964ec",122:"59ea8c71",195:"c4f5d8e4",236:"a3634906",368:"a94703ab",416:"a5464bee",493:"c62485b9",518:"a7bd4aaa",558:"df10045a",586:"b7140423",638:"04d926a5",661:"5e95c892",836:"0480b142",847:"1fb40151",918:"17896441",987:"ad7e3673"}[e]||e)+"."+{47:"8c2698db",49:"c663f78f",53:"d1b399a0",84:"8924ea6d",122:"a0969827",195:"dee17deb",236:"6e643fdd",312:"190cac0a",368:"c0235a1a",416:"0c9add8d",493:"dcbe6b1e",518:"7fefd17e",558:"7a7f2244",586:"d4ea96ef",638:"644de9be",661:"82121e1d",772:"552adb6c",836:"4399576b",847:"274d666d",918:"7a8bf6f3",987:"5591c06b"}[e]+".js",i.miniCssF=e=>{},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="springwolf-docs:",i.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var f,d;if(void 0!==r)for(var c=document.getElementsByTagName("script"),b=0;b{f.onerror=f.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],f.parentNode&&f.parentNode.removeChild(f),o&&o.forEach((e=>e(r))),t)return t(r)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=l.bind(null,f.onerror),f.onload=l.bind(null,f.onload),d&&document.head.appendChild(f)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="/",i.gca=function(e){return e={17896441:"918",74876495:"49","6e4be760":"47","935f2afb":"53","96d964ec":"84","59ea8c71":"122",c4f5d8e4:"195",a3634906:"236",a94703ab:"368",a5464bee:"416",c62485b9:"493",a7bd4aaa:"518",df10045a:"558",b7140423:"586","04d926a5":"638","5e95c892":"661","0480b142":"836","1fb40151":"847",ad7e3673:"987"}[e]||e,i.p+i.u(e)},(()=>{var e={303:0,532:0};i.f.j=(t,r)=>{var a=i.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var n=i.p+i.u(t),f=new Error;i.l(n,(r=>{if(i.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;f.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",f.name="ChunkLoadError",f.type=o,f.request=n,a[1](f)}}),"chunk-"+t,t)}},i.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],f=r[1],d=r[2],c=0;if(n.some((t=>0!==e[t]))){for(a in f)i.o(f,a)&&(i.m[a]=f[a]);if(d)var b=d(i)}for(t&&t(r);c{"use strict";var e,t,r,a,o,n={},f={};function i(e){var t=f[e];if(void 0!==t)return t.exports;var r=f[e]={exports:{}};return n[e].call(r.exports,r,r.exports,i),r.exports}i.m=n,e=[],i.O=(t,r,a,o)=>{if(!r){var n=1/0;for(u=0;u=o)&&Object.keys(i.O).every((e=>i.O[e](r[d])))?r.splice(d--,1):(f=!1,o0&&e[u-1][2]>o;u--)e[u]=e[u-1];e[u]=[r,a,o]},i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,i.t=function(e,a){if(1&a&&(e=this(e)),8&a)return e;if("object"==typeof e&&e){if(4&a&&e.__esModule)return e;if(16&a&&"function"==typeof e.then)return e}var o=Object.create(null);i.r(o);var n={};t=t||[null,r({}),r([]),r(r)];for(var f=2&a&&e;"object"==typeof f&&!~t.indexOf(f);f=r(f))Object.getOwnPropertyNames(f).forEach((t=>n[t]=()=>e[t]));return n.default=()=>e,i.d(o,n),o},i.d=(e,t)=>{for(var r in t)i.o(t,r)&&!i.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},i.f={},i.e=e=>Promise.all(Object.keys(i.f).reduce(((t,r)=>(i.f[r](e,t),t)),[])),i.u=e=>"assets/js/"+({47:"6e4be760",49:"74876495",53:"935f2afb",84:"96d964ec",122:"59ea8c71",195:"c4f5d8e4",236:"a3634906",368:"a94703ab",416:"a5464bee",493:"c62485b9",518:"a7bd4aaa",558:"df10045a",586:"b7140423",638:"04d926a5",661:"5e95c892",836:"0480b142",847:"1fb40151",918:"17896441",987:"ad7e3673"}[e]||e)+"."+{47:"8c2698db",49:"c663f78f",53:"d1b399a0",84:"8924ea6d",122:"a0969827",195:"dee17deb",236:"6e643fdd",312:"190cac0a",368:"c0235a1a",416:"0c9add8d",493:"dcbe6b1e",518:"7fefd17e",558:"7a7f2244",586:"d4ea96ef",638:"644de9be",661:"82121e1d",772:"552adb6c",836:"4399576b",847:"b1420d7b",918:"7a8bf6f3",987:"52d6031a"}[e]+".js",i.miniCssF=e=>{},i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),a={},o="springwolf-docs:",i.l=(e,t,r,n)=>{if(a[e])a[e].push(t);else{var f,d;if(void 0!==r)for(var c=document.getElementsByTagName("script"),u=0;u{f.onerror=f.onload=null,clearTimeout(s);var o=a[e];if(delete a[e],f.parentNode&&f.parentNode.removeChild(f),o&&o.forEach((e=>e(r))),t)return t(r)},s=setTimeout(b.bind(null,void 0,{type:"timeout",target:f}),12e4);f.onerror=b.bind(null,f.onerror),f.onload=b.bind(null,f.onload),d&&document.head.appendChild(f)}},i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.p="/",i.gca=function(e){return e={17896441:"918",74876495:"49","6e4be760":"47","935f2afb":"53","96d964ec":"84","59ea8c71":"122",c4f5d8e4:"195",a3634906:"236",a94703ab:"368",a5464bee:"416",c62485b9:"493",a7bd4aaa:"518",df10045a:"558",b7140423:"586","04d926a5":"638","5e95c892":"661","0480b142":"836","1fb40151":"847",ad7e3673:"987"}[e]||e,i.p+i.u(e)},(()=>{var e={303:0,532:0};i.f.j=(t,r)=>{var a=i.o(e,t)?e[t]:void 0;if(0!==a)if(a)r.push(a[2]);else if(/^(303|532)$/.test(t))e[t]=0;else{var o=new Promise(((r,o)=>a=e[t]=[r,o]));r.push(a[2]=o);var n=i.p+i.u(t),f=new Error;i.l(n,(r=>{if(i.o(e,t)&&(0!==(a=e[t])&&(e[t]=void 0),a)){var o=r&&("load"===r.type?"missing":r.type),n=r&&r.target&&r.target.src;f.message="Loading chunk "+t+" failed.\n("+o+": "+n+")",f.name="ChunkLoadError",f.type=o,f.request=n,a[1](f)}}),"chunk-"+t,t)}},i.O.j=t=>0===e[t];var t=(t,r)=>{var a,o,n=r[0],f=r[1],d=r[2],c=0;if(n.some((t=>0!==e[t]))){for(a in f)i.o(f,a)&&(i.m[a]=f[a]);if(d)var u=d(i)}for(t&&t(r);c Behind the scenes | Springwolf - + @@ -12,7 +12,7 @@

The following paragraphs describe how Springwolf works internally.

Big Picture

When the Spring Boot application is started, Springwolf uses its scanners to find defined consumers and producers within the application. -Based on the results, the channels/topics are extracted including payload type and merged together into an AsyncAPI conform document.

+Based on the results, the channels/topics are extracted including payload type and merged together into an AsyncAPI conform document.

The AsyncAPI document is accessible an endpoint. When the Springwolf UI is opened, the browser fetches the document and renders it (see demo).

When publishing is enabled, the user can publish a message through the UI to another endpoint. @@ -25,7 +25,7 @@

PluginsScanners

springwolf-core runs all scanners and merges the found results together into one AsyncAPI document. When the same channel/topic is found multiple times, it's merged as well.

-

The result is a ChannelItem. +

The result is a ChannelItem. The ChannelObject contains the Message for the receive and/or send operation.

Building an example payload

When the scanners scan and build the result, they also extract the payload type. diff --git a/docs/configuration/customizing/index.html b/docs/configuration/customizing/index.html index 5dfe1dc..c9e96f9 100644 --- a/docs/configuration/customizing/index.html +++ b/docs/configuration/customizing/index.html @@ -4,7 +4,7 @@ Customizing | Springwolf - + diff --git a/docs/configuration/documenting-bindings/index.html b/docs/configuration/documenting-bindings/index.html index ed73d01..93985f4 100644 --- a/docs/configuration/documenting-bindings/index.html +++ b/docs/configuration/documenting-bindings/index.html @@ -4,7 +4,7 @@ Bindings | Springwolf - + @@ -14,19 +14,19 @@

To use the protocol specific bindings, ensure that you have added the corresponding plugin.

Protocol specific annotations

@AmqpAsyncOperationBinding

-

Associate this operation with AMQP, see operation-binding for details.

+

Associate this operation with AMQP, see operation-binding for details.

@AmqpAsyncOperationBinding(cc = "example-topic-routing-key")

@KafkaAsyncOperationBinding

-

Associate this operation with Kafka, see operation-binding for details.

+

Associate this operation with Kafka, see operation-binding for details.

@KafkaAsyncOperationBinding(
bindingVersion = "1"
)

@JmsAsyncOperationBinding

-

Associate this operation with JMS, see operation-binding for details.

+

Associate this operation with JMS, see operation-binding for details.

@JmsAsyncOperationBinding

@SnsAsyncOperationBinding

-

Associate this operation with SNS, see operation-binding for details.

+

Associate this operation with SNS, see operation-binding for details.

@SnsAsyncOperationBinding

@SqsAsyncOperationBinding

-

Associate this operation with SQS, see operation-binding for details.

+

Associate this operation with SQS, see operation-binding for details.

@SqsAsyncOperationBinding

Generic annotation

This binding is generic, so that any properties can be specified.

diff --git a/docs/configuration/documenting-consumers/index.html b/docs/configuration/documenting-consumers/index.html index 178278b..256dc58 100644 --- a/docs/configuration/documenting-consumers/index.html +++ b/docs/configuration/documenting-consumers/index.html @@ -4,7 +4,7 @@ Consumers | Springwolf - + diff --git a/docs/configuration/documenting-messages/index.html b/docs/configuration/documenting-messages/index.html index de19f6c..3d2d8e3 100644 --- a/docs/configuration/documenting-messages/index.html +++ b/docs/configuration/documenting-messages/index.html @@ -4,7 +4,7 @@ Messages | Springwolf - + diff --git a/docs/configuration/documenting-producers/index.html b/docs/configuration/documenting-producers/index.html index f2bbe0a..9ea6692 100644 --- a/docs/configuration/documenting-producers/index.html +++ b/docs/configuration/documenting-producers/index.html @@ -4,7 +4,7 @@ Producers | Springwolf - + diff --git a/docs/configuration/index.html b/docs/configuration/index.html index df34aad..a56df34 100644 --- a/docs/configuration/index.html +++ b/docs/configuration/index.html @@ -4,7 +4,7 @@ Configuration | Springwolf - + diff --git a/docs/faq/index.html b/docs/faq/index.html index bf194d9..a690ef8 100644 --- a/docs/faq/index.html +++ b/docs/faq/index.html @@ -4,7 +4,7 @@ Frequently Asked Questions | Springwolf - + diff --git a/docs/introduction/index.html b/docs/introduction/index.html index e04c375..db01832 100644 --- a/docs/introduction/index.html +++ b/docs/introduction/index.html @@ -4,7 +4,7 @@ Introduction | Springwolf - + diff --git a/docs/introduction/supported-protocols/index.html b/docs/introduction/supported-protocols/index.html index 3f94433..ef0952b 100644 --- a/docs/introduction/supported-protocols/index.html +++ b/docs/introduction/supported-protocols/index.html @@ -4,7 +4,7 @@ Supported Protocols | Springwolf - + diff --git a/docs/quickstart/index.html b/docs/quickstart/index.html index e9c6368..3327d72 100644 --- a/docs/quickstart/index.html +++ b/docs/quickstart/index.html @@ -4,7 +4,7 @@ Quickstart | Springwolf - + diff --git a/index.html b/index.html index bd12754..840e16b 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,7 @@ Springwolf | Springwolf - +