Hi Justin, Thanks for sharing the results of you work on a new API.
I briefly looked through the suggested design and POC and the following questions sprang into my mind: * the suggest API does not have any notion of transactions yet. I suppose it is still work in progress and transaction support will be added later. Do you plan to add transaction support? * the suggested API defines a message class which can be instantiated by calling constructor and passing a body. I assume that passing List/Map/Dictionary/bytes would result in creation of corresponding body section suitable for the type. I assume custom message body types will not be supported by the API. Otherwise, some body decoder/encoder would need to be provided via API. * the message settling is delegated to Tracker class in case of sender and Delivery class in case of receiver. I suppose it is done to encapsulate delivery state, tag and id. Why settling functionality cannot be implemented on a message class? That might make API simpler and eliminate the need for Tracker and Delivery classes... * Would it be possible to specify the message settling modes (for sender and receiver) via suggested API? * What about receiver credit management? How session and receiver credits can be specified by the end user? Kind Regards, Alex On Mon, 13 Jan 2020 at 12:40, Justin Ross <justin.r...@gmail.com> wrote: > Hi, everyone. For a while now, some members of the Qpid community have > been working on a new style of messaging API. It now has a reasonable > shape, and we want to share it and get your feedback. > > We currently offer either JMS or Proton's reactive API. These certainly > aren't going anywhere - they're important - but for some use cases, the > absence of a high-level command-oriented API for AMQP messaging is a source > of inconvenience. > > This inconvenience comes in two forms. First, JMS is helpfully imperative > (in part - it contains multitudes), but it doesn't expose some of the > things you can do with AMQP. And it can't reasonably expose those things, > because that would break the contract of the JMS API. Second, the Proton > APIs, since they are reactive, make it harder to handle cases where you > need to sequence the processing of events. > > The imperative client API we are talking about here uses modern language > support for futures or coroutines. Most of the API's operation is > asynchronous, but you can easily introduce blocking where you need to. > > It's a client API only. We think a comparably high-level server API would > be its own dedicated thing, functioning more like Python Flask or JAX-RS. > In any case, the Proton reactive API is already a good fit for writing > servers. > > We have the outline of the API and some proof-of-concept implementations, > but much remains to be done. We anticipate that this work will ultimately > become a sub-module of Proton, such as proton/client. > > The API spec: > http://www.ssorj.net/pumpjack/client/index.html > > I've worked on the Python prototypes, so I'll share them here. I did these > some time ago, so they need updating for the latest API spec changes, but > they serve to show how the API can use futures or coroutines. (For Python, > coroutines are the preferred approach.) > > Python prototype (future-based): > https://github.com/ssorj/gambit/blob/futures/python/demo.py > https://github.com/ssorj/gambit/blob/futures/python/gambit.py > > Python prototype (coroutine-based): > https://github.com/ssorj/gambit/blob/asyncio2/python/demo.py > https://github.com/ssorj/gambit/blob/asyncio2/python/gambit.py > > Some of the other folks who have done exploratory work will follow up on > this thread to show what they've done. > > Some caveats: this is in early stages, and the API will change as we > discuss it more. There are also big outstanding pieces to look at, such as > reconnect and failover, to name just one. > > Thanks for your time, and please let us know what you think. >