On 09/06/2012 05:44 PM, William Henry wrote:
----- Original Message -----
In order to make sure that it can be done, I'm attempting to use
Proton-c in a multi-threaded server environment.The basic assumptions
that I'm making are:
1. The root data structure that threads can operate on is
pn_connector_t/pn_connection_t. An application thread cannotuse
pn_driver_t without taking measures to ensure that it is the only
one doing so at a time.
2. As long as no two threads are concurrently operating on the same
instance of pn_connection_t, everything should work properly.
So far, so good. There is one interesting exception to the above.
It will commonly be the case that a thread processing the reception
of a
message from an inbound link will need to indicate to a different
outbound link that there is now data to be sent (i.e. activate that
link
for write). It is likely that the outbound link will be associated
with
a different connection that the thread is not allowed to use because
another thread may be processing it concurrently.
FYI, I had to deal with this with the OpenMAMA integration work. The publisher
example program also has a reply queue and so subscribes for incoming messages.
To be safe I had to use two pn_messenger_t instances, one for the outbound and
one for the inbound. It was a bit ugly but because I am listening for replies
on another thread while publishing on the main thread I wasn't sure what else I
could do until Proton handled multiple threads.
This is not difficult to handle, but it requires that my threading
layer
be able to get the pn_connector_t associated with the link. Proton-c
provides the following linkage: pn_link_t => pn_session_t =>
pn_connection_t. There's no way to get the pn_connector_t though.
So, I think I need one of two possible changes:
1. Provide linkage from pn_connection_t to pn_connector_t (may be
architecturally undesirable), or
2. Add a void* context field to pn_connector_t.
Thoughts, Feelings, Emotions?
Whichever way you go I'm presuming that much of this will get hidden underneath
the pn_messenger_t interface.(?)
To be clear, I'm looking at the underpinnings of messaging
intermediaries (brokers, routers, proxies, firewalls, toolkits, etc.)
rather than endpoints. I don't think that pn_messenger_t is relevant in
such environments. However, there's no reason why a multi-threaded
client or server couldn't use the same patterns. There won't be any
benefit unless the endpoint is dealing with multiple connections though.
William
-Ted