문제

현재 레거시 응용 프로그램에서 업데이트되는 데이터베이스가 있습니다. 레코드가 업데이트되면 큐에 메시지가 배치되도록 SQL 서비스 브로커 큐를 사용하고 싶습니다 (트리거 또는 무언가 사용).

그런 다음 메시지를 잡고 다른 응용 프로그램을 처리하기 위해 대기열을 지속적으로 "듣는"오랫동안 실행되는 응용 프로그램 (.NET로 작성된 Windows 서비스)을 원합니다.

웹에서 샘플 코드를 찾았고 코드가 견고한 지 여부에 대한 입력을 얻고 싶었습니다. 따라서 Windows Service 클래스의 약식 버전이 있습니다.

public class MyService
{
    public void StartService()
    {
        Thread listener = new Thread(Listen);
        listener.IsBackground = true;
        listener.Start();
    }

    private void Listen()
    {
        while (true)
        {
            using (SqlConnection connection = new SqlConnection(_connectionString))
            {
                string commandText = "WAITFOR ( RECEIVE * FROM MyQueue);";
                using (SqlCommand command = new SqlCommand(commandText, connection))
                {
                    connection.Open();
                    command.CommandTimeout = 0;
                    SqlDataReader reader = command.ExecuteReader();
                    while (reader.Read())
                    {
                        // Process message
                    }
                }
            }
        }
    }
}

어떻게 생각해? 코드는 내가 원하는 방식으로 정확하게 작동합니다. 그러나 SQL 명령이 포함 된 새 스레드를 회전시키는 아이디어는 무한 루프 내부에서 시간을 절대 아웃하지 않을 것입니다.

도움이 되었습니까?

해결책

무한 루프에있는 경우 서비스가 깨끗하게 종료되지 않습니다. 서비스가 종료 메시지를받을 때 출구 조건을 확인해야합니다. 대기 시간에 타임 아웃을 추가하여 종료 해야하는지 확인할 수 있습니다. 처리 된 각 행 에서이 점을 확인해야합니다.

지연에 2 초의 수면을 사용했지만 대기 중 2 초 타임 아웃을하면 같은 일을 할 수 있습니다.

서비스는 30 초 동안 종료되거나 Windows가 고착되는 것을 고려할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top