一.课程计划
1 | 1、Activemq整合springMQ的应用场景 |
二.Activemq整合spring
2.1 使用方法
第一步:引用相关的jar包。1 | <dependency> |
第二步:配置Activemq整合spring。配置ConnectionFactory
1 | <?xml version="1.0" encoding="UTF-8"?> |
使用JMSTemplate对象。发送消息。
第四步:在spring容器中配置Destination。
1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | package yp.e3mall.activemq; |
2.2 代码测试
2.2.1 发送消息
第一步:初始化一个spring容器
第二步:从容器中获得JMSTemplate对象。
第三步:从容器中获得一个Destination对象
第四步:使用JMSTemplate对象发送消息,需要知道Destination
1 | /** |
2.2.2 接收消息
e3-search-Service中接收消息。第一步:把Activemq相关的jar包添加到工程中
第二步:创建一个MessageListener的实现类。
1 | /** |
1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | /** |
三.添加商品同步索引库
3.1 Consumer(我们先来写接受者代码)
3.1.1 功能分析
- 接收消息。需要创建MessageListener接口的实现类。
- 取消息,取商品id。
- 根据商品id查询数据库。
- 创建一SolrInputDocument对象。
- 使用SolrServer对象写入索引库。返回成功,返回e3Result。
3.1.2 Dao层
1 | <select id="getItemById" parameterType="long" resultType="yp.e3mall.common.pojo.SearchItem"> |
3.1.3 监听器(Service)
1 | /** |
3.1.4 Spring配置监听
3.2 Producer
e3-manager-server工程中发送消息。
当商品添加完成后发送一个TextMessage,包含一个商品id。
上图中使用topic来作为目的地,itemAddTopic相当于是发送到哪个队列
所以我们之前接受者的代码需要加上Thread.sleep(1000)
具体发送消息代码实现:
1 | @Override |
四.商品详情页面展示
创建一个商品详情页面展示的工程。是一个表现层工程。(参考e3_portal_web)
4.1 工程搭建
e3-item-web。打包方式war。可以参考e3-portal-web
4.2 功能分析
在搜索结果页面点击商品图片或者商品标题,展示商品详情页面。
请求的url:/item/{itemId}
参数:商品id
返回值:String 逻辑视图
业务逻辑:
1、从url中取参数,商品id
2、根据商品id查询商品信息(tb_item)得到一个TbItem对象,缺少images属性,可以创建一个pojo继承TbItem,添加一个getImages方法。在e3-item-web工程中。
1 | /** |
3、根据商品id查询商品描述。
4、展示到页面。
4.3 Dao层
查询tb_item, tb_item_desc两个表,都是单表查询。可以使用逆向工程。
4.4 Service层
思考一下,我们的Service应该在哪实现我们这个项目是个分布式项目,Service为服务层,我们现在需要商品信息是不是调用商品信息的Service即可,商品信息的Service是Manager工程中的,所以我们去看manager工程
1、根据商品id查询商品信息
参数:商品id
返回值:TbItem
2、根据商品id查询商品描述
参数:商品id
返回值:TbItemDesc
4.5 Controller层
请求的url:/item/{itemId}
参数:商品id
返回值:String 逻辑视图
1 | /** |
4.6 向业务逻辑中添加缓存
4.6.1 缓存添加分析
使用redis做缓存。
业务逻辑:
1、根据商品id到缓存中命中
2、查到缓存,直接返回。
3、差不到,查询数据库
4、把数据放到缓存中
5、返回数据
缓存中缓存热点数据,提供缓存的使用率。需要设置缓存的有效期。一般是一天的时间,可以根据实际情况跳转。
需要使用String类型来保存商品数据。
可以加前缀方法对象redis中的key进行归类。
ITEM_INFO:123456:BASE
ITEM_INFO:123456:DESC
如果把二维表保存到redis中:
1、表名就是第一层
2、主键是第二层
3、字段名第三次
三层使用“:”分隔作为key,value就是字段中的内容。
4.6.2 把redis相关的jar包添加到工程
4.6.3 添加缓存
1 | @Override |