2013-03-07 2 views
3

클라이언트 채널이 netty의 쓰기 가능 상태가 아닙니다. 어떤 전문가가 이유를 찾아 내도록 안내 할 수 있습니까클라이언트 채널이 쓰기 가능 상태 (NIO)가 아닙니다. Netty

채널이 항상 쓰기 가능한 상태가 아닌 이유는 무엇입니까?

쓰기 가능한 상태가 아니기 때문에 스레드는 절전 모드입니다. 스레드 덤프를 사용하여 스레드 상태를 분석하고 다음 루프에서 카운터를 추가하고 잠시 기다린 다음 루프를 종료합니다. 하지만 정말로 쓰기가 불가능한 이유를 찾아 내고 싶습니다.

채널 종료 후 채널이 ctx에 남아 있습니까 (클라이언트가 EOF를 보내지 않은 경우)?

만약 이것이 가능하다면 (쓰기가 불가능한 상태를 의미)?

while (!ctx.getChannel().isWritable()) { 
    Thread.sleep(100); 
    } 

도와주세요.

당신은 선택기를 사용한다

답변

1

대단히 감사, 또는 채널이 쓸 때의 Netty는 주위를 제공 무엇이든, 당신에게. 틀림없이 자고 있으면 문자 그대로 시간을 낭비해서는 안됩니다. 채널 상태는 사용자가 작업하는 동안 변경할 수 없습니다. select().

+0

while (ctx.getChannel(). isWritable()) { // 무언가를 써 넣으십시오. } 이렇게하면 선택기가 m 모드를 쓸 채널을 전환 할 때까지 대기하게됩니다. 채널이 다른 상태에있어 기입 가능으로 돌아갈 수없는 경우, thread는 무한 루프에 들어갈 가능성이 있습니다. –

+0

@JohnChristy 정확히, 그렇게하지 마십시오. 채널 상태가 자고있는 동안 마술처럼 바뀌지는 않습니다. 이를 위해서는'select()'를 호출해야합니다. – EJP

1

표면적으로 ChannelBuffer가 꽉 찼기 때문에 더 이상 쓸 수있는 바이트가 아니기 때문입니다.

쓰기가 너무 빠름으로 인해 발생하거나 채널에서 바이트를 보낼 수 없습니다. 너무 빠른 것을 쓰지 않는다면 아마도 채널이 쓰여진 바이트를 성공적으로 전송하지 않았기 때문일 것입니다.

+0

우리는 다른 클라이언트의 연결 끊김을 알리기 위해 다른 클라이언트의 채널에 너무 빨리 쓰고 있습니다. 이미 닫힌 쓰기 가능한 채널을 확인하려고하지만 서버가 채널 닫힌 이벤트를 감지하지 못하면 어떻게 될까요? –

+0

@ JohnChristy Netty를 사용하고 있지는 않지만 채널이 폐쇄되어 있는지 테스트 할 수있는 방법이 있기를 바랍니다. – zzk

+0

네 말이 맞아. 그러나 채널 장애로 인해 채널 폐쇄 이벤트가 발생하지 않으면 폐쇄 상태인지 여부를 확인할 수 없습니다. 우리가 클라이언트와 서버 사이에 적절한 네트워크를 가지고 있다면 그 특정 채널이 폐쇄되어 있는지 확인할 수 있습니다. –