[rabbitmq-discuss] CommandAssembler

Ben Hood 0x6e6562 at gmail.com
Thu Nov 17 16:33:26 GMT 2011

Hey Steve,

Thanks for the heads up. I can understand that you want to keep the internal stuff internal and not have to maintain it for external consumers.

The reason why we were using it was for a test that uses a patched version of the tracer, so basically we had an import from there.

Having said that, I should maybe look at the new version of the tracer to see of we can just re-patch that, which may save us from monkey patching the assembler (or the code that links against it).

BTW I was wondering under what circumstances you were seeing race conditions in this section of the library. Of late, we've seen a few oddities at some loads (ca. 2000 shovel out-ins/sec) but it is difficult to reproduce and we always just assumed it was a bug in the threading of our shovel.



On Nov 17, 2011, at 12:05 PM, Steve Powell <steve at rabbitmq.com> wrote:

> Hi Ben,
> Yes, it was a conscious decision -- it goes with the concurrency and
> thread-safety changes we introduced.  Previously AMQCommand was not thread-safe.
> This was partly due to its use of the Assembler inner class, which serially
> shared state with the AMQCommand class.  Also, other parts of the implementation
> called AMQCommand.Assembler methods.
> When re-factoring AMQCommand we extracted CommandAssembler and synchronised on
> it.  This allowed us to remove the back reference to AMQCommand from the
> assembler, and encapsulate its state. If we expose the object we have problems
> with thread-safety and deadlocking again; but I guess exposing the class
> wouldn't be a problem.  However, its relationship with the AMQCommand class is
> now different, and the use of Assembler is limited entirely to the AMQCommand
> class in the new code.
> We kept it package private on general principles, and to enforce no leakage into
> the public client interface.  In general I am taking the view that the less
> visible the internals the harder it is for clients to break them.
> Can you explain how you were using Assembler? We would also be interested in how
> the com.rabbitmq.client.impl packages are being used in general. As a matter of
> long-term intent, the impl classes ought only to be used internally. Though I
> know they are pretty well exposed at present.
> Thank you for your feedback.
> Steve Powell
> On 15 Nov 2011, at 12:30, Ben Hood wrote:
>> I was wondering whether there was a conscious design choice to reduce
>> the visibility of the ported CommandAssembler to default package
>> scope?
>> We were using the old AMQCommand.Assembler which was public in the
>> com.rabbitmq.client.impl namespace.
>> Cheers,
>> Ben

More information about the rabbitmq-discuss mailing list