Archived
This forum has been archived. Please start a new discussion on GitHub.
Local asynchronous calls arrive never
Hello,
I have problem with local calls to IceObjects via a proxy (with Local call I mean, that the tcp stack is not used, since the communicator recognizes that it is the same process).
If I do the blocking call, everything is ok, but if I use the begin_* version, the call never arrives.
Here is the HelloWorld example with client and server in one communicator with a blocking and a non blocking call:
Or am i doing something wrong?
I have problem with local calls to IceObjects via a proxy (with Local call I mean, that the tcp stack is not used, since the communicator recognizes that it is the same process).
If I do the blocking call, everything is ok, but if I use the begin_* version, the call never arrives.
Here is the HelloWorld example with client and server in one communicator with a blocking and a non blocking call:
#include <Ice/Ice.h>
#include "Printer.h"
using namespace std;
using namespace Test;
class PrinterI : public Printer {
public:
virtual void printString(const string& s,
const Ice::Current&);
};
void
PrinterI::
printString(const string& s, const Ice::Current&)
{
cout << s << endl;
}
int
main(int argc, char* argv[])
{
int status = 0;
Ice::CommunicatorPtr ic;
try {
ic = Ice::initialize(argc, argv);
Ice::ObjectAdapterPtr adapter = ic->createObjectAdapterWithEndpoints("SimplePrinterAdapter", "default -p 10000");
Ice::ObjectPtr object = new PrinterI;
adapter->add(object, ic->stringToIdentity("SimplePrinter"));
adapter->activate();
Ice::ObjectPrx base = ic->stringToProxy(
"SimplePrinter:default -p 10000");
PrinterPrx printer = PrinterPrx::checkedCast(base);
if (!printer)
throw "Invalid proxy";
printer->printString("Hello World!"); // <- this works
printer->begin_printString("Hello World!"); // <- this does NOT work
ic->waitForShutdown();
} catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
} catch (const char* msg) {
cerr << msg << endl;
status = 1;
}
if (ic) {
try {
ic->destroy();
} catch (const Ice::Exception& e) {
cerr << e << endl;
status = 1;
}
}
return status;
}
Or am i doing something wrong?
0
Comments
-
Hi,
The begin_printString call is failing and you don't know why because you don't provide a callback or call the corresponding end_printString method on the returned result, try changing the call to:printer->end_printString(printer->begin_printString("Hello World!"));
It should throw an Ice::CollocationOptimizationException exception indicating that collocation optimization isn't supported with AMI. You will therefore need to disable collocation optimization for this to work. You can do this by setting Ice.Default.CollocationOptimized=0 or programmatically:printer->ice_collocationOptimized(false)->begin_printString("Hello World!");
Note that the next Ice version (3.6) will support AMI and collocation optimization.
Cheers,
Benoit.0 -
That is unfortunate, but thank you for your quick response.0