引子
工作中有用到activitymq作为消息中间件来发微信通知,不过环境都是配好了的,只是按着那个流程使用,自己也有看一些资料,不过还是不能很好的理解avtivityMQ的使用和原理,所以用业余时间来一遍,顺便全面的学习一遍avtivityMQ,和工作上用的版本一样都是activityMQ5.10.0。
这里将不再列出详细的配置文件信息,springmvc环境是在我写的另一篇博文的基础上搭建的springmvc环境搭建
准备工作
既然是使用的apache的activeMQ作为JMS的实现,那么首先我们应该到apache官网上下载activeMQ(http://activemq.apache.org/download.html),进行解压后运行其bin目录下面的win23或者win64(具体看自己的系统是多少位的)里的activemq.bat文件启动activeMQ。详情参照ActiveMQ—Windows操作系统中如何安装启动ActiveMQ
spring配置文件
spring-beans.xml中的配置
<!-- 配置一下常量到prop.properties,方便修改 -->
<context:property-placeholder location="classpath:prop.properties"/>
<jms:listener-container connection-factory="mqConnectionFactory">
<jms:listener destination="${activemq.demoYueEventQueueName}" ref="yueEventListener" />
</jms:listener-container>
prop.properties中的配置
# activemq
activemq.brokerURL=tcp://localhost:61616
activemq.sessionCacheSize=10
activemq.useAsyncSend=true
activemq.defaultDestinationName=Tm
activemq.default.pubSubDomain=false
activemq.mongoDBQueueName=TmMongoDB
activemq.mongoDBQueueName.pubSubDomain=false
activemq.eventQueueName=Event
activemq.demoYueEventQueueName=DemoYueEvent
activemq.event.pubSubDomain=false
java代码
控制器代码
@RequestMapping("/testMethod")
public String test(HttpSession session, HttpServletRequest req) {
String message = "TestAction需要传送一条消息";
System.out.println(message);
//getBean方法:使用applicationContext获取相应对象
SpringContextUtil.getBean(EventManager.class).createMessage(message);
return null;
}
生产者代码
public class EventManagerImpl implements EventManager {
@Value("${activemq.demoYueEventQueueName}")
public String demoYueEventQueueName;
@Autowired
JmsTemplate mongoDBJmsTemplate;
/**
* 创建并向队列里添加事件
* @param yueEvent
*/
@Override
public void createMessage(final String message){
MessageCreator messageCreator = new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
MapMessage msg = session.createMapMessage();
String createMessage = "我是生成者,创建消息"+message;
System.out.println(createMessage);
msg.setString("createMessage", createMessage);
return msg;
}
};
mongoDBJmsTemplate.send(demoYueEventQueueName, messageCreator);
}
}
消费者代码
@Service
public class YueEventListener implements SessionAwareMessageListener<MapMessage> {
@Value("${activemq.demoYueEventQueueName}")
public String demoYueEventQueueName;
@Override
public void onMessage(MapMessage message, Session session) throws JMSException {
String createMessage = message.getString("createMessage");
System.out.println("收到消息——"+createMessage);
}
}
JmsTemplate的构建代码,这里采用的是spring的@Configuration @Bean注解方法,来构建并且注入到spring容器中。
@Configuration
public class SpringActiveMQConfig {
Logger log = org.slf4j.LoggerFactory.getLogger(getClass());
@Value("${activemq.brokerURL}")
private String brokerURL;//url
@Value("${activemq.sessionCacheSize}")
private int sessionCacheSize;//连接数
@Value("${activemq.mongoDBQueueName}")
private String mongoDBQueueName;
@Value("${activemq.mongoDBQueueName.pubSubDomain}")
private boolean mongoDBQueueName_pubSubDomain;
private boolean useAsyncSend = true;//采用异步方式,性能更快
public @Bean
ActiveMQConnectionFactory activeMQConnectionFactory() throws Exception {
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory();
activeMQConnectionFactory.setBrokerURL(brokerURL);
activeMQConnectionFactory.setUseAsyncSend(useAsyncSend);
return activeMQConnectionFactory;
}
public @Bean
CachingConnectionFactory mqConnectionFactory() throws Exception {
log.info("creating bean mqConnectionFactory");
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(activeMQConnectionFactory());
connectionFactory.setSessionCacheSize(sessionCacheSize);
return connectionFactory;
}
public @Bean
JmsTemplate mongoDBJmsTemplate() throws Exception {
JmsTemplate jmsTemplate = new JmsTemplate(mqConnectionFactory());
jmsTemplate.setDefaultDestinationName(mongoDBQueueName);
jmsTemplate.setPubSubDomain(mongoDBQueueName_pubSubDomain);
return jmsTemplate;
}
}
运行测试结果
小结
这里我只是展示了一个简单的activityMQ环境代价的流程。跟多的知识还需要深入的去学习。
推荐两篇博文:
JMS简介与ActiveMQ实战
ActiveMQ基本介绍