종료 시점을 포함하여 많은 시간 동안 외부 프레임 워크에서 들어오는 비동기 호출이 넘쳐나는 것을 처리해야하는 Java 응용 프로그램을 개발 중입니다. 정상적으로 작동하는 동안 이러한 수신 호출은 다시 비동기 적으로 다른 프레임 워크로 전달되어야합니다.비동기 호출에 대한 정상 종료 확인 잠금을 구현하거나 예외를 처리하려면?
지금은 모듈이 "양호한"시민으로 설정되어 있고 종료 플래그를 중심으로 잠그는 기능이 있습니다.이 플래그는 일단 설정되면 정상적인 발신 통화의 발송을 중단합니다.
들어오는 호출과 나가는 호출 모두 비동기식이기 때문에 동일한 종료 플래그 검사 (아래 참조)를 수행하는 각 "작업자"작업을 수행해야합니다. EDIT : 세마포어를 사용하는 것은 하나의 획득/릴리스가 각 작업자에게 필요하다는 것을 다른 질문으로 저에게 지적되었습니다.) 작동하지만 이러한 작업자 작업이 많아 성능이 누적 될 수 있다는 점에 대해 걱정합니다. 프레임 워크가 약간 확장되면 프로파일 링이 곧 제공되지만 결과에 관계없이 모범 사례를 따르는 것이 좋습니다.
대체 방법으로는 단순히 종료 플래그 확인 잠금을 수행하지 않고 비동기 호출이 처리를 완료하기 전에 외부 프레임 워크가 종료 될 때 생성되는 예상 예외를 처리하는 것입니다. 이 접근법이 취해진다면 해로운 운영상의 효과는 없다고 덧붙여 야합니다. 두 가지 방법 모두 정상적인 종료가됩니다.
귀하의 아이디어가 더 나은 방법입니까? 예외가없는 무거운 손으로 고정하는 것, 잠금을 해제하는 것, 예외를 포격하는 것. 자물쇠와
은 작업자의 작업 코드는 다음과 같은 :
final private ReentrantReadWriteLock shutdownLock = new ReentrantReadWriteLock();
private boolean isShutdown;
private void workerTask()
{
try
{
shutdownLock.readLock().lock();
if (isShutdown)
return;
executeAsynchronously(new Runnable()
{
@Override
final public void run()
{
try
{
shutdownLock.readLock().lock();
if (isShutdown)
return;
// Do something here.
}
finally
{
shutdownLock.readLock().unlock();
}
}
});
}
finally
{
shutdownLock.readLock().unlock();
}
}
셧다운 방법은 shutdownLock.writeLock(), 다음 isShutdown 플래그를 설정을 요청합니다.
volatile private boolean isShutdown;
private void workerTask()
{
try
{
executeAsynchronously(new Runnable()
{
@Override
final public void run()
{
try
{
// Do something here.
}
catch (final FrameworkRuntimeException exception)
{
if ((! isShutdown) || (exception.type !=
FrameworkRuntimeException.FrameworkIsDisposed))
throw exception;
}
}
});
}
catch (final FrameworkRuntimeException exception)
{
if ((! isShutdown) || (exception.type !=
FrameworkRuntimeException.FrameworkIsDisposed))
throw exception;
}
}
이 구현의 종료 방법이 참으로 휘발성 isShutdown 플래그를 설정합니다
잠금 및 종료 생성 된 예외를 기대하지 않고 다른 방법은 다음과 같이 보입니다. 어떤 의견에 미리
감사합니다,
러스
편집 : 그것은 유용하게 내가 첫 번째 방법에 이중 잠금을 방지하기 위해 세마포어를 사용할 수있는 또 다른 질문에 나에게 지적되어있어, 결국 무거운 짐이되지는 않을 것이지만 문제는 여전히 남아 있습니다.
이 필드에는 많은 경험이 없지만 첫 번째 해결 방법 (잠금 장치)은 약간 과장된 것으로 보입니다. 또한 "무언가"가 무엇인지는 말하지 않지만 안전을 위해 하나 또는 두 개의 if (isShutDown) return 만 넣을 수 있습니다. – toto2
맞습니다. 과도한 것입니다. 이중 잠금 대신에 세마포어 허용을 사용할 수 있습니다. 이 방법을 사용하면 바깥 쪽 바디의 종료 플래그에 대해 한 번만 확인하면됩니다. 댓글 주셔서 감사합니다. – Russ
내가 잘 약간의 오버 헤드 및 종료 플래그와 함께이 문제를 해결하는 방법에 대해 생각하고 (흥미로운 부분은 하나가 다른 스레드가 추가로 메시지를 보낼 수 없음을 확신 할 수있는 종료는 즉시 시작할 수 있다는 것입니다)하지만, 정말 예외 경우 접근 방식이 실제로 잘 작동합니다. 간단하고 코드가 적으며 오버 헤드가 없습니다. – Voo