2014-11-25 3 views
-1

웹 응용 프로그램에서 서블릿에서 소켓 작업을 수행하고 소켓 데이터를 데이터베이스에 기록합니다.비동기 로깅을 구현하는 기본 패턴

성능 향상을 위해 비동기 로깅 프로세스를 만들고 싶습니다.

제 아이디어는 별도의 전용 스레드를 사용하여 로깅 작업을 수행하는 것입니다. 내 서블릿에서 데이터를 캐시에 제출하고 로깅 스레드가 하나씩 처리하도록합니다.

스레딩에 약간의 경험이 있습니다. 어떤 컬렉션을 캐시로 사용할 수 있습니까? 이것을 구현하는 기본 코드 패턴은 무엇입니까? 이를 달성하는 방법을 보여줄 수있는 몇 가지 코드를 제공해주십시오. 불쌍한 내 영어

내 응용 프로그램으로

죄송

은 서블릿을 사용하고 다른 자바 EE 기술을 JSP하지 생산 environment.It에서 실행되는 레거시 시스템입니다. JMS 지원을 추가하는 것은 나에게 너무 비싸다.

+0

많은 기존의 로깅 프레임 워크가 이것을 매우 잘 처리합니다. [log4j 2] (http://logging.apache.org/log4j/2.x/) ([slf4j] (http : // www. slf4j.org/))? 그들의 [비동기 로거] (http://logging.apache.org/log4j/2.x/manual/async.html)를보십시오 – kuporific

+0

@kuporific 저는 log4j 2를 알고 있지만 리더는 이것을 허용하지 않을 것입니다. – CaiNiaoCoder

답변

0

대기열과 스레드 풀이 양호해야합니다. 대기열에서 메시지를 게시하고 작업자 스레드가 대기열에서 메시지를 선택하여 데이터베이스에 저장하도록합니다. 요구 사항 /로드에 따라 대기열 및 스레드 풀 크기를 조정할 수 있습니다.

+0

그냥 java.uti.Queue? – CaiNiaoCoder

0

로그를 단일 파일로 출력하려는 ​​경우 로거 클래스의 세마포어 (가급적이면 뮤텍스)를 사용하여 동시 쓰기/경쟁 조건을 방지 할 수 있습니다. 세마포어는 프로그래머가 한 번에 특정 데이터 구조에 대해 특정 수의 액세스 만 수행 할 수 있도록하기 위해 설계된 동기화 기본 요소입니다. 전체 개념을 설명하지는 않겠지 만 Java는 java.util.concurrent.Semaphore 클래스에서 이러한 것들을 제공합니다. 뮤텍스 (mut ual ex clusion lock)은 주어진 시간에 하나의 스레드 만 "유지"할 수있는 세마포어입니다. 시도 해봐!

0

전용 스레드를 사용하여 로깅을 처리하려는 경우 Producer/Consumer 패턴을 구현하고 Queue를 사용하여 정보 객체의 저장을 처리해야합니다. 생산자/소비자 패턴은 주로 스레드 동기화 및 통신을 돕는 데 사용됩니다. http://www.tutorialspoint.com/javaexamples/thread_procon.htm

다른 옵션은 표준 로깅 작업을 생성 한 다음이 작업을 수행하는 스레드 풀 스레드를 만드는 것입니다. 이것의 이점은 쓰레드 풀이 쓰레드 스케줄링을 처리하고 실행될 때이지만, 스레드 스케줄러가 풀에서 다음에 실행할 쓰레드를 임의로 선택할 수 있기 때문에 FIFO 로깅을 보장 할 수 없다는 것입니다.

0

리더가 바퀴의 재발 명을 주장하지 않는 한, asyncAppender 뒤에있는 logback의 DBAppender에서 slf4j를 사용하십시오. 그것은 밖으로 준비가되어있어, 그것은 매력처럼 작동합니다.

당신은 실제로 logback's appenders에 대해 읽어야합니다.

전체 예제는 here입니다.

관련 문제