标准窗口的队列包含多少条消息?队列溢出时会发生什么?
GetMessage和亲戚的文档没有说明这一点,PeekMessage只为某些类别的消息提供了是/否,而不是消息计数.
此页面说明队列是使用内存映射文件实现的,并且没有消息计数限制,但该页面是关于WinCE的.这是否也适用于桌面Win32?
我被要求设计并实施一个系统,用于从大量设备接收大量自动传感器数据.此数据将定期生成,并作为xml在http帖子中发送到服务器.如果设备未从服务器收到特定确认,则设备将继续重新发送相同的数据.在通过事务将数据插入主数据库中的多个表之前,需要对该数据进行一些潜在的重载处理,并且还需要将一些数据点入队以重定向到其他外部URL.
我打算使用Java应用程序服务器(倾向于GlassFish)和servlet来接收传入的数据.我想实现某种排队机制来暂时存储数据,以便返回传感器的响应不依赖于所有中间处理.单独的独立队列也是数据重定向部分的要求.经过一些研究后,两个主要选择似乎是:
1)在应用服务器上安装数据库,并使用表用于各种队列.队列将由Java应用程序处理,可以在应用程序服务器中运行,也可以作为自己的服务独立运行.
2)使用数据库支持的JMS解决方案来实现排队.
我对JMS并不熟悉,但从我看过的内容来看,似乎是这种情况下更好的解决方案.主要要求是在处理之前没有传感器数据丢失或从队列中丢弃,并且它或多或少地按顺序处理.我们还希望在某些时候可以轻松停止某些队列的处理,但仍然会让它们累积数据,并且这些消息永远不会自动过期.
使用策略1,我很明显如何满足这些要求,但它可能不那么健壮和可扩展,并且比策略2更复杂,因为我需要编写自己的多线程代码来处理各种独立队列.我想知道在为此目的使用JMS队列时可能存在的潜在缺陷是什么,因为我之前从未使用过它们.
数据完整性是一个大问题,所以我需要确保JMS能够保证在服务器重启,停电或者由于某种原因队列变得非常大的情况下不会丢失数据.例如,在一段时间内完成到主数据库的事务可能会导致JVM耗尽内存,崩溃并丢失所有累积的数据?(这将是噩梦般的场景).
此外,我想知道是否有任何方法可以通过应用服务器管理工具暂停JMS队列处理或轻松查看队列中的内容(我会将一个对象列入消息xml加上一些其他数据,包括收到的时间戳,等等.我在这里阅读了一些处理相关问题的帖子,但希望得到一些直接反馈.基本上我想知道JMS不是一个合适的排队解决方案的实例(如果有的话),如果这是其中一个案例.任何意见是极大的赞赏.
我正在研究用于嵌入式Linux上进程间通信的消息队列.我想知道为什么我没有使用Linux提供的消息队列如下:
msgctl,msgget msgrcv,msgsnd.
而不是创建共享内存,并与信号量同步?
直接在业务嵌入式产品上使用这组功能有什么缺点?
在我们开发自定义解决方案之前,我正在寻找某种类型的库,它提供:
HTTP请求的非阻塞队列
具有以下属性:
那么请问,有什么可以正确知道的,有什么可以节省我们整天开发这个?
现在我们不需要对已完成的请求进行任何回调,也不需要保存结果数据,因为不会有这样的回调.
我正在构建一个包含许多部分的小型系统,我想使用消息pub/sub服务在各部分之间进行通信.
我读到了一些像RabbitMQ和ZeroMQ这样的消息队列服务,但我觉得它们太复杂了,感觉它是为分布式系统而生的.我的系统的所有部分都将用C++/Linux编写并放在一个小型的Raspberry Pi CPU上,因此我不需要像可扩展,跨平台,其他语言客户端这样的功能......
你们能给我一些适合我需要的服务或图书馆的建议吗?
我正在尝试设置RabbitMQ服务器集群,以使用主动/被动服务器架构获得高可用性队列.我正在遵循这些指南:
我对高可用性的要求很简单,我有两个节点(CentOS 6.4)与RabbitMQ(v3.2)和Erlang R15B03.Node1必须是"活动的",响应所有请求,Node2必须是"被动"节点,其中包含所有队列和消息(来自Node1).
为此,我配置了以下内容:
我接下来要做的是在两个节点之间创建一个集群:将Node2加入Node1(指南1).之后,我配置了一个策略来镜像队列(指南2),复制集群中所有节点之间的所有队列和消息.这可行,我可以连接到任何节点并发布或使用消息,同时两个节点都可用.
当我有一个在Node1上创建的队列"queueA"(队列A上的主服务器),并且当Node1停止时,我无法连接到Node2中的queueA来生成或使用消息时,Node2会抛出错误说Node1不可访问(我认为queueA没有被复制到Node2,并且Node2不能被提升为queueA的master).
错误是:
{"AMQP操作被中断:AMQP关闭原因,由Peer发起,代码= 404,text = \"NOT_FOUND - vhost'app01'中持久队列'queueA'的主节点'rabbit @ node1'关闭或无法访问\ ",classId = 50,methodId = 10,cause ="}
使用的步骤顺序是:
节点1:
1. rabbitmq-server -detached
2. rabbitmqctl start_app
Run Code Online (Sandbox Code Playgroud)
节点2:
3. Copy .erlang.cookie from Node1 to Node2
4. rabbitmq-server -detached
Run Code Online (Sandbox Code Playgroud)
加入集群(Node2):
5. rabbitmqctl stop_app
6. rabbitmqctl join_cluster rabbit@node1
7. rabbitmqctl start_app
Run Code Online (Sandbox Code Playgroud)
配置队列镜像策略:
8. rabbitmqctl set_policy ha-all "" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
Run Code Online (Sandbox Code Playgroud)
注意:用于队列名称的模式是""(所有队列).
当我运行'rabbitmqctl list_policies'和'rabbitmqctl cluster_status'时一切正常.
如果Node1不可用,为什么Node2无法响应?这个设置有什么问题吗?
假设我有以下代码段,在qto的析构函数中调用deleteLater是否可以安全地管理它可能管理的其他QT对象?
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyQTObject qto;
qto.show();
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
因为我用泄漏检测器分析了类似的代码,并且调用了deleteLater的所有对象都没有正确释放,除非我用普通删除替换了调用.如果我已正确理解这一点,则deleteLater仅在QT消息队列中注册删除事件.这可能是在main的范围结束时调用qto的析构函数的问题,而QT消息循环已经从a.exec的返回结束了吗?因此,永远不会处理删除事件,实际上甚至没有被推入消息队列,因为没有?
我正在处理的应用程序需要与远程位置的IBM MQ服务器进行通信.我们目前有一个使用活动MQ的工作系统,它使用代理,以及连接到这个远程IBM MQ服务器的桥,并且工作正常.
由于一些新的增强,我们现在尝试使用IBM客户端jar而不是Active MQ来实现相同的功能.
我面临的问题是我可以连接到远程服务器的inboundQ并发送消息.但我总是从远程服务器出站队列接收null.但我无法检查是否在远程位置收到了消息.但是,如果通过旧的ActiveMQ系统发送相同的消息将从远程MQ服务器获得响应.
旧的Active MQ在内部使用桥连接到远程IBM MQ服务器,该服务器的配置与我正在使用的新代码完全相同.
我已尝试从互联网和堆栈溢出本身的多个代码,并始终我能够连接但没有得到任何响应.
此外,尝试从远程IBM MQ发送或接收时,我没有收到任何错误或异常.
我将粘贴一个我试图开始工作的示例代码.我在代码中更改了一些配置值.
我怀疑如下.
我正在做的就是将IBM MQ客户端jar复制到应用程序中,并使用代码将消息发送到远程MQ.我还没有安装任何其他应用程序.这样的系统会工作还是应该总是有一些像活动MQ这样的中间程序?
相同的代码能够从我在本地网络中安装但未能从远程服务器获得响应的IBM MQ服务器发送和接收?这让我相信如果我在配置中遗漏了什么?除了在代码中还应该配置什么?
我看到没有错误或例外.始终发送消息但响应为空.我没有看到任何用户名密码或公钥 - 私钥认证的使用.是否通常使用任何身份验证来检查源.?
我正在使用IBM MQ客户端5.3版本,我知道它已经过时了.但是使用它,因为它们工作的主动MQ设置使用相同的并且正常工作.我无法知道远程计算机上的IBM MQ服务器上存在哪个版本.如果我们使用与服务器MQ版本不同的客户端MQ版本,是否存在问题.?
在本地环境中适用于我的示例代码,即能够从我在本地网络中的另一台机器上安装的IBM MQ服务器发送和接收.当我尝试将其与远程IBM MQ服务器一起使用时,相同的代码将获取null响应.
import javax.jms.*;
import javax.jms.JMSException;
import com.ibm.mq.jms.*;
import com.ibm.jms.JMSMessage;
import javax.jms.TextMessage;
public class SendReceive {
private MQQueueConnectionFactory connectionFactory;
private MQQueueConnection connection;
private void runTest() {
try {
connect();
connection.start();
MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE"); /* values replaced with correct values in deployment server */
MQQueue queue2 = (MQQueue) …Run Code Online (Sandbox Code Playgroud) 我目前正在开发一个项目,我需要与IBM系统进行交互,该系统通过WebSphere MQ与外部世界进行通信.我需要使用队列以"请求 - 响应"方式查询系统,我将通过队列管理器执行此操作.
但是,我无法理解这在实际工作中是如何运作的.
假设我有相同应用程序的多个实例,它们将消息放入请求队列.该消息得到了CorrelationId和MessageId在离开应用程序和ReplyToQueue属性,都会设置每封邮件,以确保该队列管理器知道哪个队列把到响应.
但是,队列管理器如何操作响应队列?关于响应的时间安排无法保证,那么正确的响应如何回到发出相应请求的应用程序实例?
我一直认为消息队列是一个FIFO队列,必须逐个拾取消息.但是,这意味着实例A可以选择针对例如B的响应.显然,这不是它的工作原理.
然后,当我看API( com.ibm.mq.MQQueue)我看到来接的消息我有机会提供CorrelationId和MessageId请求消息的.这是否意味着当我向队列管理器查询消息(具有这些ID的集合)时,队列管理器会遍历队列中的消息并返回匹配的消息?另一方面,这意味着我们不是在谈论FIFO队列?
我一直在查看 BullMQ 的文档:
https://github.com/taskforcesh/bullmq
https://docs.bullmq.io/what-is-bullmq
我在其比较图表中注意到它不包含 RabbitMQ 或 NATS Streaming 等项目。BullMQ 似乎是一种跨一台或多台服务器处理简单“作业”的解决方案。
为什么 BullMQ 比其他消息队列实现更适合简单的“工作”?我试图了解什么时候选择一种实现比另一种实现更有意义。
message-queue ×10
java ×3
jms ×3
ibm-mq ×2
linux ×2
android ×1
architecture ×1
asynchronous ×1
bullmq ×1
c ×1
c++ ×1
database ×1
javascript ×1
node.js ×1
qt ×1
rabbitmq ×1
sysv-ipc ×1
winapi ×1