日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot 集成 RabbitMq 实战操作(二)

發(fā)布時間:2025/7/14 javascript 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring Boot 集成 RabbitMq 实战操作(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


本人學習新框架方法、

一、先學習框架基本知識,也就是看這本書的前三章,了解基本概念。比如這個Rabbitmq,我會先看一些概念,比如,交換機,路由器,隊列,虛擬機。

二、然后寫代碼,寫demo,有哪些不懂的地方直接再去翻書或者google找資料,帶著問題去學習,學的更快更扎實一些。

三、然后再看這個框架的應用場景,自己能否獨立的寫一些簡單的項目,來驗證自己的成果。

四、實際項目積累經驗。


RabbitMq 消息生產者向隊列發(fā)送消息 (一)

MQ分為消息生產者和消息消費者,這次做的主要是消息的生產者的講述。就是發(fā)送消息到相應的隊列上


本文是用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);//這個設置參數(shù) //????????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;//?僅創(chuàng)建者可以使用的私有隊列,斷開后自動刪除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;//?僅創(chuàng)建者可以使用的私有隊列,斷開后自動刪除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;//創(chuàng)建交換機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


#指定具體使用哪種配置環(huán)境,此處指定使用application-prod.properties配置文件中的環(huán)境
spring.profiles.active=dev


application-dev.properties

#spring.application.name=spring-boot-rabbitmq
spring.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?{/***?發(fā)送郵件任務存入消息隊列*?@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上發(fā)送消息。

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;/***?發(fā)供郵件服務*?@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層的父類,統(tǒng)一的返回格式。**?Created?by?sdc?on?2017/7/6.*/ public?class?BaseController?{/***?生成統(tǒng)一的返回響應對象**?@param?webStatusEnum?狀態(tài)碼枚舉*?@param?data?數(shù)據對象*?@param?<T>?數(shù)據對象類型參數(shù)*?@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;/***?定義統(tǒng)一的返回格式,用于和前端一起溝通**?Created?by?sdc?on?2017/7/7.*/ public?class?ResponseVo<T>?implements?Serializable?{private?static?final?long?serialVersionUID?=?1L;/***?狀態(tài)碼*/private?String?code;/***?狀態(tài)碼對應的信息*/private?String?message;/***?數(shù)據對象*/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?{/***?定義接口返回狀態(tài)碼**?通用部分范圍?5000?+*?業(yè)務使用范圍?2000?至?4000*/SUCCESS("5000",?"成功"),FAILED("7000",?"失敗"),PARAM_ERROR("7001",?"參數(shù)錯誤"),PARAM_NOT_NULL("7002",?"參數(shù)不能為空");/***?系統(tǒng)碼*/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 实战操作(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。