您的位置:首页 > 其它

ActiveMq性能优化

2013-03-07 15:00 323 查看
ActiveMq运行是比较稳定的,数据的吞吐速度也很高,如果出现入队列或者出队列慢的问题,先检查一下自己的代码,是不是本身取到数据后处理过慢。

本文的关于性能优化,其实是列举出一些需要注意的点,请确保你的项目没有一下问题:

1. 使用spring的JmsTemplate

JmsTemplate的send和convertAndSend会使用持久化mode,即使你设置了NON_PERSISTENT。这会导致入队列速度变得非常慢。
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);

@Override
public void onMessage(final Message message) {
pool.execute(new Runnable() {
@Override
public 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. 检查你的MQ数据吞吐速度,保持生产和消费的平衡,不会出现大量积压。

6.
ActiveMQ使用TCP协议时 tcpNoDelay=默认是false ,设置为true可以提高性能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: