Peter Machon created ARTEMIS-3949:
-------------------------------------

             Summary: Internally synchronize methods in ClientSession 
implementations
                 Key: ARTEMIS-3949
                 URL: https://issues.apache.org/jira/browse/ARTEMIS-3949
             Project: ActiveMQ Artemis
          Issue Type: Improvement
          Components: ActiveMQ-Artemis-Native
    Affects Versions: 2.24.0
            Reporter: Peter Machon
            Assignee: Clebert Suconic


{{ClientSessionImpl}} has two internal functions i.e. {{startCall}} and 
{{{}endCall{}}}. These function count concurrent access and throw in case of 
concurrent access.
They are used e.g. in {{{}ClientProducerImpl{}}}s {{doSend}} method and in the 
{{ClientSessionImpls}} {{acknowledge}} method.

This forces user code to synchronize the use of the session object. That is a 
pain for two reasons:

1. From a user perspective it is not even clear, which methods are internally 
counting concurrent access. E.g. the `doSend` method does not even belong to 
the session.

2. The session object is not accessible from the user code at any time. E.g. 
the {{ClientMessageImpl}} internally uses the {{{}ClientSession{}}}s 
{{acknowledge}} method. From user code it is not necessarily clear which 
session the `ClientMessage` belongs to.
Thus, it would require user code to e.g. implement their own message store just 
to be able to synchronize the right session.

Solution:

The {{ClientSessionImpl}} and all other internal objects like 
{{{}ClientProducerImpl, ClientMessageImpl{}}}, and similar have full access and 
knowledge about their synchronization needs.
I thus suggest to implement synchronization where needed instead of leaving the 
user alone with this issue, where the solution actually means to reimplement a 
lot of functionality of the client.

E.g.

{{startCall();}}
{{try {}}
{{sessionContext.sendACK(false, blockOnAcknowledge, consumer, message);}}
{{} finally {}}
{{endCall();}}
 
could be replaced with something like

{{synchronized(this) {}}
{{sessionContext.sendACK(false, blockOnAcknowledge, consumer, message);}}
{{} }}

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to