Archived
This forum has been archived. Please start a new discussion on GitHub.
server's method get called twice while client received a TimeoutException
in Help Center
Hi :
I have modified the demo project hello's source code , and after some test I found a wierd problem.
In function sayHello of HelloI.cpp in server side
at the client side:
If I set _delay in server side to 5000 ms , and in my client's code, I set the hello proxy's timeout to 2000. we'll see that the same index will appear twice on server side's console.
That is , if client detected server timed out , it'll invoke the routine again.
attached is a screen shot and the zip of source code.
I have modified the demo project hello's source code , and after some test I found a wierd problem.
In function sayHello of HelloI.cpp in server side
int HelloI::sayHello(int index, const Ice::Current&) const { cout<<"call's index = "<<index<<endl;//display index passed from client IceUtil::ThreadControl::sleep( IceUtil::Time::milliSeconds( _delay ));//_delay is a pre-set value return 1; }
at the client side:
int iCount = 0; while(!bQuit) { try { cout<<"call's index = "<<iCount <<endl; hPrx->sayHello(iCount);//call server's hello and tell it current index } catch( const Ice::Exception& ex) { cout<<ex.ice_name()<<endl; } iCount ++; }
If I set _delay in server side to 5000 ms , and in my client's code, I set the hello proxy's timeout to 2000. we'll see that the same index will appear twice on server side's console.
That is , if client detected server timed out , it'll invoke the routine again.
attached is a screen shot and the zip of source code.
0
Comments
-
This shouldn't be happening because it violates at-most-once semantics. We'll have a look at this, thanks!
Michi.0 -
Actually, this is the expected behavior for idempotent operations. If you remove the idempotent keyword from the Slice, the retry won't occur to ensure at-most-once semantics are not violated.
See the section "Idempotent Operations" here in the Ice manual for more information.
Cheers,
Benoit.0 -
Ah, yes, I should have looked at the Slice definition. Benoit is right, of course. If you mark the operation as idempotent, the retry is just what should happen.
Cheers,
Michi.0 -
Oh ! It's my mistake .
Thank you very much for your explanation0