[
https://issues.apache.org/jira/browse/AMQCPP-543?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Christian Mamen updated AMQCPP-543:
-----------------------------------
Attachment: activemq-cpp_AMQCPP-543_v0.patch
Hi,
I compare with the java client, and uploaded a patch that I think does pretty
much what the java do.
The java assume the latest version of the protocol by default and when it
receives a wireFormatInfo command from the broker, saves the protocol version.
this is done in an AtomicInteger.
ActiveMQMessageProducer.java
{code}
// Enable producer window flow control if protocol > 3 and the window
// size > 0
if (session.connection.getProtocolVersion() >= 3 &&
this.info.getWindowSize() > 0) {
producerWindow = new MemoryUsage("Producer Window: " + producerId);
producerWindow.setExecutor(session.getConnectionExecutor());
producerWindow.setLimit(this.info.getWindowSize());
producerWindow.start();
}
{code}
Can you explain why the comment says protocol > 3, but the code actually does
>= 3? Perhaps you can also review the patch?
> message producer send never blocking when using producer flow control
> ---------------------------------------------------------------------
>
> Key: AMQCPP-543
> URL: https://issues.apache.org/jira/browse/AMQCPP-543
> Project: ActiveMQ C++ Client
> Issue Type: New Feature
> Components: Openwire
> Affects Versions: 3.8.2
> Reporter: Christian Mamen
> Assignee: Timothy Bish
> Priority: Minor
> Attachments: activemq-cpp_AMQCPP-543_v0.patch
>
>
> For testing,
> message producer is set to non-persisted mode, with the connection producer
> window size to 1MB. (the broker enables the producer flow control and set the
> memory limit to ~10MB with vm only storage)
> I notice that when i don't have any message consumer, the broker notify me
> that the memory limit is reached, that the producer will be throttled (as i
> would expect), however the producer never blocks on a send, as if the window
> size has no effect.
> while digging into ActiveMQProducerKernel.cpp,
> I notice the private member memoryUsage (auto_ptr) is never initialized. and
> there's a TODO in the code ?
> {code}
> ActiveMQProducerKernel::ActiveMQProducerKernel(
> [...]
> // TODO - Check for need of MemoryUsage if there's a producer Windows size
> // and the Protocol version is greater than 3.
> }
> {code}
> I tried initializing the memoryUsage, and producer seem to block as expected
> on a send, when the limit is reached.
> {code}
> ActiveMQProducerKernel::ActiveMQProducerKernel(
> [...]
> // TODO - Check for need of MemoryUsage if there's a producer Windows size
> // and the Protocol version is greater than 3.
> if (session->getConnection()->getProducerWindowSize()) {
> this->memoryUsage.reset( new
> MemoryUsage(session->getConnection()->getProducerWindowSize()) );
> }
> }
> {code}
> I'm not sure what is the proper fix,
--
This message was sent by Atlassian JIRA
(v6.2#6252)