/** Process messages from queue by applying a functor. */ void process(size_t n, string queue, boost::function<void (const string&)> msgFn) { if (!opts.summary) cout << "Processing " << n << " messages from " << queue << " " << flush; LocalQueue lq; subs.setFlowControl(n, SubscriptionManager::UNLIMITED, false); subs.subscribe(lq, queue); for (size_t i = 0; i < n; ++i) { if (!opts.summary) cout << "." << flush; msgFn(lq.pop().getData()); } if (!opts.summary) cout << " done." << endl; }
void run() { // Controller try { // Wait for subscribers to be ready. process(opts.totalSubs, fqn("sub_ready"), boost::bind(expect, _1, "ready")); LocalQueue pubDone; LocalQueue subDone; subs.setFlowControl(0, SubscriptionManager::UNLIMITED, false); subs.subscribe(pubDone, fqn("pub_done")); subs.subscribe(subDone, fqn("sub_done")); double txrateTotal(0); double mbytesTotal(0); double pubRateTotal(0); double subRateTotal(0); for (size_t j = 0; j < opts.iterations; ++j) { AbsTime start=now(); send(opts.totalPubs, fqn("pub_start"), "start"); // Start publishers if (j) { send(opts.totalSubs, fqn("sub_iteration"), "next"); // Start subscribers on next iteration } Stats pubRates; Stats subRates; process(opts.totalPubs, pubDone, fqn("pub_done"), boost::ref(pubRates)); process(opts.totalSubs, subDone, fqn("sub_done"), boost::ref(subRates)); AbsTime end=now(); double time=secs(start, end); if (time <= 0.0) { throw Exception("ERROR: Test completed in zero seconds. Try again with a larger message count."); } double txrate=opts.transfers/time; double mbytes=(txrate*opts.size)/(1024*1024); if (!opts.summary) { cout << endl << "Total " << opts.transfers << " transfers of " << opts.size << " bytes in " << time << " seconds." << endl; cout << endl << "Publish transfers/sec: " << endl; pubRates.print(cout); cout << endl << "Subscribe transfers/sec: " << endl; subRates.print(cout); cout << endl << "Total transfers/sec: " << txrate << endl << "Total Mbytes/sec: " << mbytes << endl; } else { cout << pubRates.mean() << "\t" << subRates.mean() << "\t" << txrate << "\t" << mbytes << endl; } txrateTotal += txrate; mbytesTotal += mbytes; pubRateTotal += pubRates.mean(); subRateTotal += subRates.mean(); } if (opts.iterations > 1) { cout << "Averages: "<< endl << (pubRateTotal / opts.iterations) << "\t" << (subRateTotal / opts.iterations) << "\t" << (txrateTotal / opts.iterations) << "\t" << (mbytesTotal / opts.iterations) << endl; } } catch (const std::exception& e) { cout << "Controller exception: " << e.what() << endl; } }