gpt4 book ai didi

c# - MassTransit - 向客户端更新消息

转载 作者:太空狗 更新时间:2023-10-30 01:09:05 25 4
gpt4 key购买 nike

我没有太多使用 MSMQ 的经验,有人建议我查看 MassTransit 以帮助实现解决方案,但我很难确定使用 MassTransit + MSMQ 是否是完成这项工作的正确工具。

我们有一个供多个用户使用的 WPF 应用程序 (3.5)。持久化是从应用程序(通过 NHibernate)到数据库完成的。到目前为止,用户会定期刷新那里的 View ,以确保他们拥有最新的更新。但是,我们现在希望在使用发布/订阅消息传递持久化实体时向每个应用程序实例发送通知。客户端应用程序都在同一域中运行,并且应该能够满足所需的大多数依赖项(例如,在客户端计算机上安装 MSMQ)。

总结一下:Client1 发布更新消息 ---> ?????? ----> 所有其他活跃的客户端都会收到它。

由于我是 MSMQ 的新手,我什至不确定架构应该是什么样子。

  • 是否每台客户端机器都需要有一个本地 MSMQ 队列来接收消息?
  • 我们是否只需要在服务器上创建一个队列,所有客户端都在那里监听消息?如果是这样,只需要一个队列就足够了吗?还是我们需要创建一个服务才能正确分发消息?
  • 这甚至是完成这项工作的正确工具吗?

我创建了一个小 POC,希望它能起作用,但我最终得到了我认为称为“竞争消费者”的东西。我希望发生的是一个应用程序实例发送一条消息,所有应用程序实例都收到它。

如有任何建议、指导或建议,我们将不胜感激!

这是 POC View 模型代码(注意——在我看来,localhost 将替换为每个应用程序实例将向其发送消息的服务器):

更新:添加了网络 key (小猫)

更新:我已经上传了示例代码 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();
}
}

更新:以防万一有人感兴趣,我们最终将“事件总线”一分为二。对于服务器,我们使用 MassTransit。但是,由于 Mass Transit 需要“完整配置文件”(.NET 4.0),并且我们希望为我们的 WPF 实例坚持使用“客户端配置文件”,因此我们将 SignalR 用于客户端事件总线。服务器事件总线上的“观察者”将消息转发到客户端事件总线。

最佳答案

同一网络上的所有机器都可以订阅给定的消息。他们都需要一个本地队列来读取。除非绝对没有其他办法,否则不要读取远程队列。

您所描述的大体上似乎是正确的。有一条消息发布给所有订阅者,他们将收到它并更新他们的状态。我已经有一段时间没有使用 WPF 了,但总的来说你处理它的方式似乎是可以接受的。请注意,启动 MT 配置可能需要一些时间,因此您可能希望在后台线程上执行此操作,以免阻塞 UI。

此外,使用多播订阅,您需要设置一个网络 key 。如果未提供,它会自动设置为机器名称。您需要确保他们能够成功地相互交谈。

关于c# - MassTransit - 向客户端更新消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7758009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com