有没有办法从threadId中找出,如果一个线程有消息队列?
基本上有一些windows api只有在线程有消息queue.window时才有效
我想了解有关编程消息传递应用程序和使用消息队列的更多信息.像qpid,亚马逊队列等等.你能指点一些应用程序(如果可能的话,最好是C++,开源),这样我就可以了解更多.
另外,您能否告诉我一般指导方针,用于决定是否不使用消息队列.我很有兴趣只是因为"酷"因素而倾向于此,但我认为它对我来说可能是有益的.
谁能为我推荐一个开源消息队列?像JMS,gearmand,zeroMq,Amazon SQS.Tt最好满足以下几点(不是强迫性的):
非常感谢!
该TControl.Perform代码是:
var
Message: TMessage;
begin
Message.Msg := Msg;
Message.WParam := WParam;
Message.LParam := LParam;
Message.Result := 0;
if Self <> nil then WindowProc(Message);
Result := Message.Result;
Run Code Online (Sandbox Code Playgroud)
程序执行等待返回,我是对的吗?
有一种替代方法,用于在同一个应用程序中的另一个线程内的TFORM队列中发布消息,而无需等待返回?
这种方法可以缓解这个问题吗?
interface
const
WM_DOSTUFF = WM_APP + $001;
TMyForm = class(TForm)
{stuff}
public
{Other stuff}
procedure DoMyStuff(var Msg: TMessage); message WM_DOSTUFF;
{More stuff}
end;
var
MyHandle: HWND;
implementation
constructor TMyForm.Create(AOwner: TComponent);
begin
inherited;
MyHandle := AllocateHWnd(DoMyStuff);
end;
destructor TMyForm.Destroy;
begin
DeallocateHWnd(MyHandle);
inherited;
end;
Run Code Online (Sandbox Code Playgroud)
并且通常在线程内使用:
PostMessage(MyHandle, WM_DOSTUFF, 0, 0);
Run Code Online (Sandbox Code Playgroud) 我正在运行一个需要的项目
虽然我们不需要其RPC功能,但Thrift完全符合这些标准.我们将通过MQ发送/接收序列化的thrift数据.序列化对象非常简单.但是,当涉及反序列化时,我们不能做这样的事情:
byte[] data = recv();
Object object = TDeserializer.deserialize(data);
if (object instanceof TypeA) {
TypeA a = (TypeA) object;
} else if (object instanceof TypeB) {
TypeB b = (TypeB) object;
}
Run Code Online (Sandbox Code Playgroud)
似乎我们必须告诉thrift它需要反序列化到哪个结构:
byte[] data = recv();
TypeA a;
TDeserializer.deserialize(a, data);
Run Code Online (Sandbox Code Playgroud)
只是想知道是否有办法在不知道其确切类型的情况下将原始数据反序列化为thrift对象.
谢谢!!
cross-platform thrift cross-language message-queue protocol-buffers
我正在使用NServiceBus向后端系统发送订单(每个命令一个订单).每个订单都有一个客户(父母).成功保存订单后,后端系统会发布"订单已接受"事件.该事件有多个订户,其中一个是文件生成器组件,它生成要由第三方使用的XML文件.此文件是按客户生成的.由于每次发布"订单接受"事件时发布的事件都处于订单级别,因此文件组件会为客户创建整个文件.
NServiceBus中是否有一种方法可以在订阅者处对事件进行分组,这样,如果同一个客户有多个订单,我们可以减少文件生成器运行的次数?
我们的一个想法是让用户在一段固定时间内休眠,当它被唤醒时,它可以将消息分组到客户的队列中,并为每个客户生成一次文件.这听起来像个好主意吗?
提前致谢.
我在生产系统中运行ActiveMQ.我们的一些队列的音量非常高,而且有些音量非常低.我有兴趣镜像其中一个低容量队列,这样我就可以围绕收到的消息构建非正式的监控服务.
不幸的是,我能找到的唯一文档似乎暗示镜像队列是全有或全无:你要么为你拥有的每一个队列创建一个主题(并且要复制流经你的每一条消息的性能损失)系统),或者根本不能使用该功能.
是否无法为单个已知队列名称启用此有用功能?
我有一个排队的webjob使用queuetrigger执行任务:
public static void ProcessQueueMessage([QueueTrigger("queue")],Data data, TextWriter log)
{
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
在同一个解决方案中有一个网站,我需要做的是简单地从一个网站控制器向队列中添加消息.我已经尝试直接引用该函数,但似乎这只是运行函数而不是排队消息,这是不可取的,因为它以一种扩展性很差的方式创建了一大堆线程.
我们有一个消息队列.我们希望并行处理消息并限制同时处理的消息的数量.
我们下面的试用代码会并行处理消息,但只有在完成上一个流程时才会启动新批处理.我们想在完成后重启任务.
换句话说:只要消息队列不为空,任务的最大数量应始终处于活动状态.
static string queue = @".\Private$\concurrenttest";
private static void Process(CancellationToken token)
{
Task.Factory.StartNew(async () =>
{
while (true)
{
IEnumerable<Task> consumerTasks = ConsumerTasks();
await Task.WhenAll(consumerTasks);
await PeekAsync(new MessageQueue(queue));
}
});
}
private static IEnumerable<Task> ConsumerTasks()
{
for (int i = 0; i < 15; i++)
{
Command1 message;
try
{
MessageQueue msMq = new MessageQueue(queue);
msMq.Formatter = new XmlMessageFormatter(new Type[] { typeof(Command1) });
Message msg = msMq.Receive();
message = (Command1)msg.Body;
}
catch (MessageQueueException mqex)
{
if …Run Code Online (Sandbox Code Playgroud) .net c# parallel-processing message-queue task-parallel-library