Chinaunix首页 | 论坛 | 博客
  • 博客访问: 140862
  • 博文数量: 33
  • 博客积分: 2520
  • 博客等级: 少校
  • 技术积分: 365
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-10 09:26
文章分类

全部博文(33)

文章存档

2011年(1)

2010年(6)

2009年(26)

我的朋友

分类:

2010-04-10 14:14:01

  JmsTemplate最早是专为 使用基于EJB容器的JMS连接池 设计的。每个方法都将创建 connection, session, producer or consumer,然后关闭连接;它工作在(under the covers-原文)j2ee的EJB容器下时,使用JMS连接池,自然是没什么问题。但是如果没有使用JMS provider连接池,创建并销毁连接,会给性能带来很大的影响。
  所以,在没有EJB的环境下,应该使用activeMQ提供的PooledConnectionFactory。
  第二、很多人在SessionCallBack方法中创建MessageConsumer,然后想不明白为什么总是会丢失消息!当SessionCallBack方法被调用时,session就已经关闭了,当然,该session创建的consumer也同样会被关闭。所以,如果要在SessionCallBack方法中使用consumer,那么应该再重新创建connect , session , consumer。
  第三、使用JmsTemplate.receice()方法;如上所述,如果不是使用一个在j2ee容器的ConnectionFactory中的EJB时,con,session等会反复不断地创建销毁。即使不考虑性能的问题,在没有pool的情况下,也会丢失消息:如果消息是以NON_PERSISTENCE发送的,一个新的con,session,consumer不会去接收该con创建之前的消息。所以,最好是使用Spring的MessageListenerContainer,它可高效地接收消息!
  
使用JmsTemplate的几点建议:
  1:不要使用一个普通的ConnectFactory,除非确信所有的jms对象都被缓存。
  2:如果使用EJB,确信它工作在EJB的容器的ConnectFactory下。
  3:如果你只是生产消息,并且没使用EJB,而且使用ActiveMQ provider,那么应该使用ActiveMQ的PoolConnectFactory,或者Spring的CachingConnectFactory。
  4:如要你只是消费消息,那么使用Spring的MessageListernerContainer比receive方法有更高的性能,更易使用,更不容易丢失消息。

------create by beyondzsq.cublog.cn @ 2010-04-10
更完整的描述请看原文:
如与原文有出入的地方,或者哪里有误,还请指出。谢谢
阅读(3644) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~