2011-07-02 3 views
0

나는 달성하고자하는 것을 간략히 설명하려고 노력할 것입니다. 이 일을하는 나의 초기 생각은 내 의견으로는 잘 작동하지 않을 것입니다. 그래서 이것을 계획하는 최선의 방법을 결정하려고합니다.C#에서 Windows 서비스를 사용하여 메시지를 보내도록 예약하는 가장 좋은 방법

첫 번째 생각은했다 :

내가 예약 된 시간에 발송해야 할 메시지의 목록을 가지고, 각각의 하나는 중앙 SQL 데이터베이스에 저장됩니다.

30 분마다 틱하는 타이머가있는 Windows 서비스를 사용합니다. 그래서 ..

30 Mins pass > Call ScheduleMessages() 
다음 30 분 외출해야하는 보내지 않은 메시지에 대한 데이터베이스를 확인합니다

ScheduleMessages, 그것은 다음과 같은 데이터베이스에 표시됩니다 : 각각에 대해

ScheduleActivated = 1 

ScheduleActivated = 1로 표시하면 일반 타이머에서 상속 한 고객 시간 객체가 실행되며이 타이머 객체는 전송해야하는 메시지의 속성도 포함합니다.

메시지가 사라질 때 틱으로 설정되어 메시지를 보내고 데이터베이스에서 성공한 것으로 표시합니다.

이 문제의 주된 문제점은 타이머를 온통 갖게 될 것이고, 한 번에 수백 개의 메시지가 예정되어 있다면, 아마도 잘 수행되지 않거나 완전히 넘어지게 될 것입니다.

다시 evalutating 후 나는 2

내 다른 생각은 한 번에 10 분마다 틱 서비스에서 실행 한 타이머를 가지고 있었다 솔루션 생각했다. 매번 틱 할 때마다 그 시간까지 목록에 어떤 시점에서 보내질 모든 단일 메시지를 모으고 한 번에 하나씩 처리하는 방법을 시작합니다.

이것은 자원 집약도가 덜한 것처럼 보이지만 10 분 후에 타이머가 틱하면 전송을 완료하지 않은 모든 메시지가 다음 틱에서 걸려 다시 전송 될지 걱정됩니다.

타이머가 10 분간 정지되면 타이머를 중지 한 다음 0으로 재설정하고 메시지가 전송되면 다시 시작하는 것이 좋습니까?

위의 세 가지 방법 중 더 나은 문제가 있습니까?

답변

1

우리는 하나 개의 프로젝트에이 구현 무엇을 우리를 위해 일을하는 것은이었다 : 를 보낼 수있는 무언가가 있다면 모든 X의 분을 확인하는 전송 시간

  • 서비스와 함께 테이블에 기록

    • 모든 메시지
    • 서비스가 메시지를 보낼 때 그것은 또한 보낸 메시지가 재송신을 방지 표시

    (업데이트가 실제 전송 시간에 널 (null)에서 시간을 보내는) 메시지를 표시하고 당신을 다시 할 경우 단지이야 날짜를 null로 설정하십시오.

    유일한 문제는 서비스가 단일 스레드로 실행되어 전송 된 메시지 수가 제한된다는 것입니다. 그러나 이것이 문제가되기 전에 당신은 매우 많은 메시지와 매우 작은 창을 가질 것입니다.

  • 0

    제 생각에 스케줄링 서비스는 일정을 확인하는 데만 책임을지고 모든 작업은 별도의 서비스로 전달되어야합니다. 스케줄링 서비스는 예정된 작업에 대해주의를 기울여야합니다. execute 메소드가 포함 된 작업 항목 인터페이스를 구현해보십시오. 그런 식으로 실행 개체는 내부 자체를 처리 할 수 ​​있으며 스케줄링 서비스를 알 필요가 없습니다. Quartz.net을 예약 해 보셨습니까?

    +0

    메시지 자체는 단순한 구성입니다. 우리는 회사 내에 여러 유형의 "연락처"를 가지고 있습니다. 각 유형의 연락처는 이메일 또는 내부 IM 일 수 있습니다. 인터페이스에서 상속받은 각 Contact 유형에는 자체 SendMessage() 메소드가 있어야합니다. 따라서 메시지는 각 IContact로 전송됩니다. 실제 연락처 개체는 실제 일정 서비스가 아닌 메시지를 보냅니다. 스케줄링 서비스는 메시지가 성공적이면 응답을 수신 한 다음 그에 따라 데이터베이스를 업데이트합니다. –

    1

    고정 간격을 지정합니다. Windows에는 절전 기능, 기다릴 수있는 타이머 등 많은 특정 시간 동안 잠자기 할 수있는 방법이 많이 있습니다.

    이들 중 일부는 .NET에서 사용할 수 있습니다. 예를 들어 WaitHandle.WaitAll은 잠자기 시간과 이벤트를 수락합니다. 스레드는 다음 예약 항목까지 기다릴 수 있지만 스케줄 수정 요청에 의해 깨우쳐 질 수 있습니다.