Hi All, I am working adding queue purge functionality to the admin API. I am thinking of using following design.
*Request:* DELETE/queues/*queueName*/messages *Success Response:* HTTP/1.1 200 OK WDYT? On Wed, Jan 17, 2018 at 10:41 AM, Malintha Amarasinghe <malint...@wso2.com> wrote: > Hi Asitha/All, > > The paths overall look good to me too and +1 to the Harsha's suggestion on > pagination. > > I have a small suggestion regarding below concern Asitha has mentioned: > > > I have few concerns regarding deleting bindings. There is no unique key >> for the binding hence I was thinking of something like following for the >> delete binding (combination of routing key and queue name is unique) >> */exchanges/{exchangeName}/bindings/{routingKey}/{queueName}* >> What about using something like >> */exchanges/{exchangeName}/bindings?routingKey=myTopic&queueName=tmp_1234 >> *for >> the delete? Can we consider a URI with query params as a unique resource? >> > > Shall we introduce a new ID to identify binding? It can be a unique UUID. This > is the approach we have been using in APIM APIs. > > When we create a new binding, the response will include the unique UUID. > > Eg: > > *Request:* > > POST /exchanges/*exchange1*/bindings > { > "routingKey": "routingPattern", > "queueName": "myQueue", > "filterExpression": "MessageId = 12345" > } > > *Response:* > > HTTP/1.1 201 Created > Location: *https://localhost:9292/admin/1.0 > <https://localhost:9292/admin/1.0>*/exchanges/*exchange1*/bindings/ > *4a349d47-12fa-490c-bb06-d90610a4897d* > > { > * "id" : "4a349d47-12fa-490c-bb06-d90610a4897d"* > "routingKey": "routingPattern", > "queueName": "myQueue", > "filterExpression": "MessageId = 12345" > } > > > We can use this ID for next operations with it. > > Eg: > > GET *https://localhost:9292/admin/1.0 <https://localhost:9292/admin/1.0>*/ > exchanges/*exchange1*/bindings/*4a349d47-12fa-490c-bb06-d90610a4897d* > DELETE *https://localhost:9292/admin/1.0 > <https://localhost:9292/admin/1.0>*/exchanges/*exchange1*/bindings/ > *4a349d47-12fa-490c-bb06-d90610a4897d* > > Also binding list can include each bindings IDs: > > eg: > > GET /exchanges/*exchange1*/bindings?offset=20&limit=10 > { > "count": 10, > "list": [ { > * "id" : "4a349d47-12fa-490c-bb06-d90610a4897d"* > "routingKey": "routingPattern", > "queueName": "myQueue", > "filterExpression": "MessageId = 12345" > }, > { > * "id" : "d6cf5769-33a1-48e7-b9fd-3db8580292e0"* > "routingKey": "routingPattern2", > "queueName": "myQueue2", > "filterExpression": "MessageId = 123456789" > }, > ... > ... > ], > "pagination": { > "total": 134, > "offset": 20, > "limit": 10, > "next": "/exchanges/*exchange1*/bindings?offset=30&limit=10", > "previous": "/exchanges/*exchange1*/bindings?offset=10&limit=10" > } > } > > Thanks! > > On Mon, Jan 15, 2018 at 10:49 PM, Harsha Kumara <hars...@wso2.com> wrote: > >> >> >> On Fri, Jan 12, 2018 at 9:35 AM, Asitha Nanayakkara <asi...@wso2.com> >> wrote: >> >>> Hi all, >>> >>> Taking all the concerns discussed in to account I did some updates on >>> the design. >>> >>> With this design, I'll be exposing the exchanges, bindings, queues, and >>> consumers. This is to avoid confusion in coming up with a design to expose >>> topics (pub-sub pattern) as a first-class citizen (Since it is another >>> exchange within the broker). >>> >>> Following is the updated design >>> >>> >>> Base path /broker/v.1.0 >>> >>> >>> >>> >>> >>> >>> >>> Queues >>> >>> >>> 5 Create Queue/Topic POST /queues/ { "name": "queueName", "durable": >>> true, "autoDelete": false } >>> 6 List Queues/Topics GET /queues >>> 7 Get Queue Details GET /queues/{queueName} >>> 8 Delete Queue DELETE /queues/{queueName} >>> >>> >>> >>> >>> >>> >>> Subscriptions for a queue or topic >>> >>> >>> 9 List subscriptions for a destination GET /queues/{queueName}/consumers >>> 10 Get subscriber details GET /queues/{queueName}/consumers/ >>> {consumerTag} >>> 11 Close subscriber DELETE /queues/{queueName}/consumers/{consumerTag} >>> >>> >>> >>> >>> >>> >>> Exchanges >>> >>> >>> 1 Create Exchange POST /exchanges { "name": "exchangeName", "type": >>> "amq.direct", "durable": true } >>> 2 Get All exchanges GET /exchanges >>> 3 Get Exchange GET /exchanges/{exchangeName} >>> 4 Delete Exchange DELETE /exchanges/{exchangeName} >>> >>> >>> >>> >>> >>> >>> Bindings >>> >>> >>> >>> List bindings for exchange GET /exchanges/{exchangeName}/bindings >>> >>> Add binding POST /exchanges/{exchangeName}/bindings {"routingKey": >>> "routingPattern", "queueName": "myQueue", "filterExpression": "MessageId = >>> 12345"} >>> >>> Delete binding DELETE /exchanges/{exchangeName}/bind >>> ings/{routingKey}/{queueName} >>> >>> >>> >>> >>> >>> >>> I have few concerns regarding deleting bindings. There is no unique key >>> for the binding hence I was thinking of something like following for the >>> delete binding (combination of routing key and queue name is unique) >>> */exchanges/{exchangeName}/bindings/{routingKey}/{queueName}* >>> >>> What about using something like >>> */exchanges/{exchangeName}/bindings?routingKey=myTopic&queueName=tmp_1234 >>> *for the delete? Can we consider a URI with query params as a unique >>> resource? >>> >>> I have attached the swagger file for the API as well. >>> >> Attached swagger is looks fine. You will need to add the details about >> authetication schemes in to the swagger itself which will be useful. Also >> the results which returns lists such as queues will be required to have >> pagination. In APIM we are using separate pagination context in response as >> follow. >> >> { >> "count": 2, >> ... >> ... >> "pagination": { >> "total": 4, >> "offset": 0, >> "limit": 2 >> >> } >> >> } >>> >>> >>> Regards, >>> Asitha >>> >>> >>> On Thu, Jan 11, 2018 at 8:36 AM, Asanka Abeyweera <asank...@wso2.com> >>> wrote: >>> >>>> Hi Asitha, >>>> >>>> I think it is better to say queues rather than destinations since the >>>> actions mean different things in queues and topics. For example, >>>> >>>> - Create >>>> - Queues - we can create the queue in broker core. This will be >>>> useful in assigning permissions >>>> - Topics - We can't do anything at broker code. Corresponding >>>> queues will depend on the subscription id if durable, random name if >>>> non >>>> durable. >>>> - Search >>>> - Queues - we can return queues matching the search criteria >>>> - Topics - It's hard to decide what to return since their can be >>>> unlimited number of options. >>>> - Delete >>>> - Queues - we can delete the specified queues >>>> - Topics - Again bit ambiguous what to delete. Maybe we can go >>>> through the matching bindings and delete the matching queues. My >>>> opinion is >>>> we should not do such a thing. >>>> >>>> Addtionally when we are desiging the REST API better if we dont expose >>>> functionalities that we are expecting to expose through the HTTP transport. >>>> I think the main objective in the first iteration should be to assist the >>>> users in debugging issues. Some information that a user might need is, >>>> >>>> - Queue list >>>> - Subscriptions for a given queue >>>> - Queue details - number messages etc >>>> - Message details >>>> - Permission details >>>> - Binding details of a queue. Will be very useful for topic >>>> scenarios. >>>> >>>> >>>> On Thu, Jan 11, 2018 at 12:41 AM, Eranda Rajapakshe <eran...@wso2.com> >>>> wrote: >>>> >>>>> Hi Asitha, >>>>> >>>>> Thanks for the explanation. >>>>> >>>>> On Wed, Jan 10, 2018 at 10:29 PM, Asitha Nanayakkara <asi...@wso2.com> >>>>> wrote: >>>>> >>>>>> Hi Eranda, >>>>>> >>>>>> >>>>>> On Wed, Jan 10, 2018 at 6:47 PM, Eranda Rajapakshe <eran...@wso2.com> >>>>>> wrote: >>>>>> >>>>>>> Hi all, >>>>>>> >>>>>>> Small addition to the Malintha's suggestion, I think a binding >>>>>>> should be a 3-tuple element <exchange-name, queue-name, routing-key> >>>>>>> >>>>>> For Bindings, we'll be using queue-name, routing-key, and filters. >>>>>> Exchange name can be inferred since we define bindings for a given >>>>>> exchange. >>>>>> >>>>> +1 >>>>> >>>>>> >>>>>>> Also, is it correct to use the term "destination" to generalize >>>>>>> queues and topics? AFAIK it's coming from the JMS world. >>>>>>> >>>>>> Yes, If we are going with a separate path for queues, outside >>>>>> /exchanges, we can have something like /queues. Used destinations to >>>>>> avoid >>>>>> the confusion with queues and topics. >>>>>> >>>>> Understood. +1 >>>>> I think its better to use the term "queue" if we are going to expose >>>>> this as a AMQP broker. >>>>> >>>>>> >>>>>>> Thanks, >>>>>>> >>>>>>> On Wed, Jan 10, 2018 at 6:29 PM, Asitha Nanayakkara <asi...@wso2.com >>>>>>> > wrote: >>>>>>> >>>>>>>> Hi all, >>>>>>>> >>>>>>>> @Eranda: Thanks for pointing out the concern. We will be able to >>>>>>>> get over this concern by way of following the approach suggested by >>>>>>>> Malintha. >>>>>>>> >>>>>>>> @Malintha; Only concern I have with exposing GET /destinations is, >>>>>>>> we will expose all the queues, including temporary queues created for >>>>>>>> topics. Maybe we might be able to get over this by way of using >>>>>>>> filters. >>>>>>>> >>>>>>>> @Sanjeewa: We are planning to write this admin service using MSF4J >>>>>>>> and we are exposing this to do administrative tasks on the broker. >>>>>>>> Eventually the broker UI will use these servises as well. I will work >>>>>>>> on >>>>>>>> creating the swagger definitions based on these suggessions. >>>>>>>> >>>>>>>> Regards, >>>>>>>> Asitha >>>>>>>> >>>>>>>> On Wed, Jan 10, 2018 at 6:10 PM, Malintha Amarasinghe < >>>>>>>> malint...@wso2.com> wrote: >>>>>>>> >>>>>>>>> Hi all, >>>>>>>>> >>>>>>>>> A suggestion for Eranda's concern, for that I think we need to >>>>>>>>> remove the "exchanges" from the destinations APIs. >>>>>>>>> >>>>>>>>> One possible solution is: >>>>>>>>> >>>>>>>>> *Create Queue/Topic* >>>>>>>>> POST /destinations { "name": "queueName", "durable": true, >>>>>>>>> "autoDelete": false } >>>>>>>>> >>>>>>>>> *List Queues/Topics * >>>>>>>>> GET /destinations >>>>>>>>> >>>>>>>>> *Get Queue Details * >>>>>>>>> GET /destinations/{destinationName} >>>>>>>>> >>>>>>>>> *Delete Queue * >>>>>>>>> DELETE /destinations/{destinationName} >>>>>>>>> >>>>>>>>> *New APIs for adding/retrieving bindings:* >>>>>>>>> >>>>>>>>> *Add a new binding: (not sure about the name "binding" is >>>>>>>>> appropriate)* >>>>>>>>> POST /bindings >>>>>>>>> { >>>>>>>>> "exchangeName" : "exchange1", >>>>>>>>> "destinationName" : "destination1" >>>>>>>>> } >>>>>>>>> >>>>>>>>> *Get bindings for a particular exchange:* >>>>>>>>> GET /bindings?exchangeName="exchange1" => Provides a list of >>>>>>>>> bindings for the particular exchange >>>>>>>>> >>>>>>>>> During a discussion, Asitha mentioned about default exchange; If >>>>>>>>> exchangeName is not provided can we use it as its default value? >>>>>>>>> >>>>>>>>> WDYT? >>>>>>>>> >>>>>>>>> Thanks! >>>>>>>>> >>>>>>>>> >>>>>>>>> On Wed, Jan 10, 2018 at 5:59 PM, Sanjeewa Malalgoda < >>>>>>>>> sanje...@wso2.com> wrote: >>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Wed, Jan 10, 2018 at 5:40 PM, Asitha Nanayakkara < >>>>>>>>>> asi...@wso2.com> wrote: >>>>>>>>>> >>>>>>>>>>> Adding Harshak, Sanjeewa and Malinthaa >>>>>>>>>>> >>>>>>>>>>> On Wed, Jan 10, 2018 at 5:37 PM, Asitha Nanayakkara < >>>>>>>>>>> asi...@wso2.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi all, >>>>>>>>>>>> >>>>>>>>>>>> In the new message broker implementation we are implementing >>>>>>>>>>>> broker semantics based on AMQP 0.9.1 specification. >>>>>>>>>>>> >>>>>>>>>>>> From an administrative operations perspective, we have >>>>>>>>>>>> identified following resources to be exposed through restful web >>>>>>>>>>>> services. >>>>>>>>>>>> >>>>>>>>>>>> - exchanges >>>>>>>>>>>> - queues >>>>>>>>>>>> - topics >>>>>>>>>>>> - consumers >>>>>>>>>>>> >>>>>>>>>>>> There are currently two types of exchange. Namely, >>>>>>>>>>>> >>>>>>>>>>>> - direct exchange - relates to mostly known queue scenarios >>>>>>>>>>>> - topic exchange - relates to topic scenarios (pub-sub >>>>>>>>>>>> pattern) >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> *Queues and topics* >>>>>>>>>>>> >>>>>>>>>>>> Within the broker, there are only queues. These queues are >>>>>>>>>>>> bound to direct and topic exchanges. Depending on the bound >>>>>>>>>>>> exchange we >>>>>>>>>>>> perceive them as either pub-sub pattern or queue pattern. >>>>>>>>>>>> Therefore within the Admin API's we refer to either a queue or >>>>>>>>>>>> a topic as a *destination.* >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> *Consumers* >>>>>>>>>>>> >>>>>>>>>>>> For each internal queue (a destination) there will be >>>>>>>>>>>> consumers. Messages are delivered to consumers in round robin >>>>>>>>>>>> manner. >>>>>>>>>>>> >>>>>>>>>>>> In topic scenario (pub-sub pattern) topic exchange will bind a >>>>>>>>>>>> separate queue (a destination) per each consumer with the same >>>>>>>>>>>> topic name. >>>>>>>>>>>> When a message is published it will get delivered to the set of >>>>>>>>>>>> queues with >>>>>>>>>>>> the matching topic and then to the relevant consumers on those >>>>>>>>>>>> queues >>>>>>>>>>>> >>>>>>>>>>>> Considering the above broker semantics we have come up with the >>>>>>>>>>>> following Admin API design for the broker >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Base path /broker/v.1.0 >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> *Exchanges* >>>>>>>>>>>> *Method* >>>>>>>>>>>> *Path* >>>>>>>>>>>> *Payload* >>>>>>>>>>>> 1 Create Exchange POST /exchanges { "name": "exchangeName", >>>>>>>>>>>> "type": "amq.direct", "durable": true } >>>>>>>>>>>> 2 Get All exchanges GET /exchanges >>>>>>>>>>>> 3 Get Exchange GET /exchanges/{exchangeName} >>>>>>>>>>>> 4 Delete Exchange DELETE /exchanges/{exchangeName} >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> *Destinations (Queues/Topics)* >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 5 Create Queue/Topic POST /exchanges/{exchangeName}/dest >>>>>>>>>>>> inations { "name": "queueName", "durable": true, "autoDelete": >>>>>>>>>>>> false } >>>>>>>>>>>> 6 List Queues/Topics GET /exchanges/{exchangeName}/destinations >>>>>>>>>>>> 7 Get Queue Details GET /exchanges/{exchangeName}/dest >>>>>>>>>>>> inations/{destinationName} >>>>>>>>>>>> 8 Delete Queue DELETE /exchanges/{exchangeName}/dest >>>>>>>>>>>> inations/{destinationName} >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> *Consumers (for a queue or topic)* >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 9 List subscriptions for a destination GET >>>>>>>>>>>> /exchanges/{exchangeName}/destinations/{destinationName}/con >>>>>>>>>>>> sumers >>>>>>>>>>>> 10 Get subscriber details GET /exchanges/{exchangeName}/dest >>>>>>>>>>>> inations/{destinationName}/consumers/{consumerTag} >>>>>>>>>>>> 11 Close subscriber DELETE /exchanges/{exchangeName}/dest >>>>>>>>>>>> inations/{destinationName}/consumers/{consumerTag} >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> When retrieving a set of exchanges, destinations or consumers >>>>>>>>>>>> we will be able to filter the result set by way of using query >>>>>>>>>>>> parameters. >>>>>>>>>>>> >>>>>>>>>>> This API looks good and followed REST nature. I assume exchange >>>>>>>>>> name, destination name, consumer tag etc are unique. Then only we >>>>>>>>>> can build >>>>>>>>>> above mentioned resource model. >>>>>>>>>> Also do we need to let users to check the possibility of creating >>>>>>>>>> exchange, destination or consumer tag before we create it. Then we >>>>>>>>>> might >>>>>>>>>> need http head method as well. >>>>>>>>>> If you need to update que details then you have to use put as >>>>>>>>>> well. Ex: enable/disable auto delete after we create it first time. >>>>>>>>>> Also lets define proper response codes as well(201 to created, >>>>>>>>>> 202 accepted etc). >>>>>>>>>> >>>>>>>>>> What is the plan to expose this API to outside? Is it MSF4J? If >>>>>>>>>> that is the case you can start with swagger definition and move >>>>>>>>>> forward. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> sanjeewa. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>>>> Regards, >>>>>>>>>>>> Asitha >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> *Asitha Nanayakkara* <http://asitha.github.io/> >>>>>>>>>>>> Associate Technical Lead >>>>>>>>>>>> WSO2, Inc. <http://wso2.com/> >>>>>>>>>>>> Mob: +94 77 853 0682 <+94%2077%20853%200682> >>>>>>>>>>>> [image: https://wso2.com/signature] >>>>>>>>>>>> <https://wso2.com/signature> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> *Asitha Nanayakkara* <http://asitha.github.io/> >>>>>>>>>>> Associate Technical Lead >>>>>>>>>>> WSO2, Inc. <http://wso2.com/> >>>>>>>>>>> Mob: +94 77 853 0682 <077%20853%200682> >>>>>>>>>>> [image: https://wso2.com/signature] <https://wso2.com/signature> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> >>>>>>>>>> *Sanjeewa Malalgoda* >>>>>>>>>> WSO2 Inc. >>>>>>>>>> Mobile : +94713068779 <+94%2071%20306%208779> >>>>>>>>>> >>>>>>>>>> <http://sanjeewamalalgoda.blogspot.com/>blog >>>>>>>>>> :http://sanjeewamalalgoda.blogspot.com/ >>>>>>>>>> <http://sanjeewamalalgoda.blogspot.com/> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Malintha Amarasinghe >>>>>>>>> *WSO2, Inc. - lean | enterprise | middleware* >>>>>>>>> http://wso2.com/ >>>>>>>>> >>>>>>>>> Mobile : +94 712383306 <+94%2071%20238%203306> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> *Asitha Nanayakkara* <http://asitha.github.io/> >>>>>>>> Associate Technical Lead >>>>>>>> WSO2, Inc. <http://wso2.com/> >>>>>>>> Mob: +94 77 853 0682 <+94%2077%20853%200682> >>>>>>>> [image: https://wso2.com/signature] <https://wso2.com/signature> >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Architecture mailing list >>>>>>>> Architecture@wso2.org >>>>>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> *Eranda Rajapakshe* >>>>>>> Software Engineer >>>>>>> WSO2 Inc. >>>>>>> Mobile : +94784822608 >>>>>>> >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> *Asitha Nanayakkara* <http://asitha.github.io/> >>>>>> Associate Technical Lead >>>>>> WSO2, Inc. <http://wso2.com/> >>>>>> Mob: +94 77 853 0682 <+94%2077%20853%200682> >>>>>> [image: https://wso2.com/signature] <https://wso2.com/signature> >>>>>> >>>>>> >>>>> >>>>> >>>>> -- >>>>> *Eranda Rajapakshe* >>>>> Software Engineer >>>>> WSO2 Inc. >>>>> Mobile : +94784822608 >>>>> >>>>> _______________________________________________ >>>>> Architecture mailing list >>>>> Architecture@wso2.org >>>>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>>>> >>>>> >>>> >>>> >>>> -- >>>> Asanka Abeyweera >>>> Associate Technical Lead >>>> WSO2 Inc. >>>> >>>> Phone: +94 712228648 <+94%2071%20222%208648> >>>> Blog: a5anka.github.io >>>> >>>> <https://wso2.com/signature> >>>> >>> >>> >>> >>> -- >>> *Asitha Nanayakkara* <http://asitha.github.io/> >>> Associate Technical Lead >>> WSO2, Inc. <http://wso2.com/> >>> Mob: +94 77 853 0682 <+94%2077%20853%200682> >>> [image: https://wso2.com/signature] <https://wso2.com/signature> >>> >>> >>> _______________________________________________ >>> Architecture mailing list >>> Architecture@wso2.org >>> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >>> >>> >> >> >> -- >> Harsha Kumara >> Software Engineer, WSO2 Inc. >> Mobile: +94775505618 <+94%2077%20550%205618> >> Blog:harshcreationz.blogspot.com >> >> _______________________________________________ >> Architecture mailing list >> Architecture@wso2.org >> https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture >> >> > > > -- > Malintha Amarasinghe > *WSO2, Inc. - lean | enterprise | middleware* > http://wso2.com/ > > Mobile : +94 712383306 <+94%2071%20238%203306> > > _______________________________________________ > Architecture mailing list > Architecture@wso2.org > https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture > > -- Asanka Abeyweera Associate Technical Lead WSO2 Inc. Phone: +94 712228648 Blog: a5anka.github.io <https://wso2.com/signature>
_______________________________________________ Architecture mailing list Architecture@wso2.org https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture