Hi Robbie,

As per my other email I think we agree and just have
difficulties communicating our thoughts.

I do not have further comments for the time being :)

Kind regards,
Lorenz


On 11/01/17 10:43, Robbie Gemmell wrote:
Yes. Each connection that has a ClientID is effectively setting a
namepace. As covered by the JMS spec snippet you quoted, tracking
state per-name is essentially all the JMS ClientID is used for. It
used to be mandatory for durable subs, but now isn't, and not
specifying a ClientID is then in itself another state grouping.
Accounting for the various further naming restrictions placed on the
different subscription types (durable/volatile, shared/non-shared,
ClientID set/not-set etc), you end up with the 5 distinct effective
[sub-]spaces outlined in the JIRA, with the volatile non-shared ones
being their own special almost irrelvant randomly named one as you
note.

Robbie

On 11 January 2017 at 10:21, Lorenz Quack <quack.lor...@gmail.com> wrote:
Hello again,

Alex just pointed out to me that I missed an important part of
the JMS 2.0 spec.  In chapter 8.3 it says:
     A shared non-durable subscription is identified by a name
     specified by the client and by the client identifier if set.
I take that to mean that each client Id should have their own
separate namespace.  Maybe that is what was meant in QPIDJMS-220?

In this case I retract my previous proposal and just propose a
clarification to QPIDJMS-220:
  * Each clientId creates their own namespace
  * If no clientId is set this is treated like a separate
    anonymous namespace
  * Within each of those namespaces there exists the following
    sub-namespaces:
    * Durable (shared + non-shared) with durable, non-share
      requiring a clientId
    * Volatile shared
  * Volatile non-shared are somewhat special in that they have a
    randomly assigned name so they should never conflict with
    anything


Kind regards,
Lorenz



On 11/01/17 08:51, Lorenz Quack wrote:
Hello,

Sorry for the slightly lengthy email.

tl;dr: I propose to change to the way JMS 2.0 subscriptions are
        treated in the face of the (non-)existence of a clientId as
        compared to what is outlined in QPIDJMS-220.


Introduction:
=============
I am working on adding support for JMS 2.0 shared subscriptions
[1] to the Qpid Broker for Java using the mechanisms outlined in
QPIDJMS-220 [2].

In QPIDJMS-220 it is outlined that there are essentially 5
disjunct subscription namespaces:
  * durable, shared and non-shared, with clientId
  * durable, shared, without clientId
  * volatile, shared, with clientId
  * volatile, shared, without clientId
  * volatile, non-shared, with and without clientId
while durable, non-shared, without clientId being disallowed by
the spec.

While I think this is spec compliant I find it unintuitive and
would like to discuss a different partitioning that, according to
my interpretation of the spec, is also compliant.


Proposal:
=========
The difference essentially comes down to the treatment of the
clientId.  To me the clientId is like a namespace and not
specifying it gives you access to an anonymous namespace (what
QPIDJMS-220 calls "global").  In this it should be treated no
different from other named namespaces resulting in the following
partitioning:
  * durable, shared and non-shared, regardless of clientId
  * volatile, shared, regardless of clientId
  * volatile, non-shared, regardless of clientId
with durable, non-shared, without clientId being disallowed by
the spec.


Relevant parts of the Specification:
====================================
 From JMS 2.0 Section 8.3.2 Shared non-durable subscriptions:
     There is no restriction to prevent a shared non-durable
     subscription and a durable subscription having the same name. Such
     subscriptions would be completely separate.

 From JMS 2.0 Section 6.1.3 Client identifier:
     The purpose of client identifier is to associate a connection and
     its objects with a state maintained on behalf of the client by a
     provider. By definition, the client state identified by a client
     identifier can be ‘in use’ by only one client at a time. A JMS
     provider must prevent concurrently executing clients from using
     it.
     This prevention may take the form of a JMSException being thrown
     when such use is attempted; it may result in the offending client
     being blocked; or some other solution. A JMS provider must ensure
     that such attempted ‘sharing’ of an individual client state does
     not result in messages being lost or doubly processed.


Discussion:
===========
As mentioned above I think both schemes are spec compliant.  The
difference is how they prevent concurrently executing clients from
using each others state.  Section 6.1.3 allows the prevention to take
the form of a JMSException (my proposal) or "some other solution"
(QPIDJMS-220, a.k.a. separate namespaces).

The reason for this I proposal is that I think it is a more natural
and intuitive partitioning with easier to understand rules.
For example, if a client with ID "foo" has a shared subscription
called "mysub" a client with ID "bar" would be prevented from also
creating a subscription of the name while a client without ID would be
allowed to do this under the QPIDJMS-220 scheme.  Under my proposed
scheme both, the "bar" client and the anonymous client, would be
prevented from creating the subscription.
Admittedly, it also makes my life as an implementor easier.

Is there a use-case or rational for the schema proposed in QPIDJMS-220
that I am not aware of?



Kind regards,
Lorenz

[1] Chapters 8.3 and 6.1.2 of the JMS 2.0 specification
[2] https://issues.apache.org/jira/browse/QPIDJMS-220


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
For additional commands, e-mail: users-h...@qpid.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
For additional commands, e-mail: users-h...@qpid.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@qpid.apache.org
For additional commands, e-mail: users-h...@qpid.apache.org

Reply via email to