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 > > > >
