A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 谷粒姐姐 于 2019-2-14 15:22 编辑

1.3 页面发布生产方
1.3.1 需求分析
管理员通过 cms系统发布“页面发布”的消费,cms系统作为页面发布的生产方。
需求如下:
1、管理员进入管理界面点击“页面发布”,前端请求cms页面发布接口。 2、cms页面发布接口执行页面静态化,并将静态化页面存储至GridFS中。
3、静态化成功后,向消息队列发送页面发布的消息。 1) 获取页面的信息及页面所属站点ID。 2) 设置消息内容为页面ID。(采用json格式,方便日后扩展)
3) 发送消息给ex_cms_postpage交换机,并将站点ID作为routingKey。   1.3.2 RabbitMQ配置
1、配置Rabbitmq的连接参数
在application.yml添加如下配置:
[AppleScript] 纯文本查看 复制代码
[mw_shl_code=applescript,true]spring:  
rabbitmq:     
host: 127.0.0.1     
port: 5672    
username: guest     
password: guest     
virtualHost: /
[/mw_shl_code]
2、在pom.xml添加依赖
[AppleScript] 纯文本查看 复制代码
[mw_shl_code=applescript,true]<dependency> 
    <groupId>org.springframework.boot</groupId>   
  <artifactId>spring‐boot‐starter‐amqp</artifactId>
</dependency>
[/mw_shl_code]
3、RabbitMQConfig配置
由于cms作为页面发布方要面对很多不同站点的服务器,面对很多页面发布队列,所以这里不再配置队列,只需要 配置交换机即可。
在cms工程只配置交换机名称即可。
[AppleScript] 纯文本查看 复制代码
[mw_shl_code=applescript,true]package com.xuecheng.manage_cms.config;  
import org.springframework.amqp.core.*; 
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
package com.xuecheng.manage_cms_client.config; 
  import org.springframework.amqp.core.*; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;   
  @Configuration public class RabbitmqConfig {  
   //交换机的名称 
   public static final String EX_ROUTING_CMS_POSTPAGE="ex_routing_cms_postpage";  
   /**  
    * 交换机配置使用direct类型  
    * @return the exchange    
  */    
@Bean(EX_ROUTING_CMS_POSTPAGE)  
   public Exchange EXCHANGE_TOPICS_INFORM() {  
       return ExchangeBuilder.directExchange(EX_ROUTING_CMS_POSTPAGE).durable(true).build(); 
    } }
[/mw_shl_code]
1.3.3 Api接口
在api工程定义页面发布接口:
[AppleScript] 纯文本查看 复制代码
[mw_shl_code=applescript,true]@ApiOperation("发布页面")
public ResponseResult post(String pageId);
[/mw_shl_code]
1.3.4 PageService
在PageService中定义页面发布方法,代码如下:
[AppleScript] 纯文本查看 复制代码
[mw_shl_code=applescript,true]//页面发布
public ResponseResult postPage(String pageId){   
  //执行静态化 
    String pageHtml = this.getPageHtml(pageId);  
   if(StringUtils.isEmpty(pageHtml)){ 
        ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_HTMLISNULL);  
   }    
//保存静态化文件   
  CmsPage cmsPage = saveHtml(pageId, pageHtml);   
  //发送消息   
  sendPostPage(pageId);  
   return new ResponseResult(CommonCode.SUCCESS);
} //发送页面发布消息 private void sendPostPage(String pageId){

[AppleScript] 纯文本查看 复制代码
CmsPage cmsPage = this.getById(pageId);  
   if(cmsPage == null){      
  ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS); 
   }  
   Map<String,String> msgMap = new HashMap<>();  
   msgMap.put("pageId",pageId);
     //消息内容     String msg = JSON.toJSONString(msgMap);  
   //获取站点id作为routingKey  
   String siteId = cmsPage.getSiteId();  
   //发布消息  
   this.rabbitTemplate.convertAndSend(RabbitmqConfig.EX_ROUTING_CMS_POSTPAGE,siteId, msg); } //保存静态页面内容 private CmsPage saveHtml(String pageId,String content){  
   //查询页面    
Optional<CmsPage> optional = cmsPageRepository.findById(pageId);   
  if(!optional.isPresent()){   
     ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS); 
    }   
CmsPage cmsPage = optional.get();   
  //存储之前先删除  
  String htmlFileId = cmsPage.getHtmlFileId();  
   if(StringUtils.isNotEmpty(htmlFileId)){    
     gridFsTemplate.delete(Query.query(Criteria.where("_id").is(htmlFileId)));   
  }    
//保存html文件到GridFS  
   InputStream inputStream = IOUtils.toInputStream(content); 
   ObjectId objectId = gridFsTemplate.store(inputStream, cmsPage.getPageName());   
  //文件id     String fileId = objectId.toString();   
  //将文件id存储到cmspage中   
  cmsPage.setHtmlFileId(fileId);   
  cmsPageRepository.save(cmsPage);  
   return cmsPage;   }
[/mw_shl_code]
1.3.5 CmsPageController
编写Controller实现api接口,接收页面请求,调用service执行页面发布。
[AppleScript] 纯文本查看 复制代码
[mw_shl_code=applescript,true]@Override
@PostMapping("/postPage/{pageId}") public ResponseResult post(@PathVariable("pageId") String pageId) 
{  
   return pageService.postPage(pageId); }
[/mw_shl_code]

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马