Another solution is to use the response leg of a transaction to push messages 
to the client, e.g. provide a server protocol like this:

WeatherUpdate listenForUpdate();

This would essentially block until an update is available.  The only problem is 
that if the client is expecting a series of updates, it would need to call this 
method again after receiving each update.

This is not an ideal solution, but it might solve your problem.

-Shaun


On Jan 20, 2012, at 8:24 AM, Armin Garcia wrote:

> Hi James,
>  
> First, thank you for your response.
>  
> Yes, you are right.  I am trying to setup a bi-directional communication 
> link.  Your suggestion would definitely accomplish this requirement.  I was 
> hoping the same channel could be reused without having to establish another 
> uni-directional link.  Netty or rather NIO is inherently bi-directional.  I 
> am suspecting RPC by definition is only uni-directional or rather a pull 
> technology?
>  
> One of my goals is to support as many different language bindings using Avro. 
>  PHP is one of those languages.  Unfortunately, the PHP library can only 
> function as a client.
>  
>                -Armin
> 
> On Fri, Jan 20, 2012 at 7:47 AM, James Baldassari <[email protected]> 
> wrote:
> Hi Armin,
> 
> Could you explain a little more about what you're trying to do?  It sounds 
> like you want a protocol in which either client or the server initiates a 
> remote procedure call.  The easiest way to do this is to have the client also 
> be a server and the server also be a client.  For example, consider the 
> following protocols:
> 
> protocol WeatherClient {
>   double getTemperature(string postalCode);
>   void registerForTemperatureUpdates(string postalCode, string clientHost, 
> int clientPort);
> }
> 
> protocol WeatherUpdateListener {
>   void onTemperatureUpdate(String postalCode, double newTemperature);
> }
> 
> The client side would use WeatherClient (and 
> SpecificRequestor/NettyTransceiver) to request the temperature for some 
> postal code from the server.  The client could also register with the server 
> for temperature updates by passing the postal code it's interested in as well 
> as the hostname/IP and port of a netty server running on the client.  The 
> client would run its own netty server using a WeatherUpdateListener and 
> SpecificResponder.  When the server has a temperature update to send back to 
> the client, it would send a message to the client using the 
> WeatherUpdateListener interface.  Is this close to what you're looking for?
> 
> -James
> 
> 
> 
> On Fri, Jan 20, 2012 at 6:34 AM, Armin Garcia <[email protected]> 
> wrote:
> I am trying to figure out how a message can be sent through a Netty Server to 
> a connected client.  I see the channel is stored in a group for each client 
> that connects to a Netty Server:
> 
> public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) 
> throws Exception
> {
>      e.getChannel().write(null);
>      allChannels.add(e.getChannel());
>      super.channelOpen(ctx, e);
> }
> 
> The challenge is how to leverage this channel in order to send an unsolicited 
> message to the client.  Is there an example that writes to the channel but 
> not as a response to a message received?  
> 
> I fully expect to take the existing Netty Server and modify it.  I suspect 
> the solution lies somewhere in creating a NettyDataPack then writing it to 
> the channel.  I'm definitely an Avro  greenhorn, so I'm a bit unsure of how 
> to wrangle my message into a NettyDataPack.
> 
>            -Armin 
> 
> 
> 
> 

Reply via email to