ICE提纲之demo/Glacier2/callback(跨网回调)

本例子展示了Glacier2 router的用法(没有使用Glacier2 session manager)。

如果clients与router不在同一台主机上,需要将以下地方修改为glacier2router所在机器的外部地址:

config.glacier2的Glacier2.Client.Endpoints
config.client的Ice.Default.Router和Callback.Client.Router

Glacier2router服务

启动命令

$ glacier2router --Ice.Config=config.glacier2

config.glacier2

#

# Set the instance name

#

Glacier2.InstanceName=DemoGlacier2

 

#

# The client-visible endpoint of Glacier2. This should be an endpoint

# visible from the public Internet, and it should be secure.

Glacier2.Client.Endpoints=ssl -p 4064 -h localhost

 

#

# The server-visible endpoint of Glacier2. This endpoint is only

# required if callbacks are needed (leave empty otherwise). This

# should be an endpoint on an internal network (like 192.168.x.x), or

# on the loopback, so that the server is not directly accessible from

# the Internet.

#

Glacier2.Server.Endpoints=tcp -h localhost

 

# For this demo, we use a null permissions verifier.

Glacier2.PermissionsVerifier=DemoGlacier2/NullPermissionsVerifier

 

#

# The timeout for inactive sessions. If any client session is inactive

# for longer than this value, the session expires and is removed. The

# unit is seconds.

#

Glacier2.SessionTimeout=30

 

#

# Glacier can forward requests buffered or unbuffered. Unbuffered

# means a lower resource consumption, as buffering requires one

# additional thread per connected client or server. However, without

# buffering, messages cannot be batched and message overriding doesn't

# work either. Also, with unbuffered request forwarding, the caller

# thread blocks for twoway requests.

# The default is to use buffering (=1), in both directions.

#Glacier2.Client.Buffered=0

#Glacier2.Server.Buffered=0

 

#

# These two lines instruct Glacier2 to forward contexts both for

# regular routing, as well as for callbacks (reverse routing).

#

Glacier2.Client.ForwardContext=1

Glacier2.Server.ForwardContext=1

 

#

# To prevent Glacier2 from being flooded with requests from or to one

# particular client, Glacier2 can be configured to sleep for a certain

# period after all current requests for this client have been

# forwarded. During this sleep period, new requests for the client are

# queued. These requests are then all sent once the sleep period is

# over. The unit is milliseconds.

#

Glacier2.Client.SleepTime=500

Glacier2.Server.SleepTime=500

 

#

# With the two settings below, Glacier2 can be instructed to always

# batch oneways, even if they are sent with a _fwd/o instead of a

# _fwd/O context.

# The default value for Glacier2.Client.AlwaysBatch and 

# Glacier2.Server.AlwaysBatch is 0.

#Glacier2.Client.AlwaysBatch=1

#Glacier2.Server.AlwaysBatch=1

 

#

# Glacier2 always disables active connection management so there is no

# need to configure this manually. Connection retry does not need to

# be disabled, as it's safe for Glacier2 to retry outgoing connections

# to servers. Retry for incoming connections from clients must be

# disabled in the clients.

#

Slice

Callback.ice

module Demo

{

 

interface CallbackReceiver

{

    void callback();

};

 

interface Callback

{

    void initiateCallback(CallbackReceiver* proxy);

    void shutdown();

};

 

};

服务器

CallbackI

void
CallbackI::initiateCallback(const CallbackReceiverPrx& proxy, const Ice::Current& current)
{
    proxy->callback();
}

void
CallbackI::shutdown(const Ice::Current& c)
{
    c.adapter->getCommunicator()->shutdown();
}

 

config.server

#

# The endpoint of the server's object adapter. This should be an

# endpoint on an internal network (like 192.168.x.x), or on the

# loopback, so that the server is not directly accessible from the

# Internet.

#

Callback.Server.Endpoints=tcp -h localhost -p 10000

Server.cpp

int

CallbackServer::run(int argc, char*[])

{

    Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Callback.Server");

    CallbackPtr cb = new CallbackI;

    adapter->add(cb, communicator()->stringToIdentity("callback"));

    adapter->activate();

    communicator()->waitForShutdown();

}

客户端

CallbackReceiverI

void
CallbackReceiverI::callback(const Ice::Current&)
{
    cout << "received callback" << endl;
}

 

config.client

#

# The proxy to the Glacier2 router for all outgoing connections. This

# must match the value of Glacier2.Client.Endpoints in config.glacier2.

#

Ice.Default.Router=DemoGlacier2/router:ssl -p 4064 -h localhost

 

#

# We don't need any endpoints for the client if we use a

# router. Incoming requests are received through connections

# established from the client to the router.

#

Callback.Client.Endpoints=

 

#

# This must match the value of Callback.Server.Endpoints in

# config.server.

#

Callback.Proxy=callback:tcp -h localhost -p 10000

Client.cpp

Glacier2::SessionPrx
CallbackClient::createSession()
{
    Glacier2::SessionPrx session;
    cout << "This demo accepts any user-id / password combination.\n";
    string id;
    string pw;
    session = router()->createSession(id, pw);
    return session;
}

int
CallbackClient::runWithSession(int argc, char*[])
{
    Ice::Identity callbackReceiverIdent = createCallbackIdentity("callbackReceiver");
    
    Ice::ObjectPrx base = communicator()->propertyToProxy("Callback.Proxy");
    CallbackPrx twoway = CallbackPrx::checkedCast(base);
    
    objectAdapter()->add(new CallbackReceiverI, callbackReceiverIdent);
    
    CallbackReceiverPrx twowayR = CallbackReceiverPrx::uncheckedCast(objectAdapter()->createProxy(callbackReceiverIdent));
    
    string override;
    
    char c;
    do
    {
        cin >> c;
        if(c == 't')
        {
            Ice::Context context;
            context["_fwd"] = "t";
            if(!override.empty())
            {
                context["_ovrd"] = override;
            }
            twoway->initiateCallback(twowayR, context);
        }
        else if(c == 'v')
        {
            if(override.empty())
            {
                override = "some_value";
            }
            else
            {
                override.clear();
            }
        }
        else if(c == 's')
        {
            twoway->shutdown();
        }
    }
    while(1);
}

 

 

posted @ 2014-06-16 17:46  One Leaf  阅读(2165)  评论(0编辑  收藏  举报