C# 无法使用masstransit将消息发布到rabbitmq
我正在尝试使用MassTransit和RabbitMq实现简单的发布/订阅。 我正在使用dot net 4.8版来实现它。 我已经创建了2个控制台应用程序项目(每个用于发布和订阅) 我无法通过MassTransit将消息发布到队列,但如果我直接使用RabbitMq.CLient nuget,我可以发送和接收消息 请在下面找到我的发布者和订阅者类别: Publisher.cs:C# 无法使用masstransit将消息发布到rabbitmq,c#,rabbitmq,masstransit,C#,Rabbitmq,Masstransit,我正在尝试使用MassTransit和RabbitMq实现简单的发布/订阅。 我正在使用dot net 4.8版来实现它。 我已经创建了2个控制台应用程序项目(每个用于发布和订阅) 我无法通过MassTransit将消息发布到队列,但如果我直接使用RabbitMq.CLient nuget,我可以发送和接收消息 请在下面找到我的发布者和订阅者类别: Publisher.cs: using System; using Contracts; using MassTransit; using Mass
using System;
using Contracts;
using MassTransit;
using MassTransit.Log4NetIntegration.Logging;
namespace Publisher
{
internal class Send
{
public static void Main(string[] args)
{
SendMessage();
}
private static async void SendMessage()
{
//Log4NetLogger.Use();
for (var i = 0; i < 10000; i++)
{
IBusControl busControl = null;
try
{
busControl = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
});
busControl.Start();
var message = new ValueEntered
{
Value = $"Message {i}"
};
// The below call is not pushing messages. No Exception to is found.
await busControl.Publish(message);
Console.WriteLine($"Published [x] : {message} [at] {DateTime.Now:u}");
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
busControl?.Stop();
}
}
}
}
}
消费者:
using System;
using System.Threading.Tasks;
using Contracts;
using MassTransit;
using Newtonsoft.Json;
namespace Subscriber
{
public class ValueConsumer : IConsumer<ValueEntered>
{
public Task Consume(ConsumeContext<ValueEntered> context)
{
return Task.Run(() =>
{
Console.WriteLine($"Received [x] {JsonConvert.SerializeObject(context)} [at] {DateTime.Now:u}");
});
}
}
}
使用系统;
使用System.Threading.Tasks;
使用合同;
使用大众运输;
使用Newtonsoft.Json;
命名空间订阅者
{
公共类价值消费者:i消费者
{
公共任务消费(消费上下文)
{
返回任务。运行(()=>
{
WriteLine($“在{DateTime.Now:u}接收到[x]{JsonConvert.SerializeObject(context)}];
});
}
}
}
已安装的软件包:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Automatonymous" version="5.1.1" targetFramework="net48" />
<package id="GreenPipes" version="4.0.0" targetFramework="net48" />
<package id="log4net" version="2.0.8" targetFramework="net48" />
<package id="MassTransit" version="7.1.8" targetFramework="net48" />
<package id="MassTransit.Log4Net" version="5.5.6" targetFramework="net48" />
<package id="MassTransit.RabbitMQ" version="7.1.8" targetFramework="net48" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="1.1.1" targetFramework="net48" />
<package id="Microsoft.Extensions.Logging.Abstractions" version="2.1.1" targetFramework="net48" />
<package id="NewId" version="3.0.3" targetFramework="net48" />
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="net48" />
<package id="Newtonsoft.Json.Bson" version="1.0.1" targetFramework="net48" />
<package id="RabbitMQ.Client" version="6.2.1" targetFramework="net48" />
<package id="System.Buffers" version="4.5.1" targetFramework="net48" />
<package id="System.Diagnostics.DiagnosticSource" version="4.7.1" targetFramework="net48" />
<package id="System.Memory" version="4.5.4" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
<package id="System.Reflection.Emit" version="4.7.0" targetFramework="net48" />
<package id="System.Reflection.Emit.Lightweight" version="4.7.0" targetFramework="net48" />
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="4.5.3" targetFramework="net48" />
<package id="System.Runtime.Loader" version="4.3.0" targetFramework="net48" />
<package id="System.Threading.Channels" version="4.7.1" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
<package id="System.Threading.ThreadPool" version="4.3.0" targetFramework="net48" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
<package id="System.Xml.ReaderWriter" version="4.3.1" targetFramework="net48" />
</packages>
订户启动后,交换和队列成功创建,但我仍然无法推送消息。请帮助我。您可能需要从学习async/await在C#中的工作原理开始。如果希望一个方法返回一个
任务
而不等待它,那么它永远不会发生。除非等待,否则任务永远不会开始
制作人:
namespace Publisher
{
class Program
{
public static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
});
await bus.Start();
await Task.WhenAll(Enumerable.Range(0, 100).Select(i =>
{
var message = new ValueEntered { Value = $"Message {i}" };
return bus.Publish(message);
}));
await bus.Stop();
}
}
}
消费者:
namespace Subscriber
{
class Program
{
public static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint("value-events-listener", e =>
{
e.Consumer<ValueConsumer>();
});
});
await bus.Start();
Console.WriteLine("Waiting for messages...");
Console.ReadLine();
await bus.Stop();
}
}
public class ValueConsumer : IConsumer<ValueEntered>
{
public Task Consume(ConsumeContext<ValueEntered> context)
{
Console.WriteLine($"Received [x] {JsonConvert.SerializeObject(context)} [at] {DateTime.Now:u}");
return Task.CompletedTask;
}
}
}
命名空间订阅者
{
班级计划
{
公共静态异步任务主(字符串[]args)
{
var bus=bus.Factory.CreateUsingRabbitMq(cfg=>
{
主机(新Uri(“rabbitmq://localhost,h=>
{
h、 用户名(“客人”);
h、 密码(“客人”);
});
ReceiveEndpoint(“值事件侦听器”,e=>
{
e、 消费者();
});
});
等待公共汽车。开始();
Console.WriteLine(“等待消息…”);
Console.ReadLine();
等公共汽车,停下来;
}
}
公共类价值消费者:i消费者
{
公共任务消费(消费上下文)
{
WriteLine($“在{DateTime.Now:u}接收到[x]{JsonConvert.SerializeObject(context)}];
返回Task.CompletedTask;
}
}
}
非常感谢。完全没有注意到我使用了异步void。
namespace Publisher
{
class Program
{
public static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
{
sbc.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
});
await bus.Start();
await Task.WhenAll(Enumerable.Range(0, 100).Select(i =>
{
var message = new ValueEntered { Value = $"Message {i}" };
return bus.Publish(message);
}));
await bus.Stop();
}
}
}
namespace Subscriber
{
class Program
{
public static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingRabbitMq(cfg =>
{
cfg.Host(new Uri("rabbitmq://localhost"), h =>
{
h.Username("guest");
h.Password("guest");
});
cfg.ReceiveEndpoint("value-events-listener", e =>
{
e.Consumer<ValueConsumer>();
});
});
await bus.Start();
Console.WriteLine("Waiting for messages...");
Console.ReadLine();
await bus.Stop();
}
}
public class ValueConsumer : IConsumer<ValueEntered>
{
public Task Consume(ConsumeContext<ValueEntered> context)
{
Console.WriteLine($"Received [x] {JsonConvert.SerializeObject(context)} [at] {DateTime.Now:u}");
return Task.CompletedTask;
}
}
}