考虑这么一个场景:用监控服务器监控某设备,设备的数量相当庞大,每隔一段时间监控服务器就会把这些设备的最新状态信息投递到消息队列中,浏览器使用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
- 浏览: 318640 次
-
文章分类
- 全部博客 (308)
- Apple (1)
- MAC (6)
- iPhone (1)
- iOS (1)
- Adobe (3)
- Microsoft (23)
- Windows (12)
- WAP (2)
- CMPP (6)
- Eclipse (5)
- .NET (13)
- Router (3)
- ADO.NET (2)
- C# (11)
- WPF (3)
- SqlServer (4)
- Facebook (2)
- JDBC (1)
- Visual Studio (10)
- ActiveMQ (9)
- Java (112)
- Memcached (2)
- NoSQL (7)
- Hadoop (9)
- GlassFish (2)
- Linux (98)
- CentOS (58)
- Spring (10)
- Oracle (17)
- JBOSS (12)
- Webservice (4)
- EJB (7)
- DFS (1)
- Hibernate (9)
- Redis (3)
- Tomcat (5)
- Python (8)
- FastDFS (6)
- Nginx (6)
- RabbitMQ (0)
- Erlang (0)
- Lucene (8)
- Solr (7)
- MySQL (1)
- JavaScript (0)
最新评论
-
zhangy888:
你好,我正好也遇到了这个问题,按照您的设置有如下几个问题,请帮 ...
CXF SOAP 1.2 SOAP 1.1 问题 -
u011493586:
这个SUBMIT写的还不错,只是有的地方没看懂
CMPP发送超长短信息(JAVA版) -
u011493586:
...
CMPP发送超长短信息(JAVA版)
发表评论
-
遍历Map的四种方法
2015-01-28 11:14 443public static void main(Stri ... -
使用Perf4J进行性能分析和监控
2015-01-13 11:39 689许多开发人员都很熟悉墨菲法则的一个例子:他们发现在花费了大量 ... -
Nexus创建本地Maven仓库
2014-09-22 10:58 13700.安装环境 windows 7 x86-64 jdk1 ... -
HBase vs Cassandra: 我们迁移系统的原因
2014-09-03 21:13 728原文: http://ria101.wordp ... -
开源日志系统比较
2014-09-03 21:11 493作者:Dong | 新浪微博:西成懂 | 可以转载, 但必须 ... -
tokyotyrant-java客户端
2014-07-25 09:48 782目录: 概述 演示 [一]、概述 java实现了 ... -
IntelliJ IDEA 13试用手记(附详细截图)
2014-06-30 16:04 516从去年开始转java以来,一直在寻找一款趁手的兵器,ecl ... -
Heritrix使用的初步总结
2014-06-14 16:45 495一、框架介绍 公司最近项目要用到全文检索,检索对象是 ... -
利用 Heritrix 构建特定站点爬虫
2014-06-14 15:19 492本文由浅入深,详细介 ... -
Errors running builder 'DeploymentBuilder' on project
2014-06-09 14:20 6511.修改java源代码后点击保存,IDE 自动编译并热部署, ... -
开源中间件大舞台
2014-05-22 09:27 667全文主要内容:一、中间件是什么?二、中间件的主要作用三、中间 ... -
log4j使用DailyRollingFileAppender
2014-05-20 15:30 655DailyRollingFileAppender是 ... -
JVM系列四:生产环境参数实例及分析
2014-05-18 11:04 401java application项目(非web项目) ... -
solr中如何定义自己的解析器插件(QParserPlugin)
2014-05-15 13:39 1284/***************************** ... -
Lucene 基础理论
2014-05-15 11:43 7731. 全文检索系统与Lucene简介 1.1 什么是全 ... -
Lucene 4.0升级指南
2014-05-15 11:33 1213Apache Lucene Migration Guide ... -
Lucene的分析过程
2014-05-13 15:18 760回顾倒排索引的构建 收集待建索引的原文档(Do ... -
Lucene中文分析器的中文分词准确性和性能比较
2014-05-13 15:17 576对几种中文分析器,从分词准确性和效率两方面进行比较。分析器 ... -
CharTokenizer对西文字符进行分词处理
2014-05-12 22:00 531CharTokenizer是一个抽象类,它主要是对西文字符进 ... -
LUCENE3.0 自学吧 7 CharTokenizer
2014-05-12 21:58 499CharTokenizer 是一个抽象类,它主要是对 ...
相关推荐
10. **内嵌 JMS 提供者**:对于测试和开发,ActiveMQ 提供了易于使用的内嵌 JMS 提供者。 **JMS 知识点** Java Message Service (JMS) 是 Java 平台上的标准接口,它定义了消息生产者和消费者之间的通信规范,用于...
- 生产者通过消息模板发送消息到ActiveMQ队列或主题。 - 消费者监听特定的队列或主题,当有新消息到达时,消费它们。 - 最后,将整个应用打包并部署到Tomcat服务器。 7. **运行与测试**: 在Tomcat启动后,你...
6. **消息队列**:为了优化性能,大型聊天系统可能会引入消息队列(如RabbitMQ或ActiveMQ),它可以帮助系统解耦,避免因大量并发请求导致的性能瓶颈。消息队列负责在客户端和服务器之间异步传输消息。 7. **安全性...
8. **消息队列**:对于高并发场景,如新帖发布后的通知,可以借助消息队列(如ActiveMQ或RabbitMQ)异步处理,避免阻塞主线程,提升系统的响应能力。 9. **测试与部署**:在开发过程中,JUnit 和 Mockito 可用于...
6. **消息队列**:如RabbitMQ或ActiveMQ,处理异步任务,优化系统响应速度。 五、开发过程 1. **需求分析**:明确系统功能需求,收集并整理业务流程。 2. **设计阶段**:制定系统架构,设计数据库模型,编写接口...