javascript
Spring Boot 集成 RabbitMq 实战操作(二)
本人學習新框架方法、
一、先學習框架基本知識,也就是看這本書的前三章,了解基本概念。比如這個Rabbitmq,我會先看一些概念,比如,交換機,路由器,隊列,虛擬機。
二、然后寫代碼,寫demo,有哪些不懂的地方直接再去翻書或者google找資料,帶著問題去學習,學的更快更扎實一些。
三、然后再看這個框架的應用場景,自己能否獨立的寫一些簡單的項目,來驗證自己的成果。
四、實際項目積累經驗。
RabbitMq 消息生產者向隊列發送消息 (一)
MQ分為消息生產者和消息消費者,這次做的主要是消息的生產者的講述。就是發送消息到相應的隊列上。
本文是用spring boot 來做的。
步驟1:
生成RabbitMqConfig配制文件,里面配制了隊列,連接工廠,交換機等一些信息。
package?com.basic.rabbitmq.productor.config;import?com.rabbitmq.client.Channel; import?com.rabbitmq.client.Connection; import?com.rabbitmq.client.ConnectionFactory; import?org.apache.commons.lang3.StringUtils; import?org.springframework.amqp.core.*; import?org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import?org.springframework.amqp.rabbit.core.RabbitAdmin; import?org.springframework.amqp.rabbit.core.RabbitTemplate; import?org.springframework.beans.factory.annotation.Autowired; import?org.springframework.context.annotation.Bean; import?org.springframework.context.annotation.ComponentScan; import?org.springframework.context.annotation.Configuration; import?org.springframework.context.annotation.PropertySource; import?org.springframework.core.env.Environment;import?javax.swing.event.ChangeEvent;/***?Rabbitmq配置類**?配制一些用戶名和密碼,還有就是配制隊列,交換機,還有路由健*?Created?by?sdc?on?2017/7/4.*/ @Configuration @ComponentScan(basePackages?=?{"com.basic.rabbitmq.productor"}) @PropertySource(value?=?{"classpath:application.properties"}) public?class?RabbitMqConfig?{@Autowiredprivate?Environment?env;/***?構建connectionfactory*?@return*?@throws?Exception*/@Beanpublic?ConnectionFactory?connectionFactory()?throws?Exception?{ConnectionFactory?connectionFactory?=?new?ConnectionFactory();connectionFactory.setHost(env.getProperty("spring.rabbitmq.host"));connectionFactory.setPort(Integer.valueOf(env.getProperty("spring.rabbitmq.port").trim()));connectionFactory.setVirtualHost("/");connectionFactory.setUsername(env.getProperty("spring.rabbitmq.username"));connectionFactory.setPassword(env.getProperty("spring.rabbitmq.password"));//????????connectionFactory.setPublisherReturns(true);return?connectionFactory;}/***?CachingConnectionFactory*?@return*?@throws?Exception*/@Beanpublic?CachingConnectionFactory?cachingConnectionFactory()?throws?Exception?{CachingConnectionFactory?cachingConnectionFactory?=?new?CachingConnectionFactory(connectionFactory());/**?如果要進行消息回調,則這里必須要設置為true?*/cachingConnectionFactory.setPublisherConfirms(true);?//?必須要設置return?cachingConnectionFactory;}/***?RabbitTemplate,類似于jdbctemplate一樣的工具類*?@return*?@throws?Exception*/@Beanpublic?RabbitTemplate?rabbitTemplate()?throws??Exception?{RabbitTemplate?rabbitTemplate?=?new?RabbitTemplate(cachingConnectionFactory()); //????????rabbitTemplate.setChannelTransacted(true);//這個設置參數 //????????rabbitTemplate.setMandatory(true);//????????rabbitTemplate.setConfirmCallback(new?RabbitTemplate.ConfirmCallback()); //????????rabbitTemplate.setReturnCallback(new?RabbitTemplate.ReturnCallback());return?rabbitTemplate;}@Beanpublic?AmqpAdmin?amqpAdmin()?throws??Exception?{return?new?RabbitAdmin(cachingConnectionFactory());}/***?通道處理*?@return*?@throws?Exception*/@Beanpublic?Channel?channel()?throws?Exception?{//隊列名字String?name?=?env.getProperty("emial.server.queue").trim();//?是否持久化boolean?durable?=?StringUtils.isNotBlank(env.getProperty("emial.server.queue.durable").trim())?Boolean.valueOf(env.getProperty("emial.server.queue.durable").trim())?:?true;//?僅創建者可以使用的私有隊列,斷開后自動刪除boolean?exclusive?=?StringUtils.isNotBlank(env.getProperty("emial.server.queue.exclusive").trim())?Boolean.valueOf(env.getProperty("emial.server.queue.exclusive").trim())?:?false;//?當所有消費客戶端連接斷開后,是否自動刪除隊列boolean?autoDelete?=?StringUtils.isNotBlank(env.getProperty("emial.server.queue.autoDelete").trim())?Boolean.valueOf(env.getProperty("emial.server.queue.autoDelete").trim())?:?false;ConnectionFactory?connectionFactory?=?connectionFactory();Connection?connection?=?connectionFactory.newConnection();Channel?channes?=?connection.createChannel();channes.queueDeclare(name,?durable,?exclusive,?autoDelete,?null);return?channes;}/***?隊列*?@return*/@Beanpublic?Queue?queue()?throws??Exception{//隊列名字String?name?=?env.getProperty("emial.server.queue").trim();//?是否持久化boolean?durable?=?StringUtils.isNotBlank(env.getProperty("emial.server.queue.durable").trim())?Boolean.valueOf(env.getProperty("emial.server.queue.durable").trim())?:?true;//?僅創建者可以使用的私有隊列,斷開后自動刪除boolean?exclusive?=?StringUtils.isNotBlank(env.getProperty("emial.server.queue.exclusive").trim())?Boolean.valueOf(env.getProperty("emial.server.queue.exclusive").trim())?:?false;//?當所有消費客戶端連接斷開后,是否自動刪除隊列boolean?autoDelete?=?StringUtils.isNotBlank(env.getProperty("emial.server.queue.autoDelete").trim())?Boolean.valueOf(env.getProperty("emial.server.queue.autoDelete").trim())?:?false;return?new?Queue(name,?durable,?exclusive,?autoDelete);}/***?配制交換機,交換機類型為topic*?@return*/@Beanpublic?TopicExchange?exchange?()?{//交換機的名字String?name?=?env.getProperty("emial.server.exchange");//?是否持久化boolean?durable?=?StringUtils.isNotBlank(env.getProperty("emial.server.exchange.durable").trim())?Boolean.valueOf(env.getProperty("emial.server.exchange.durable").trim())?:?true;//?當所有消費客戶端連接斷開后,是否自動刪除隊列boolean?autoDelete?=?StringUtils.isNotBlank(env.getProperty("emial.server.exchange.autoDelete").trim())?Boolean.valueOf(env.getProperty("emial.server.exchange.autoDelete").trim())?:?false;//創建交換機return?new?TopicExchange(name,?durable,?autoDelete);}/***?綁定,交換機要綁定要隊列上,交換機才能把消息放入到相應的隊列上。*?@return*/@Beanpublic?Binding?binding()?throws??Exception{String?routekey?=?env.getProperty("emial.server.routekey").trim();return?BindingBuilder.bind(queue()).to(exchange()).with(routekey);}}步驟二配置文件:
application.properties
#指定具體使用哪種配置環境,此處指定使用application-prod.properties配置文件中的環境
spring.profiles.active=dev
application-dev.properties
#spring.application.name=spring-boot-rabbitmqspring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
emial.server.exchange=email_exchange
emial.server.exchange.durable=true
emial.server.exchange.autoDelete=false
emial.server.queue=email_queue
emial.server.queue.durable=true
emial.server.queue.exclusive=false
emial.server.queue.autoDelete=false
emial.server.routekey=email_route_key
emial.server.exchange.bindingkey=email_route_key
具體接口EmailService服務:
package?com.basic.rabbitmq.productor.service;/***?郵件服務*?Created?by?sdc?on?2017/7/5.*/ public?interface?EmailService?{/***?發送郵件任務存入消息隊列*?@param?message*?@throws?Exception*/public?void?sendEmailForQueue(String?message)?throws?Exception;}package?com.basic.rabbitmq.productor.service.impl;import?com.basic.rabbitmq.productor.model.SendMessage; import?com.basic.rabbitmq.productor.service.EmailService; import?com.basic.rabbitmq.productor.util.MessageSender; import?org.apache.commons.lang3.exception.ExceptionUtils; import?org.slf4j.Logger; import?org.slf4j.LoggerFactory; import?org.springframework.amqp.rabbit.core.RabbitTemplate; import?org.springframework.beans.factory.annotation.Value; import?org.springframework.stereotype.Service;import?javax.annotation.Resource;/***?郵件服務*?Created?by?sdc?on?2017/7/5.*/ @Service("emailService") public?class?EmailServiceImpl?implements?EmailService?{private?static?Logger?logger?=?LoggerFactory.getLogger(EmailServiceImpl.class);//????@Resource(?name?=?"rabbitTemplate"?) //????private?RabbitTemplate?rabbitTemplate;@Value("${emial.server.exchange}")private?String?exchange;@Value("${emial.server.routekey}")private?String?routeKey;@Resource(name?=?"messageSender")private?MessageSender?messageSender;@Overridepublic?void?sendEmailForQueue(String?message)?throws?Exception?{try?{ //????????????rabbitTemplate.convertAndSend(exchange,?routeKey,?message);messageSender.handlerMessage(message);}catch?(Exception?e){ //????????????logger.error("EmailServiceImpl.sendEmail",?ExceptionUtils.getMessage(e));e.printStackTrace();}}}Controller層,寫一個接口,往Rabbitmq上發送消息。
package?com.basic.rabbitmq.productor.controller;import?com.basic.rabbitmq.productor.constant.WebStatusEnum; import?com.basic.rabbitmq.productor.model.ResponseVo; import?com.basic.rabbitmq.productor.service.EmailService; import?org.springframework.stereotype.Controller; import?org.springframework.ui.Model; import?org.springframework.web.bind.annotation.RequestMapping; import?org.springframework.web.bind.annotation.RequestMethod; import?org.springframework.web.bind.annotation.RestController; import?org.springframework.web.servlet.ModelAndView;import?javax.annotation.Resource;/***?接口測試類**?Created?by?sdc?on?2017/7/5.*/ @RestController @RequestMapping(value?=?"/email") public?class?EmailController?extends?BaseController{@Resource(name?=?"emailService")private?EmailService?emailService;/***?發供郵件服務*?@return*?@throws?Exception*/@RequestMapping(value="/sendEmail",?method?=?RequestMethod.GET)public?ResponseVo<?>?sendEmail()?throws?Exception?{String?emailMessage?=?"郵件消息";emailService.sendEmailForQueue(emailMessage);return?generateResponseVo(WebStatusEnum.SUCCESS,?"");}}EmailController的父類,抽出來,用于別的controller類集成。
package?com.basic.rabbitmq.productor.controller;import?com.basic.rabbitmq.productor.constant.WebStatusEnum; import?com.basic.rabbitmq.productor.model.ResponseVo;import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpSession;/***?提取出來一個類,用來作為controller層的父類,統一的返回格式。**?Created?by?sdc?on?2017/7/6.*/ public?class?BaseController?{/***?生成統一的返回響應對象**?@param?webStatusEnum?狀態碼枚舉*?@param?data?數據對象*?@param?<T>?數據對象類型參數*?@return*/public?<T>?ResponseVo?generateResponseVo(WebStatusEnum?webStatusEnum,?T?data)?{return?new?ResponseVo(webStatusEnum.getCode(),?webStatusEnum.getDesc(),?data);}/***?獲取當前會話**?@param?request?請求*?@return?httpSession*/public?HttpSession?getCurrentSession(HttpServletRequest?request)?{return?request.getSession();}}常量類,用于返回給頁面展示的公共類:
package?com.basic.rabbitmq.productor.model;import?java.io.Serializable;/***?定義統一的返回格式,用于和前端一起溝通**?Created?by?sdc?on?2017/7/7.*/ public?class?ResponseVo<T>?implements?Serializable?{private?static?final?long?serialVersionUID?=?1L;/***?狀態碼*/private?String?code;/***?狀態碼對應的信息*/private?String?message;/***?數據對象*/private?T?data;public?ResponseVo(String?code,?String?message,?T?data)?{super();this.code?=?code;this.message?=?message;this.data?=?data;}public?String?getCode()?{return?code;}public?void?setCode(String?code)?{this.code?=?code;}public?String?getMessage()?{return?message;}public?void?setMessage(String?message)?{this.message?=?message;}public?T?getData()?{return?data;}public?void?setData(T?data)?{this.data?=?data;} }package?com.basic.rabbitmq.productor.constant;/***?Created?by?sdc?on?2017/7/7.*/ public?enum?WebStatusEnum?{/***?定義接口返回狀態碼**?通用部分范圍?5000?+*?業務使用范圍?2000?至?4000*/SUCCESS("5000",?"成功"),FAILED("7000",?"失敗"),PARAM_ERROR("7001",?"參數錯誤"),PARAM_NOT_NULL("7002",?"參數不能為空");/***?系統碼*/private?String?code;/***?描述*/private?String?desc;WebStatusEnum(String?code,?String?desc)?{this.code?=?code;this.desc?=?desc;}public?static?WebStatusEnum?getWebStatusEnumByKey(String?key){for(WebStatusEnum?bt?:?values()){if(bt.getCode().equals(key)?)return?bt;}return?null;}public?String?getDesc()?{return?desc;}public?void?setDesc(String?desc)?{this.desc?=?desc;}public?String?getCode()?{return?code;}public?void?setCode(String?code)?{this.code?=?code;} }最后pom.xml文件,用于下載jar包的。
<?xml?version="1.0"?encoding="UTF-8"?> <project?xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>email-server</artifactId><groupId>com.basic.email</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>email-server-productor</artifactId><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><fastjson.version>1.2.6</fastjson.version><commons-lang3.version>3.4</commons-lang3.version><guava.version>18.0</guava.version><javax.mail.version>1.4.7</javax.mail.version><log4j.version>1.2.17</log4j.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>${guava.version}</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>${commons-lang3.version}</version></dependency><dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>${javax.mail.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.4</version></dependency><!--?log?--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version></dependency></dependencies><build><finalName>basic-model</finalName><plugins><!--?編譯插件?--><!--編譯插件設置--><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><skip>true</skip><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>項目啟動成功后,輸入http://localhost:8080/email/sendEmail,
這個接口,每當成功一次就會在rabbitmq的管理頁面上,看見隊列里多一條信息。
最后就是成功了,用到的一些概念請自己查找,記憶會深刻些。
轉載于:https://blog.51cto.com/shangdc/1945756
總結
以上是生活随笔為你收集整理的Spring Boot 集成 RabbitMq 实战操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10年程序员总结的20几条经验教训
- 下一篇: Apache Ant自动化脚本