배경
내가 최근 메시지의 컬렉션은 웹 소켓 연결을 통해 수신 들어있는 아파치 코 몬즈 라이브러리에서 CircularFifoBuffer
클래스를 사용하려고 시도하고있다. 그러나 리눅스 배포에서 CircularFifoBuffer
의 크기 제한에 도달하면 BufferOverflowException
이 발생합니다.아파치 코 몬즈 - CircularFifoBuffer BufferOverflowException을
나는 아직도 자바 상당히 새로운 오전 그러나 여기에서 나는 CircularFifoBuffer
인스턴스 변수를 정의하고 있습니다 방법은 다음과 같습니다
private static Buffer<String> recentWebSocketMessages = new CircularFifoBuffer<String>(1000);
을 그리고 여기에 예외입니다 :
org.apache.commons.collections15.BufferOverflowException: The buffer cannot hold more than 1000 objects.
at org.apache.commons.collections15.buffer.BoundedFifoBuffer.add(BoundedFifoBuffer.java:218)
at org.apache.commons.collections15.buffer.CircularFifoBuffer.add(CircularFifoBuffer.java:94)
at com.example.SystemMonitor.putRecentWebSocketMessage(SystemMonitor.java:228)
무엇을 나에게 이상한 것은이 문제가된다 간헐적으로, 무한 루프를 작성할 때 :
while(true)
{
recentWebSocketMessages.add("TESTING");
}
예외
그래서 질문
내가 여기 주요 문제는 왜 단속이 문제입니다 추측 - (나는 아직 리눅스를 테스트 할 수 없었다 적어도 Windows에서) 내가 해결 할 수있는에가 발생하지 않습니다 정적 변수를 이와 같이 정의함으로써? (이 단단히 커플 BoundedFifoBuffer
의 CircularFifoBuffer
구현 recentWebSocketMessages
에도 불구하고)
private static CircularFifoBuffer<String> recentWebSocketMessages = new CircularFifoBuffer<String>(1000);
편집
이 감사는이 구현은 동기화되지 단순한 사실을 지적하기위한 sorifiend 톰.
while(true)
{
new Thread(new Runnable()
{
@Override
public void run()
{
try
{
recentWebSocketMessages.add("TESTING");
}
catch(BufferOverflowException e)
{
e.printStackTrace();
}
}
}).start();
}
: 관심이있는 경우,이 간단한 나사 아래 예는 멀티 스레딩 /을 BufferOverflowException
는 (버퍼 내 원래 정의에) 발생 발생할 수있는 동시에, 버퍼 액세스 문제 복수 스레드임을 증명
Buffer recentWebSocketMessages = BufferUtils.synchronizedBuffer(new CircularFifoBuffer(1000));
[* "이 구현은 동기화되지 않습니다."* (https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/org/apache/commons/collections/buffer) /CircularFifoBuffer.html) ... 여기에 문제가있을 수 있습니다. – Tom