Home Help Center

using indirects proxies from multiple IceGrids with one single Communicator

FranckFranck Member Franck de GivryOrganization: ExaneProject: Financial pricing framework

Hello,

I had problems working with indirect proxies among multiple IceGrid when using one single Communicator in my client.
On purpose, I disabled the Ice.Default.Locator property and instead I used the ice_locator() method on each proxy received form the server :

The following pseudocode works fine on the first attempt :

communicator = Ice.initialize()

strLocator = 'IceGrid/Locator:tcp -h someHost1 -p 4061'
locatorPrx = Ice.LocatorPrx.checkedCast(communicator.stringToProxy(strLocator))
mainProxyPrx = castor.SomeProxyPrx.checkedCast(communicator.stringToProxy('SomeProxyIndentity:tcp -h someHost1 -p 5064'))
someProxyPrx = mainProxyPrx.getOtherProxy().ice_locator(locatorPrx)
someProxyPrx->performSomeAction() // works fine

but a second attempt against another server fails :

strLocator2 = 'IceGrid/Locator:tcp -h **someHost2** -p 4061'
locator2Prx = Ice.LocatorPrx.checkedCast(communicator.stringToProxy(strLocator2))
anotherMainProxyPrx = castor.SomeProxyPrx.checkedCast(communicator.stringToProxy('SomeProxyIndentity:tcp -h **someHost2** -p 5064'))
someOtherProxyPrx = anotherMainProxyPrx.getOtherProxy().ice_locator(locator2Prx)
someOtherProxyPrx->performSomeAction() // get an **ObjectNotExists** exception

unless I amend the the communicator's initialization sequence :

initData = Ice.InitializationData()
initData.properties = Ice.createProperties()
initData.properties.setProperty('Ice.Default.LocatorCacheTimeout', 0)
communicator = Ice.initialize(initData)

It's like some 'ghost' previous locator is used despite a new locator has been explicitly attached to the newly obtained proxy.

What am I missing here?

Thanks in advance for any clue!

Tagged:

Answers

  • benoitbenoit Rennes, FranceAdministrators, ZeroC Staff Benoit FoucherOrganization: ZeroC, Inc.Project: Ice ZeroC Staff

    Hi,

    You should use different identities for different IceGrid instances:

    str1Locator = 'IceGrid1/Locator:tcp -h someHost1 -p 4061'
    strLocator2 = 'IceGrid2/Locator:tcp -h **someHost2** -p 4061'
    

    If you're using the same identity, both locators will share the same internal locator cache (the locator cache caches endpoints for indirect proxies).

    It works with Ice.Default.LocatorCacheTimeout=0 because this property setting disables the locator cache.

    Cheers,
    Benoit

Sign In or Register to comment.