Notifications - Push, Pull, Stream Notification #6


 Exchange 2013을 기반으로 개발을 진행하면서 맞닥뜨리게 된 케이스에 대해서 공유 하고자 한다. 이전에 잠깐 EWS(Exchange Web Service)를 통해 간단한 기능을 사용해본 경험이 전부라서 하나의 기능을 구현하기 위해 여러가지 방안에 대해서 바위에 계란치기로 직접 부딪혀 볼 수 밖에 없었다. 이런 힘들고 시간 싸움을 줄이는데 도움을 드리는데 일조 하고자 이곳에 공유 하고자 합니다. 비록 덜 정제 되고 문서 미비할 수 있지만 참고 사항으로 알아 두셨으면 합니다. 



 이제 마지막으로 남은 Pull Notification에 대해서 알아 보도록 하자. 원래 바로 이전 포스트에서 Pull까지 마치려고 하였으나 Listener의 소스가 너무 길어서 한번에 언급하기에는 다소 무리라고 판단이 되었다. 그래서 6회까지 이어지게 되었지만 너그러이 이해해 주시면 좋겠습니다. 


 본격적인 진행에 앞서서 Exchange  2013에서는 Pull Notification 관련 이벤트가 전형 발생하지 않고 있다. Powershell에서 Exchange 설정을 수정해야만 동작하는지는 확인하지 못하였지만 기본 상태에서는 동작하지 않는다. 그렇지만 Exchange 2010을 위해서 코드만이라도 살펴 보도록 하겠다. 


 Pull Notification 방식은 다른 어떤 방법보다 간단한 구조라서 사용 법이 간단하다.

PullNotificationListener pull = null;
 
for (int i = 0i < 1000i++)
{
    foreach (var member in Members.GetUsers())
    {
        try
        {
            string watermask = null;
            watermask = "AQAAAOlS/PGuZXZNiGy4pQo8RMLUKhkAAAAAAAA=";
            //watermask를 포함한 이후의 이벤트를 가져온다.
            pull = new PullNotificationListener(memberwatermask);
            Console.WriteLine(member);
            pull.Pulling();
            Thread.Sleep(10000);
        }
        catch (Exception ex) { Console.WriteLine(member + " Error " + ex.Message); }
    }
}

[코드1] Pull Notification 객체로 요청한다.


 위 코드는 PullNotificationListener을 실행 하도록 요청하는 클래스이며 "코드2"에서 실질적으로 Pulling을 진행 한다. 

/// <summary>
/// Pull Notification 이벤트 처리 클래스
/// </summary>
public class PullNotificationListener
{
    /// <summary>
    /// 사용자 email 주소
    /// </summary>
    private string address = null;
    /// <summary>
    /// Watermask 값
    /// </summary>
    private string watermark = null;
 
    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="address"></param>
    /// <param name="watermark"></param>
    public PullNotificationListener(string addressstring watermark)
    {
        this.address = address;
        this.watermark = watermark;
    }
 
    /// <summary>
    /// Pull notification을 실행한다.
    /// </summary>
    public void Pulling()
    {
        var service = EWSHelper.GetService(address);
 
        //timeOut를 10분으로 세팅 하였다.
        var pullSubscription = service.SubscribeToPullNotifications(EWSHelper.GetNotificationFolderId(), 10watermarkEWSHelper.GetNotificationEventTypes());
 
        //비 동기 실행
        //IAsyncResult result = pullSubscription.BeginGetEvents(new AsyncCallback(Subscription), pullSubscription);
        //비 동기 실행이 완료 할 때까지 대기 하도록 한다.
        //WaitHandle.WaitAll(new[] { result.AsyncWaitHandle });
 
 
        //동기 실행
        var events = pullSubscription.GetEvents();
 
        Console.WriteLine("start");
        foreach (var itemEvent in events.ItemEvents)
        {
            Console.WriteLine("{0}, {1}, {2}, watermark {3}"addressitemEvent.ItemIdDateTime.Now.ToString());
        }
        Console.WriteLine("end");
    }
 
    public void Subscription(IAsyncResult result)
    {
        Console.WriteLine("Subscription Start");
 
        //PullSubscription 변환
        var pullSubscription = result.AsyncState as PullSubscription;
 
        var events = pullSubscription.EndGetEvents(result);
            
        foreach (var itemEvent in events.ItemEvents)
        {
            Console.WriteLine("{0}, {1}, {2}, watermark {3}"addressitemEvent.ItemIdDateTime.Now.ToString());
        }
 
        //구독을 중단한다.
        //pullSubscription.Unsubscribe();
 
        Console.WriteLine("Subscription End");
    }
}

[코드2] Pulling 클래스


 코드에 대한 부가 설명을 하자면 "코드2"에서 동기 방식과 비 동기 방식으로 수행하는 코드가 작성되어 있지만 비 동기 방식은 주석처리가 되어 있고 동기 방식으로 수행 되도록 작성되었다. Exchange 2013에서 두가지 방식으로 테스트를 진행 하였으나 둘다 동작하지는 않았다. 어느 곳의 공개된 소스를 찾아 봐도 위와 같은 흐름으로 되어 있으며 더 이상 진행하지를 못하였다. ( 비 동기 실행의 코드 주석을 풀면 비 동기로 실행이 되고 있다 )


결론적으로 Exchange 2013에서는 Pull, Stream notification 방식으로 이벤트 정보를 받아서 치리해야 한다.

+ Recent posts