asp.net core使用 MassTransit.AmazonSQS连接AWS SQS 转到
-
修改 ConfigureServices
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddMassTransit(x =>
{
//添加 实现了 IConsumer 接口的类
x.AddConsumer();x.UsingAmazonSqs((context, cfg) => { cfg.Host("us-east-1", h => { h.AccessKey("your-iam-access-key"); //替换你AWS的Access key h.SecretKey("your-iam-secret-key"); //替换你AWS的secret key }); //修改代码: //cfg.ConfigureEndpoints(context); var formatter = new NameSpaceCustomFormatter(new DefaultEndpointNameFormatter(false)); cfg.MessageTopology.SetEntityNameFormatter(formatter); cfg.ConfigureEndpoints(awscontext, formatter); }); }); services.AddHostedService<Worker>(); });
}
NameSpaceCustomFormatter.cs
public class NameSpaceCustomFormatter : IEndpointNameFormatter, IEntityNameFormatter
{
private readonly IEndpointNameFormatter defaultFormatter;
/// <summary>
///
/// </summary>
/// <param name="defaultFormatter"></param>
public NameSpaceCustomFormatter(IEndpointNameFormatter defaultFormatter)
{
this.defaultFormatter = defaultFormatter;
}
/// <summary>
///
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
public string TemporaryEndpoint(string tag)
{
return defaultFormatter.TemporaryEndpoint(tag);
}
/// <summary>
/// 这里修改AWS SQS 队列名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public string Consumer<T>() where T : class, IConsumer
{
var defaultName = defaultFormatter.Consumer<T>();
// Please give this a bit more thought. This is just to make a point.
var type = typeof(T).GetInterfaces().First().GenericTypeArguments.First();
if (type.Namespace.Contains("command", StringComparison.OrdinalIgnoreCase))
{
return defaultName + ".fifo";
}
switch (defaultName)
{
case "Register": // 对应类: RegisterConsumer
defaultName = "自定义SQS队列名";
break;
break;
}
return defaultName;
}
/// <summary>
/// 这里修改AWS SNS 主题名称
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public string FormatEntityName<T>()
{
var type = typeof(T);
if (type.Namespace.Contains("command", StringComparison.OrdinalIgnoreCase))
{
return type.Name + ".fifo";
}
switch(type.Name)
{
case "LoginDto": //对应类: LoginDto
return "a自定义SNS主题名-"+ type.Name;
default:
return type.Name;
}
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public string Message<T>() where T : class
{
return defaultFormatter.Message<T>();
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public string Saga<T>() where T : class, ISaga
{
return defaultFormatter.Saga<T>();
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TArguments"></typeparam>
/// <returns></returns>
public string ExecuteActivity<T, TArguments>() where T : class, IExecuteActivity<TArguments> where TArguments : class
{
return defaultFormatter.ExecuteActivity<T, TArguments>();
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TLog"></typeparam>
/// <returns></returns>
public string CompensateActivity<T, TLog>() where T : class, ICompensateActivity<TLog> where TLog : class
{
return defaultFormatter.CompensateActivity<T, TLog>();
}
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public string SanitizeName(string name)
{
return name;
}
/// <summary>
///
/// </summary>
public string Separator { get; }
}
OK,查看一下AWS SQS 和AWS SNS就可以。