2011-10-13 5 views
4

MSMQ 사용 경험이별로 없으며 다른 누군가가 솔루션 구현을 돕기 위해 MassTransit을 보도록 권장했지만 MassTransit + MSMQ를 사용하는 것이 올바른지 알아 내려고 노력하고 있습니다. 직업을위한 도구.MassTransit - 클라이언트에 메시지 업데이트

우리는 여러 사용자가 사용하는 WPF 응용 프로그램 (3.5)이 있습니다. 지속성은 응용 프로그램 (NHibernate를 통해)에서 데이터베이스로 수행됩니다. 지금까지 사용자는 주기적으로 최신보기를 업데이트하기 위해보기를 새로 고칩니다. 그러나 우리는 pub/sub 메시징을 사용하여 엔티티가 지속될 때 각 애플리케이션 인스턴스에 알림을 보내려고합니다. 클라이언트 응용 프로그램은 모두 동일한 도메인에서 실행되므로 필요한 대부분의 종속성 (예 : 클라이언트 컴퓨터에 MSMQ 설치)을 수행 할 수 있어야합니다.

정리하면 : Client1은 업데이트 메시지를 게시합니다. ---> ????? ----> 다른 모든 활성 클라이언트가 수신합니다.

MSMQ를 처음 접했을 때 건축물이 어떻게 보이는지 잘 모르겠습니다.

  • 메시지를 수신하기 위해 각 클라이언트 컴퓨터에 로컬 MSMQ 큐가 있어야합니까?
  • 서버에 대기열을 만들고 모든 클라이언트가 거기에서 메시지를 수신해야합니까? 그렇다면 메시지를 올바르게 배포하기 위해 대기열이 충분합니까 아니면 서비스를 만들어야합니까?
  • 이 도구는 작업에 적합한 도구일까요?

나는 그것이 효과가 있기를 희망하는 약간의 POC를 만들었지 만, 나는 "경쟁 소비자"라고 생각하는 것으로 끝을 맺었다. 하나의 응용 프로그램 인스턴스가 메시지를 보내고 모든 응용 프로그램 인스턴스가 메시지 인스턴스를 수신하고 싶습니다.

모든 제안, 지침 또는 조언을 주시면 감사하겠습니다. 추가 네트워크 키 (새끼 고양이) :

업데이트 : - (각 응용 프로그램 인스턴스가 메시지를 보낼 것이다 서버로 대체 될 것입니다 내 마음 로컬 호스트의 주) 다음

는 POC보기 모델 코드입니다

업데이트 : 나는 샘플 코드https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0ByDMJXKmYB7zMjBmYzYwNDEtYzMwOC00Y2RhLTk1MDYtZjc0NTI2M2E3Y2Qy&hl=en_US

public class MainViewModel : IDisposable, INotifyPropertyChanged 
{ 
    private Guid id; 

    public MainViewModel() 
    { 
     id = Guid.NewGuid(); 
     Publish = new RelayCommand(x => OnExecutePublishCommand(), x => !string.IsNullOrEmpty(Message)); 
     Messages = new ObservableCollection<MessagePayload>(); 

     Bus.Initialize(sbc => 
     { 
      sbc.UseMsmq(); 
      sbc.SetNetwork("Kittens"); 
      sbc.VerifyMsmqConfiguration(); 
      sbc.UseMulticastSubscriptionClient(); 
      sbc.ReceiveFrom(string.Format("msmq://localhost/{0}", ConfigurationManager.AppSettings["queue"])); 
      sbc.Subscribe(subs => subs.Handler<MessagePayload>(OnReceiveMessage)); 
     }); 
    } 

    public ICommand Publish { get; private set; } 

    private string message; 
    public string Message 
    { 
     get { return message; } 
     set 
     { 
      message = value; 
      SendPropertyChanged("Message"); 
     } 
    } 

    public ObservableCollection<MessagePayload> Messages { get; private set; } 

    private void OnReceiveMessage(MessagePayload msg) 
    { 
     Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, 
      new Action(() => Messages.Add(msg))); 
    } 

    private void OnExecutePublishCommand() 
    { 
     Bus.Instance.Publish(new MessagePayload{ Sender= id, Message = Message}); 
     Message = null; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void SendPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public void Dispose() 
    { 
     Bus.Instance.Dispose(); 
    } 
} 

을 업로드 한 업데이트 : 흥미가있는 사람을 위해 우리는 "이벤트 버스"를 2대로 분할했습니다. 서버의 경우 MassTransit을 사용하고 있습니다. 그러나 Mass Transit에는 "전체 프로필"(.NET 4.0)이 필요하므로 WPF 인스턴스의 "클라이언트 프로필"을 고수하고 싶었습니다. 우리는 클라이언트 측 이벤트 버스로 SignalR을 사용하고 있습니다. 서버 이벤트 버스의 "옵저버"는 메시지를 클라이언트 이벤트 버스로 전달합니다.

답변

5

같은 네트워크에있는 모든 컴퓨터는 주어진 메시지를 구독 할 수 있습니다. 그들은 모두 읽을 수있는 로컬 대기열이 필요합니다. 다른 방법이 없다면 원격 대기열을 읽지 마십시오.

일반적으로 설명한 내용이 옳습니다. 모든 가입자에게 게시되는 메시지가 수신되며 상태를 업데이트합니다. 잠시 동안 WPF로 작업하지는 않았지만 일반적으로 어떻게 처리하는지는 받아 들일 만합니다.MT 구성을 시작하는 데 약간의 시간이 걸릴 수 있으므로 백그라운드 스레드에서 UI 구성을 차단하지 않도록 할 수 있습니다.

또한 멀티 캐스트 구독을 사용하여 네트워크 키를 설정해야합니다. 컴퓨터 이름이 없으면 자동으로 설정됩니다. 서로 성공적으로 대화 할 수 있는지 확인해야합니다.

+0

MSMQ 멀티 캐스팅은 확실히 여기 간단한 솔루션입니다. –

+0

버스 초기화에서 위에서 준 코드에 네트워크 키를 추가했습니다. 나는이 코드가 동일한 큐에 대해 두 개의 인스턴스 (같은 머신)를 실행하고 있는지 테스트했다. 아마도 그 인스턴스 중 하나만이 메시지를 얻는 이유 일 것이다. 나는 아직도 이것을 작동시킬 수 없다. 두 개의 다른 시스템에서 인스턴스를 실행하고 동일한 머신에서 두 개의 인스턴스를 실행하려고 시도했습니다 (다른 대기열 사용). 내가 이해하지 못하는 것은 그것이 모두 어떻게 붙인 지입니다. 가입을 결정하는 네트워크 키입니까, 아니면 각 클라이언트가 동일한 이름의 대기열을 갖고 있는지 확인해야합니까? –

+0

멀티 캐스트가 켜지면 MSMQ는 다른 사람에게 특정 메시지를 수신하고 있음을 알립니다. 해당 메시지가 게시되면 모든 청취자에게 전달됩니다. MT는 멀티 캐스트 작업이 정상적으로 작동하는 한 누가 무엇을 얻는 지 관리해야합니다. MSMQ를 제거하고 멀티 캐스트 옵션을 다시 설치하여 다시 작동하게하려면 몇 번만 사용해야합니다. 이유는 확실하지 않습니다. 네트워크 키는 네트워크 키를 공유 할 때 함께 컴퓨터간에 대화 할 수있게 해 주며, 로컬은 잘 작동합니다. 대기열에서 저널링을 켜서 메시지가 표시되는지 또는 log4net 로그를 확인하십시오. – Travis

관련 문제