activemq 性能 1
来源:互联网 发布:乌克兰胖爸 知乎 编辑:程序博客网 时间:2024/05/18 00:08
1. 使用spring的JmsTemplate
JmsTemplate的send和convertAndSend会使用持久化mode,即使你设置了NON_PERSISTENT。这会导致入队列速度变得非常慢。
解决办法,使用下面的MyJmsTemplate代替JmsTemplate。
public class MyJmsTemplate extends JmsTemplate {private Session session;public MyJmsTemplate() {super();}public MyJmsTemplate(ConnectionFactory connectionFactory) {super(connectionFactory);}public void doSend(MessageProducer producer, Message message) throws JMSException {if (isExplicitQosEnabled()) {producer.send(message, getDeliveryMode(), getPriority(), getTimeToLive());} else {producer.send(message);}}public Session getSession() {return session;}public void setSession(Session session) {this.session = session;}}
2. DeliveryMode的选择,如果你入队列的数据,不考虑MQ挂掉的情况(这概率很小),使用NON_PERSISTENT会显著提高数据写入速度。
3. 生产者使用事物会提高入队列性能,但是消费者如果启动了事物则会显著影响数据的消费速度。相关代码如下:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
代码中的false代表不启动事物。
4. 消费者的消息处理即onMessage方法优化,举例如下:
public class SmsMoPool implements MessageListener {private final static Logger logger = LoggerFactory.getLogger(SmsMoPool.class);private DefaultEventPubliser moEventPublisher;private final EventFactory eventFactory = new DefaultEventFactory();private DefaultDataGather dataGather;private ExecutorService pool = Executors.newFixedThreadPool(5);@Overridepublic void onMessage(final Message message) {pool.execute(new Runnable() {@Overridepublic void run() {final ObjectMessage msg = (ObjectMessage) message;Serializable obj = null;try {obj = msg.getObject();} catch (JMSException e) {logger.error("从消息队列获得上行信息异常{}", e);}if (obj != null) {dataGather.incrementDateCount(MasEntityConstants.TRAFFIC_SMS_MO_IN);AgentToServerReq req = (AgentToServerReq) obj;if (logger.isInfoEnabled()) {logger.info("驱动-->调度:{}", req.toXmlStr());}Event event = eventFactory.createMoEvent(req);moEventPublisher.publishEvent(event);}}});}}
这段代码使用了线程池,另一点要注意的是msg.getObject();这个方法是一个比较耗时的方法,你的代码中不应该出现多次getObject()。
5. 消费者使用预取,如何使用预取,下面以spring版本为例
<bean class="org.apache.activemq.command.ActiveMQQueue"> <constructor-arg value="data.mo?consumer.prefetchSize=100"/> </bean>
预取数量根据具体入队列数据而定,以上设置100,是针对2000/sec入队列速度设定的。 另外如果是慢消费者,这里可设置为1。
6. 检查你的MQ数据吞吐速度,保持生产和消费的平衡,不会出现大量积压。
0 0
- activemq 性能 1
- ActiveMQ性能
- 优化ActiveMQ性能
- ActiveMQ性能调优
- ActiveMq性能优化
- ActiveMQ性能测试
- 优化ActiveMQ性能
- 优化ActiveMQ性能
- ActiveMQ性能调优
- activemq性能优化
- ActiveMq性能优化
- ActiveMQ性能调优
- ActiveMQ性能优化
- ActiveMq的性能优化
- ActiveMQ性能测试
- 优化ActiveMQ性能
- ActiveMQ系列—ActiveMQ性能优化(中1)(处理规则和优化)
- ActiveMQ系列—ActiveMQ性能优化(下1)(消息存储方案 KahaDB)
- 区间覆盖问题
- 问题分析报告--简单SQL启动MR
- HDU-2066-一个人的旅行
- 457. Circular Array Loop
- php组合模式
- activemq 性能 1
- (一)Cocos2d-x学习之文件操作
- text-overflow:ellipsis的巧妙运用
- IO监控 poll
- boost bind的使用方法
- Java 黑白棋盘
- 问题分析报告--DBService备份问题
- Eclipse 开发 Python
- 【UVA 11584】【简单dp】Partitioning by Palindromes【给定一个字符串, 问最少分为几部分可使各部分均为回文串】