我在.Net程序中使用ActiveMQ,我充斥着消息事件.
简而言之,当我得到一个队列事件'onMessage(IMessage receivedMsg)'时,我将消息放入一个内部队列,X线程就是这样做的.
起初,我在创建会话时有'AcknowledgementMode.AutoAcknowledge',所以我猜测队列中的所有消息都被吸入并放入内存队列(因为崩溃,所以一切都丢失了,这是冒险的).
所以我在创建会话时使用了'AcknowledgementMode.ClientAcknowledge',当工作人员准备好了消息时,它会在消息上调用'commit()'方法.但是,仍然会从队列中删除所有消息.
如何配置它只处理X个消息或处于内部队列中,并且不是所有内容都被立即"下载"了?
我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息.设置POSIX消息队列似乎相对容易,其中所有工蜂都可以定期向状态维护者发送更新.我的问题?POSIX消息队列必须具有名称.我不想选一个名字; 所有我关心的是获得一个独特的消息队列,就像我使用SYSV消息队列一样IPC_PRIVATE.对于我可以使用的唯一文件名mkstemp(3)或我可以使用的唯一打开文件描述符tmpfile(3). 我应该如何获得唯一的POSIX消息队列?
有人可以告诉我如何检查消息队列中是否有任何消息.消息队列在基于Linux的操作系统的C中实现.我只想检查特定时间消息队列中是否有任何消息.
我正在寻找一种方法为一个线程明确选择一个表行.我编写了一个爬虫程序,它可以处理大约50个并行进程.每个进程都必须从表中取出一行并进行处理.
CREATE TABLE `crawler_queue` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`url` text NOT NULL,
`class_id` tinyint(3) unsigned NOT NULL,
`server_id` tinyint(3) unsigned NOT NULL,
`proc_id` mediumint(8) unsigned NOT NULL,
`prio` tinyint(3) unsigned NOT NULL,
`inserted` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `proc_id` (`proc_id`),
KEY `app_id` (`app_id`),
KEY `crawler` (`class_id`,`prio`,`proc_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Run Code Online (Sandbox Code Playgroud)
现在我的流程执行以下操作:
SELECT * FROM crawler_queue WHERE class_id=2 AND prio=20 AND proc_id=0 ORDER BY id LIMIT 1 FOR UPDATEUPDATE crawler_queue …我正在尝试将Storm(请参阅此处)整合到我的项目中.我理解了拓扑,喷口和螺栓的概念.但是现在,我正在试图找出一些事情的实际实现.
A)我有一个带有Java和Clojure的多语言环境.我的Java代码是一个回调类,其中包含触发流数据的方法.推送到这些方法的事件数据是我想用作喷口的.
所以第一个问题是如何将进入这些方法的数据连接到喷口?我正在尝试i)传递backtype.storm.topology.IRichSpout,然后ii)将backtype.storm.spout.SpoutOutputCollector(请参阅此处)传递给该spout的open函数(请参阅此处).但我无法看到实际传递任何类型的地图或列表的方法.
B)我项目的其余部分都是Clojure.通过这些方法将会有大量数据.每个事件的ID都在1到100之间.在Clojure中,我想将来自spout的数据拆分为不同的执行线程.我认为那些将是螺栓.
如何设置Clojure螺栓从喷口中获取事件数据,然后根据传入事件的ID中断线程?
提前谢谢蒂姆
[编辑1]
我实际上已经解决了这个问题.我结束了1)实现我自己的IRichSpout.然后,我2)连接,使得嘴内部的元组将输入数据流在我的Java回调类.我不确定这是不是惯用的.但它编译并运行没有错误.但是,3)我没有看到传入的流数据(肯定存在),来自printstuff bolt.
为了确保事件数据得到传播,我是否需要在spout或bolt实现或拓扑定义中做些具体的事情?谢谢.
;; tie Java callbacks to a Spout that I created
(.setSpout java-callback ibspout)
(storm/defbolt printstuff ["word"] [tuple collector]
(println (str "printstuff --> tuple["tuple"] > collector["collector"]"))
)
(storm/topology
{ "1" (storm/spout-spec ibspout)
}
{ "3" (storm/bolt-spec { "1" :shuffle }
printstuff
)
})
[编辑2]
根据SO成员 …
我有兴趣在RabbitMQ中实现"工作队列"模型.但是,我发现代理执行简单的循环操作,将任务分配给工作人员.
https://www.rabbitmq.com/tutorials/tutorial-two-java.html
如果某个特定的工作人员忙于执行非常繁重的任务并且还有其他自由工作者,则代理应该能够将队列中的消息分发给下一个可用的工作人员,而不是循环序列中的下一个工作人员.有没有办法使用RabbitMQ实现这一目标?
我通过Windows服务运行.exe,它从私有队列中读取消息.服务一切都很好而且稳定,但有时服务停止(它实际上没有停止,但它没有处理任何东西.服务状态仍然是"已启动",我需要手动重启它).
这个经常不会出现但是分析.exe文件的内存转储,我发现在异常下遇到了这么多线程.
异常对象:0000000001436120异常类型:System.Messaging.MessageQueueException消息:外部组件引发了异常.
System.Messaging.MessageQueueException- External component has thrown an exception
System.Messaging.MessageQueue.ReceiveCurrent(System.TimeSpan, Int32, System.Messaging.Interop.CursorHandle, System.Messaging.MessagePropertyFilter, System.Messaging.MessageQueueTransaction, System.Messaging.MessageQueueTransactionType)
System.Messaging.MessageQueue.Peek(System.TimeSpan)
Run Code Online (Sandbox Code Playgroud)
知道服务遇到这个异常的原因吗?提前致谢
我试图理解Actor模型的概念.当我在看Akka.Net项目的时候,我想我也可以使用Web服务或消息队列来实现相同的功能.
Actor Model Concept相对于Web服务和消息队列的主要优势是什么?
是否可以在RabbitMQ中实现聚合器模式?
我有A…… N需要等待/聚集的消息,然后再发送到另一个队列X。
因此,我想我将拥有某种唯一的ID,以确保将消息专门路由到同一使用者,然后等待所有消息到达。
RabbitMQ有可能吗?
如我所见,.net核心不支持MSMQ,因为它不是跨平台的(仅Windows)。那么,Microsoft在.net core中针对MQ中间件的解决方案是什么?如果没有,是否建议使用第三方MQ解决方案,例如zeromq,IBM Websphere MQ,Rabbit MQ等?