我在一家数字标牌公司工作,我们向网络上的各种机器发送大量动画/视频.我们过去曾使用ftp将文件从服务器应用程序(我们的内容管理系统)发送到播放内容的计算机.
是否可以在我们发送大文件的环境中使用RabbitMQ(某些视频的大小可能是千兆字节或更大)?大多数文件都非常小,但偶尔我们会发送大型视频.
此外,一些播放器机器将在稍后添加,这意味着排队必须是动态的(即添加播放器,所以现在我们可以向其发送内容).RabbitMQ可以这样配置吗?(从我看到的演示中,您必须在服务器和客户端应用程序启动之前预先创建队列).
我们还可以保护文件的发送,以便发送应用程序在将内容发送到计算机之前必须登录(如登录FTP)?
嗨,我试图通过EasyNetQ通过RabbitMQ发送一个简单的对象.我在订阅方面反序列化该对象时遇到问题.任何人都能告诉我一个如何工作的样本.请记住,正在发送的对象是在其自己的项目中定义的,而不是在发布者和订阅者之间共享.这是我的样本,也许你可以告诉我它有什么问题?
计划A:
class ProgramA
{
static void Main(string[] args)
{
using (var bus = RabbitHutch.CreateBus("host=localhost"))
{
Console.WriteLine("Press any key to send the message");
Console.ReadKey();
bus.Publish(new MessageA { Text = "Hello World" });
Console.WriteLine("Press any key to quit");
Console.ReadKey();
}
}
public class MessageA
{
public string Text { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
方案B:
class ProgramB
{
static void Main(string[] args)
{
using (var bus = RabbitHutch.CreateBus("host=localhost"))
{
bus.Subscribe<MessageB>("", HandleClusterNodes);
Console.WriteLine("Press any key to quit");
Console.ReadKey();
}
}
private static …Run Code Online (Sandbox Code Playgroud) 错误消息发布到默认EasyNetQ_Default_Error_Queue时,我有四个使用者,是否有可能每个队列使用者都编写自己的错误交换
例如;
Queue Name : A ErrorExchange :A_ErrorExchange
Queue Name : B ErrorExchange :B_ErrorExchange
Run Code Online (Sandbox Code Playgroud)
bus.Advanced.Conventions.ErrorExchangeNamingConvention = new ErrorExchangeNameConvention(info => "A_DeadLetter");
bus.Advanced.Conventions.ErrorExchangeNamingConvention = new ErrorExchangeNameConvention(info2 => "B_DeadLetter");
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种可靠的方法来重新排队无法正确处理的消息 - 目前.
我一直在关注http://dotnetcodr.com/2014/06/16/rabbitmq-in-net-c-basic-error-handling-in-receiver/,似乎支持在RabbitMQ中重新排队消息API.
else //reject the message but push back to queue for later re-try
{
Console.WriteLine("Rejecting message and putting it back to the queue: {0}", message);
model.BasicReject(deliveryArguments.DeliveryTag, true);
}
Run Code Online (Sandbox Code Playgroud)
但是我正在使用EasyNetQ.所以想知道我将如何做类似的事情.
bus.Subscribe<MyMessage>("my_subscription_id", msg => {
try
{
// do work... could be long running
}
catch ()
{
// something went wrong - requeue message
}
});
Run Code Online (Sandbox Code Playgroud)
这甚至是一个好方法吗?不ACK,如果该消息可能导致的问题do work超过了等待ACK由RabbitMQ的服务器超时.
我必须实现一个asp.net web api,它充当rabbitMQ的订阅者.Windows服务将向web api服务发布消息.在生产环境中将运行多个web api实例.我不知道如何打开web api上的订阅者频道并保持打开状态直到IIS重新启动.将有一个出版商和几个消费者.
任何人都可以指导一些示例代码开始?
任何帮助都将非常感激
我正在考虑使用 EasyNetQ 与 RabbitMQ 进行交互,并想知道它是否可以支持以下情况:
我发现的可能性是:
问题是我可以只使用带有自定义参数的现有队列而不需要指定它们吗?
我正在编写一个小应用程序,我正在使用RabbitMQ发送/接收消息.一切正常,但我正在努力解决消息持久性问题.
我希望即使在服务器重启中,消息仍保留在队列中.我理解交换和队列级别的持久性概念,并将它们设置为true(而不是默认为true).因此,当我重新启动RabbitMQ服务器时,交换和队列保持不变,但队列中的消息将被删除.
我正在使用EasyNetQ.IBus接口发送消息.
谢谢
我正在创建一个用于测试不同RabbitMQ客户端之间的性能的应用程序。
其中之一应该是SQL Server。
我发现存在用于SQL Server集成服务(SSIS)的RabbitMQ组件。
但是似乎尚未编写可以向交换机发送消息的目标组件。
任何想法如何执行?
将消息发布到MSMQ是否应该与之相似?
我正在经历使用LDAP授权设置RabbitMQ的过程,但我没有太多运气......有人知道,请看看我告诉我我做错了什么?我能够使用以下代码查询LDAP以获取用户对象:
var entry = new DirectoryEntry("LDAP://ourldapbox.ourcompany.co.uk:636/CN=Mark Twain,OU=Development,OU=OurCompany Employees,DC=OurCompany,DC=co,DC=uk");
Run Code Online (Sandbox Code Playgroud)
配置尝试1
[
{rabbit, [{auth_backends, [rabbit_auth_backend_ldap, rabbit_auth_backend_internal]}]},
{rabbitmq_auth_backend_ldap,
[ {servers, ["ourldapbox.ourcompany.co.uk"]},
{user_dn_pattern, "CN=${username},OU=Development,OU=OurCompany Employees,DC=OurCompany,DC=co,DC=uk"},
{use_ssl, false},
{port, 636},
{log, true}
]
}
].
Run Code Online (Sandbox Code Playgroud)
配置尝试2
[
{rabbit, [{auth_backends, [rabbit_auth_backend_ldap, rabbit_auth_backend_internal]}]},
{rabbitmq_auth_backend_ldap,
[ {servers, ["ourldapbox.ourcompany.co.uk"]},
{dn_lookup_attribute, "sAMAccountName"},
{dn_lookup_base, "DC=ourcompany,DC=co,DC=uk"},
{user_dn_pattern, "${username}@ourcompany.co.uk"},
{other_bind, anon},
{use_ssl, false},
{port, 636},
{log, true}
]
}
].
Run Code Online (Sandbox Code Playgroud)
配置尝试3
[
{rabbit, [{auth_backends, [rabbit_auth_backend_ldap, rabbit_auth_backend_internal]}]},
{rabbitmq_auth_backend_ldap,
[ {servers, ["ourldapbox.ourcompany.co.uk"]},
{dn_lookup_attribute, "userPrincipalName"},
{dn_lookup_base, "dc=ourcompany,dc=co,dc=uk"},
{user_dn_pattern, "${username}@ourcompany.co.uk"},
{use_ssl, false},
{port, 636},
{log, true}
] …Run Code Online (Sandbox Code Playgroud) 使用EasyNetQ v0.63.0.448,RabbitMqClient v4.0.2和RabbitMq服务器3.6.5,当我尝试创建这样的总线时......
bus = RabbitHutch.CreateBus(new ConnectionConfiguration()
{
Hosts = new[] { new HostConfiguration() { Host = hostName, Port = port } },
UserName = username,
Password = password,
}, x => { }).Advanced;
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
"未找到字段'RabbitMQ.Client.ConnectionFactory.AutomaticRecoveryEnabled'."
这是easynetq和这个版本的Rabbit之间的潜在不兼容性,还是我需要在某个地方对API进行更改?
我几乎找一个端口Autofac被实施这里有温莎城堡.这IBus是EasyNetQ库提供的接口,我想注册一个将IBus实例实例化为单例的工厂.BusBuilder.CreateMessageBus是工厂方法.Castle Windsor的例子:
container.Register(
Component.For<IBus>()
.UsingFactoryMethod(BusBuilder.CreateMessageBus)
.LifestyleSingleton()
);
Run Code Online (Sandbox Code Playgroud) 我想我对async/await对的工作方式有一般性的误解.我正在使用EasyNetQ方法(C#中的RabbitMQ接口),我正在尝试调用我创建的以下方法:
public Task<U> RequestDirectReply<T, U>(T request, int timeout) where T : class where U : class
{
using (var bus = RabbitHutch.CreateBus($"virtualHost=MyVirtualHost;timeout={timeout};host=MyHostName"))
{
return bus.RequestAsync<T, U>(request);
}
}
Run Code Online (Sandbox Code Playgroud)
现在我理解这一点的方式,我应该能够调用这个方法,从RequestAsync获取一个Task,然后做一堆东西,然后等待那个Task,一旦我完成了那些东西.像这样的东西:
Task<Reply> task = RequestDirectReply<Request, Reply>(msg, 10);
for (int i = 0; i < 1000000000; ++i)
{
// Hi, I'm counting to a billion
}
var reply = await task;
Run Code Online (Sandbox Code Playgroud)
但是,程序会阻止对RequestAsync的调用超时,而不是等待.然后await会立即抛出超时异常.
为了看我是否误解,我也尝试了以下方法:
public async Task<U> RequestDirectReply<T, U>(T request, int timeout) where T : class where U : class
{
using (var bus …Run Code Online (Sandbox Code Playgroud) 所以,EasyNetQ 自动订阅器有一个基本的默认调度器,它不能使用非无参数构造函数创建消息消费者类。
要查看实际效果,请创建一个具有所需依赖项的使用者。您可以设置自己的服务,也可以使用ILogger<T>由框架默认值自动注册的 。
消费文本消息.cs
public class ConsumeTextMessage : IConsume<TextMessage>
{
private readonly ILogger<ConsumeTextMessage> logger;
public ConsumeTextMessage(ILogger<ConsumeTextMessage> logger)
{
this.logger = logger;
}
public void Consume(TextMessage message)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
连接自动订阅器(就在哪里/何时编写/运行此代码而言,这里有一些回旋余地)。
启动文件
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IBus>(RabbitHutch.CreateBus("host=localhost"));
}
Run Code Online (Sandbox Code Playgroud)
(在其他地方,也许startup.Configure或一个BackgroundService)
var subscriber = new AutoSubscriber(bus, "example");
subscriber.Subscribe(Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)
现在,启动程序并发布一些消息,您应该会看到每条消息都最终出现在默认错误队列中。
System.MissingMethodException: No parameterless constructor defined for this object.
at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean wrapExceptions, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor)
at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean wrapExceptions, Boolean …Run Code Online (Sandbox Code Playgroud) easynetq ×13
rabbitmq ×10
c# ×9
.net ×1
asp.net-core ×1
async-await ×1
autofac ×1
consumer ×1
ldap ×1
ldap-query ×1
sql-server ×1