Not receiving all data after attempting to close the channel.
Pape, Stephen R CTR USAF AFMC AFRL/RISE
Stephen.Pape.ctr at RL.af.mil
Thu Nov 19 15:13:45 EST 2009
I'm not sure what you mean, as you can see I register a callback for when
the write is supposed to be completed. This should not be closing the
channel before it is done writing... (?)
After the write is *completed* (supposedly), I'm immediately closing the
channel. I don't know why there would be a problem doing this, but it's what
I was asking about.
-Stephen
-----Original Message-----
From: netty-users-bounces at lists.jboss.org
[mailto:netty-users-bounces at lists.jboss.org] On Behalf Of Michael McGrady
Sent: Thursday, November 19, 2009 3:01 PM
To: Netty Users
Subject: Re: Not receiving all data after attempting to close the channel.
Right. If you close the channel before it is done, guess what? It won't
get done. LOL Hope you take this in the light way it is intended. The
serious point is that you have to not close before you are done.
What the difference is between your version and what Trustin suggested I
don't know. I do think I am correct that you cannot close the channel
before it is complete without buggering up the send.
Mike
On Nov 19, 2009, at 11:24 AM, Stephen Pape wrote:
>
> Thanks for the reply. Isn't what you're doing essentially the same thing?
> You're getting notified via operationComplete() that the write was
> (supposedly) completed, then allowing execution to continue. That seems
like
> what I'm doing, except I immediately close the channel.
>
> I found a similar thread about this topic here:
> http://www.jboss.org/netty/community.html#nabble-td3398725|a3398725
>
>
> Trustin Lee wrote:
>>
>> You can achieve this pretty simply:
>>
>> channel.write(ChannelBuffers.EMPTY_BUFFER)
>> .addListener(ChannelFutureListener.CLOSE);
>>
>
> Given that response, I assumed my method should work. I was doing the same
> thing, adding a listener to close after the last write completed. I wasn't
> using an empty buffer because my channel pipeline couldn't accept a
> ChannelBuffer directly.
>
> Is there some reason that the channel can't be closed immediately after a
> write has completed?
>
> -Stephen
>
>
> Mike McGrady wrote:
>>
>> My solution was to use monitors with the asynchronous Netty
functionality.
>>
>> Here is the monitor:
>>
>>
>>
>> private class WriteKarmaManagerMonitor {
>> private final AtomicBoolean managerIsSent = new
AtomicBoolean(false);
>>
>> protected void managerIsSent() {
>> this.managerIsSent.set(true);
>> }
>>
>> protected AtomicBoolean isManagerSent() {
>> return this.managerIsSent;
>> }
>> }
>>
>> And here is its use:
>>
>>
>>
>> while (!this.channel.isWritable()) {
>> try {
>> Thread.sleep(3);
>> } catch (InterruptedException e) {
>> logger.log(InternalLogLevel.ERROR,
e.getMessage());
>> }
>> }
>>
>> ChannelFuture future = this.channel.write(buffer);
>>
>> future.addListener(new ChannelFutureListener() {
>>
>> public void operationComplete(ChannelFuture future)
{
>> // Notify that snnd is complete monitor.
>> synchronized
(NettyKarmaSender.this.writeManagerMonitor) {
>>
>>
NettyKarmaSender.this.writeManagerMonitor.managerIsSent();
>>
NettyKarmaSender.this.writeManagerMonitor.notifyAll();
>> NettyKarmaSender.this.managerSent++;
>> count++;
>> }
>> }
>>
>> });
>>
>> // Make sure manager is written before proceeding.
>> synchronized (this.writeManagerMonitor) {
>> if (!this.writeManagerMonitor.isManagerSent().get())
{
>> try {
>>
>> this.writeManagerMonitor.wait();
>> } catch (InterruptedException e) {
>> logger.log(InternalLogLevel.ERROR,
e.getMessage());
>> }
>> }
>> }
>>
>> From: "Pape, Stephen R CTR USAF AFMC AFRL/RISE"
>> <Stephen.Pape.ctr at RL.af.mil>
>> Date: November 19, 2009 7:24:17 AM PST
>> To: <netty-users at lists.jboss.org>
>> Subject: Not receiving all data after attempting to close the channel.
>> Reply-To: Netty Users <netty-users at lists.jboss.org>
>>
>> Hello,
>>
>> I'm having a problem with both 3.2.0.ALPHA1 and 3.1.5.GA (haven't tested
>> other versions).
>>
>> Basically, in order to make sure that all pending data is written, I have
>> something like this:
>>
>> private volatile ChannelFuture writeFuture = null;
>> private volatile Channel channel = null; // Set later
>>
>> public void write(Object obj)
>> {
>> writeFuture = channel.write(obj);
>> }
>>
>> public void close()
>> {
>> If(this.writeFuture != null)
>> this.writeFuture.addListener(this);
>> else
>> this.channel.close();
>> }
>>
>> public void operationComplete(ChannelFuture future)
>> {
>> // Thread.sleep(1000);
>> future.getChannel.close();
>> }
>>
>>
>> This class is being used to write Objects in a loop. Immediately after
the
>> loop the close method is called.
>>
>> I verified that the correct writeFuture is being used in the close()
>> method, but the remote side is not receiving all of the data. When I
write
>> 10 objects across, sometimes only 7 or 8 will make it through.
>>
>> If I uncomment Thread.sleep(), all of the data is consistently received
by
>> the remote side, so it would seem somehow I'm closing the channel too
>> early. Is there something I'm doing wrong?
>>
>> Thanks!
>>
>> -Stephen
>> _______________________________________________
>> netty-users mailing list
>> netty-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/netty-users
>>
>>
>> From: "Pape, Stephen R CTR USAF AFMC AFRL/RISE"
>> <Stephen.Pape.ctr at RL.af.mil>
>> Date: November 19, 2009 7:24:17 AM PST
>> To: <netty-users at lists.jboss.org>
>> Subject: Not receiving all data after attempting to close the channel.
>> Reply-To: Netty Users <netty-users at lists.jboss.org>
>>
>> Hello,
>>
>> I'm having a problem with both 3.2.0.ALPHA1 and 3.1.5.GA (haven't tested
>> other versions).
>>
>> Basically, in order to make sure that all pending data is written, I have
>> something like this:
>>
>> private volatile ChannelFuture writeFuture = null;
>> private volatile Channel channel = null; // Set later
>>
>> public void write(Object obj)
>> {
>> writeFuture = channel.write(obj);
>> }
>>
>> public void close()
>> {
>> If(this.writeFuture != null)
>> this.writeFuture.addListener(this);
>> else
>> this.channel.close();
>> }
>>
>> public void operationComplete(ChannelFuture future)
>> {
>> // Thread.sleep(1000);
>> future.getChannel.close();
>> }
>>
>>
>> This class is being used to write Objects in a loop. Immediately after
the
>> loop the close method is called.
>>
>> I verified that the correct writeFuture is being used in the close()
>> method, but the remote side is not receiving all of the data. When I
write
>> 10 objects across, sometimes only 7 or 8 will make it through.
>>
>> If I uncomment Thread.sleep(), all of the data is consistently received
by
>> the remote side, so it would seem somehow I'm closing the channel too
>> early. Is there something I'm doing wrong?
>>
>> Thanks!
>>
>> -Stephen
>> _______________________________________________
>> netty-users mailing list
>> netty-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/netty-users
>>
>>
>>
>>
>>
>> On Nov 19, 2009, at 7:24 AM, Pape, Stephen R CTR USAF AFMC AFRL/RISE
>> wrote:
>>
>>> Hello,
>>>
>>> I'm having a problem with both 3.2.0.ALPHA1 and 3.1.5.GA (haven't tested
>>> other versions).
>>>
>>> Basically, in order to make sure that all pending data is written, I
have
>>> something like this:
>>>
>>> private volatile ChannelFuture writeFuture = null;
>>> private volatile Channel channel = null; // Set later
>>>
>>> public void write(Object obj)
>>> {
>>> writeFuture = channel.write(obj);
>>> }
>>>
>>> public void close()
>>> {
>>> If(this.writeFuture != null)
>>> this.writeFuture.addListener(this);
>>> else
>>> this.channel.close();
>>> }
>>>
>>> public void operationComplete(ChannelFuture future)
>>> {
>>> // Thread.sleep(1000);
>>> future.getChannel.close();
>>> }
>>>
>>>
>>> This class is being used to write Objects in a loop. Immediately after
>>> the loop the close method is called.
>>>
>>> I verified that the correct writeFuture is being used in the close()
>>> method, but the remote side is not receiving all of the data. When I
>>> write 10 objects across, sometimes only 7 or 8 will make it through.
>>>
>>> If I uncomment Thread.sleep(), all of the data is consistently received
>>> by the remote side, so it would seem somehow I'm closing the channel too
>>> early. Is there something I'm doing wrong?
>>>
>>> Thanks!
>>>
>>> -Stephen
>>> _______________________________________________
>>> netty-users mailing list
>>> netty-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/netty-users
>>
>>
>> _______________________________________________
>> netty-users mailing list
>> netty-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/netty-users
>>
>>
>
> --
> View this message in context:
http://n2.nabble.com/Not-receiving-all-data-after-attempting-to-close-the-ch
annel-tp4033482p4033860.html
> Sent from the Netty User Group mailing list archive at Nabble.com.
>
> _______________________________________________
> netty-users mailing list
> netty-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/netty-users
Mike McGrady
Principal Investigator AF081-028 AFRL SBIR
Senior Engineer
Topia Technology, Inc
1.253.720.3365
mmcgrady at topiatechnology.com
_______________________________________________
netty-users mailing list
netty-users at lists.jboss.org
https://lists.jboss.org/mailman/listinfo/netty-users
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 5186 bytes
Desc: not available
Url : http://lists.jboss.org/pipermail/netty-users/attachments/20091119/24a2e33a/attachment-0001.bin
More information about the netty-users
mailing list