转自:http://www.oschina.net/question/23734_10632
考虑这么一个场景:用监控服务器监控某设备,设备的数量相当庞大,每隔一段时间监控服务器就会把这些设备的最新状态信息投递到消息队列中,浏览器使用ActiveMQ的Ajax技术通过订阅来感兴趣的状态信息。
问题是设备太多了,如果让浏览器接受处理所有的消息显然是不合适的,网络带宽,JavaScript的执行速度都受限。所以要有选择地接收消息。
JMS消息格式中可以加入自定义的消息头,然后通过选择器就可以过滤消息(SQL92格式),但是在Web环境下,ActiveMQ 5.4的REST连接器现在已经支持选择器了,但是Ajax连接器仍旧没有(就在两天前刚加上了一个测试的Patch,NND!)。
所以当前稳妥的做法还是:一个设备一个主题,例如“device.1”“device.2”…接下来的问题就是ActiveMQ最大能开多少主题/队列。经过测试,默认配置,一千多个主题的时候ActiveMQ就会出现“java.lang.OutOfMemoryError: unable to create new native thread”的异常,上网查找,原来ActiveMQ默认配置下单个主题/队列是在单独的线程中处理的,需要修改ActiveMQ的启动脚本,例如Windows下面的activemq.bat,找到“-Dorg.apache.activemq.UseDedicatedTaskRunner=true”,改成“false”,这样就解决问题了。另外“-Xmx512M”酌情调大些。
实测10000个队列内存占用约1G。
当然这终究不是完美的解决方案,希望ActiveMQ能快点完善Ajax的选择器,呵呵。
题外话,如果不需要消息持久化的话,把activemq.xml中的“<persistenceAdapter>…”注释掉即可。
参考:
http://activemq.apache.org/rest.html#REST-Consumingwithselectors
https://issues.apache.org/activemq/browse/AMQ-2874
http://old.nabble.com/how-many-topics-can-I-create-in-a-broker-before-getting-OutOfMemoryError%3A-Java-heap-space-td17905477.html
http://old.nabble.com/Large-number-of-queues-%28HowTo%29-td23602928.html
相关推荐
- **目的地(Destination)**:消息的目标,可以是队列或主题。 - **生产者(Producer)**:负责发送消息到目的地。 - **消费者(Consumer)**:从目的地接收消息。 #### 二、ActiveMQ的使用与优化 ##### 1. ...
在“camel-example-activemq-tomcat”项目中,Camel可能被用来创建路由规则,将消息从一个源头(如一个REST API或文件系统)传递到ActiveMQ队列,然后由消费者处理。 Spring框架是Java领域中广泛使用的应用框架,...
将Apache ActiveMQ集成到Tomcat中,可以为Web应用提供消息队列功能,从而实现异步处理、解耦以及系统间的通信。 **Apache ActiveMQ的主要特点:** 1. **高性能**:ActiveMQ具有高吞吐量和低延迟,能处理大量的并发...
临时目的地是指通过会话创建的短暂存在的队列或主题。这类目的地仅在会话期间有效,并且在会话结束后自动销毁。临时目的地适用于需要临时通信的场景,例如异步消息处理。 通过以上介绍,我们可以看到JMS及其核心...
本主题涉及到的是将必要的jar包部署到MQ环境,以便应用能够正确地与消息队列进行交互。下面将详细介绍这个过程及相关知识点。 首先,"下发队列所需要的jar包"指的是为了使应用能够连接到MQ服务并进行消息发送和接收...
ActiveMQ本身是一个开源的消息队列服务器,它实现了多种消息协议,包括AMQP、STOMP和OpenWire等。 在ActiveMQ-CPP的基础上,还有一个叫做Winkeemq-cpp的库,它对ActiveMQ-CPP进行了一些封装,简化了开发者的编程...
2. **生产者(Producer)**: 创建并发送消息到消息队列或主题的组件。 3. **消费者(Consumer)**: 从消息队列或主题接收消息的组件。 4. **消息队列(Queue)**: 按照先进先出(FIFO)原则存储消息,一个消息只能...
ActiveMQ的异步通信模型和消息队列机制有助于实现应用解耦,提高系统的可扩展性和容错性。消息的持久化特性保证了即使在系统故障后,消息也不会丢失。此外,ActiveMQ的广泛连接选项和多语言支持使得它成为跨平台集成...
6. **持久化**:ActiveMQ支持消息持久化,即使服务器重启,未被消费的消息也能被恢复,保证了消息的可靠性。 在“activemqDemo”中,我们可能会看到以下关键部分的代码实现: 1. **连接工厂(ConnectionFactory)*...
具体实现时,开发者通常会创建一个Spring配置文件,定义JMS相关的bean,如ConnectionFactory、Destination(队列或主题)以及MessageListener。然后,通过Spring的JMS模板发送消息,并注册MessageListener监听特定的...
在分布式爬虫系统中,ActiveMQ可以作为任务调度和通信的桥梁,爬虫模块可以将新的爬取任务发布到消息队列,其他节点可以从队列中消费任务,实现任务的并行处理和异步解耦。 7. **爬虫**:爬虫是系统的核心部分,...
### RabbitMQ消息队列知识点详解 #### 一、消息队列基本概念及优缺点 **1.1 什么是消息队列** 消息队列是一种应用程序间的通信方法,它允许消息发送者将消息发送到队列中,而不必知道消息将被谁消费。消息队列的...
5. 定义目的地,这里可以是队列(`ActiveMQQueue`)或主题(`ActiveMQTopic`)。在示例中,使用的是队列。 6. 创建`MessageProducer`,并设置其交付模式为非持久化,这意味着如果服务器重启,这些消息不会被保存。 7...
- **Destination**:消息的目的地,可以是队列(Queue)或主题(Topic)。 - **Message**:包含不同类型的消息,如TextMessage(文本消息)、ObjectMessage(对象消息)、BytesMessage(字节消息)、MapMessage...
- **Broker**:消息中间件,每个消息队列服务器中至少包含一个,用于承载消息队列。 - **Destination**:消息在Broker上的目标位置,可以是Queue或Topic。 - **Queue**:点对点通信模式,每个消息只被一个消费者消费...
此外,还有许多知名的消息队列产品,如RabbitMQ、Kafka、ActiveMQ、Apache Qpid等,它们都提供了丰富的功能和良好的社区支持。 消息队列具有以下主要优点: 1. **异步处理**:通过将任务放入队列,可以实现生产者...
- 生产者通过消息模板发送消息到ActiveMQ队列或主题。 - 消费者监听特定的队列或主题,当有新消息到达时,消费它们。 - 最后,将整个应用打包并部署到Tomcat服务器。 7. **运行与测试**: 在Tomcat启动后,你...
2. **消息队列(Message Queue)**:在JMS中,消息被发送到消息队列,客户端不直接与服务器交互,而是通过消息代理(如Apache ActiveMQ、RabbitMQ或IBM WebSphere MQ)进行通信。消息队列确保消息的可靠传输,即使...
5. 主题(Topic):多播模式,一个主题可以有多个订阅者,消息发布后所有订阅者都能收到。 6. 消息代理(Message Broker)或消息服务器:存储、路由和管理消息的软件,例如Apache ActiveMQ、IBM WebSphere MQ等。 ...