Design and Implementation of an Online Course Purchase System(24)

Complete course synchronization index library related functions

Posted by Chen Xingxu on June 3, 2020

易课寄在线购课系统开发笔记(二十四)–完成课程同步索引库相关功能

添加课程同步索引库

Producer

ecourses-bms-service 工程中发送消息。

当课程添加完成后发送一个 TextMessage,包含一个课程 id。

@Override
public ECoursesResult addItem(EcoursesItem item, String desc) {
    //生成课程id
    final long itemId = IDUtils.genItemId();
    //补全item的属性
    item.setId(itemId);
    //1-正常,2-下架,3-删除
    item.setStatus((byte) 1);
    item.setCreated(new Date());
    item.setUpdated(new Date());
    //向课程表插入数据
    itemMapper.insert(item);
    //创建一个课程描述表对应的pojo对象。
    EcoursesItemDesc itemDesc = new EcoursesItemDesc();
    //补全属性
    itemDesc.setItemId(itemId);
    itemDesc.setItemDesc(desc);
    itemDesc.setCreated(new Date());
    itemDesc.setUpdated(new Date());
    //向课程描述表插入数据
    itemDescMapper.insert(itemDesc);
    
    //发送课程添加消息
    jmsTemplate.send(topicDestination, new MessageCreator() {

        @Override
        public Message createMessage(Session session) throws JMSException {
            TextMessage textMessage = session.createTextMessage(itemId + "");
            return textMessage;
        }
    });

    //返回成功
    return ECoursesResult.ok();
}

Consumer

功能分析

1、接收消息,需要创建 MessageListener 接口的实现类;

2、取消息,取课程 id;

3、根据课程 id 查询数据库;

4、创建一个 SolrInputDocument 对象;

5、使用 SolrServer 对象写入索引库;

6、返回 ECoursesResult。

Dao 层

根据课程 id 查询课程信息。

映射文件:

<select id="getItemById" parameterType="long" resultType="cn.ecourses.common.pojo.SearchItem">
    SELECT
        a.id,
        a.title,
        a.sell_point,
        a.price,
        a.image,
        b. NAME category_name
    FROM
        ecourses_item a
    LEFT JOIN ecourses_item_cat b ON a.cid = b.id
    WHERE
        a.`status` = 1
    AND a.id=#{itemid}
</select>

Service 层

参数:课程 id

业务逻辑:

1、根据课程 id 查询课程信息;

2、创建一个 SolrInputDocument 对象;

3、使用 SolrServer 对象写入索引库;

4、返回 ECoursesResult。

返回值:ECoursesResult

package cn.ecourses.search.service.impl;
//索引库维护Service
@Service
public class SearchItemServiceImpl implements SearchItemService {

	@Autowired
	private ItemMapper itemMapper;
	@Autowired
	private SolrServer solrServer;
	
	@Override
	public ECoursesResult importAllItems() {
		try {
			//查询课程列表
			List<SearchItem> itemList = itemMapper.getItemList();
			//遍历课程列表
			for (SearchItem searchItem : itemList) {
				//创建文档对象
				SolrInputDocument document = new SolrInputDocument();
				//向文档对象中添加域
				document.addField("id", searchItem.getId());
				document.addField("item_title", searchItem.getTitle());
				document.addField("item_sell_point", searchItem.getSell_point());
				document.addField("item_price", searchItem.getPrice());
				document.addField("item_image", searchItem.getImage());
				document.addField("item_category_name", searchItem.getCategory_name());
				//把文档对象写入索引库
				solrServer.add(document);
			}
			//提交
			solrServer.commit();
			//返回导入成功
			return ECoursesResult.ok();
		} catch (Exception e) {
			e.printStackTrace();
			return ECoursesResult.build(500, "数据导入时发生异常");		
		}
	}
}

Listener

package cn.ecourses.search.message;
//监听添加消息,接收消息后,将对应的信息同步到索引库
public class ItemAddMessageListener implements MessageListener {
	
	@Autowired
	private ItemMapper itemMapper;
	@Autowired
	private SolrServer solrServer;

	@Override
	public void onMessage(Message message) {
		try {
			//从消息中取课程id
			TextMessage textMessage = (TextMessage) message;
			String text = textMessage.getText();
			Long itemId = new Long(text);
			//等待事务提交
			Thread.sleep(1000);
			//根据id查询课程信息
			SearchItem searchItem = itemMapper.getItemById(itemId);
			//创建一个文档对象
			SolrInputDocument document = new SolrInputDocument();
			//向文档对象中添加域
			document.addField("id", searchItem.getId());
			document.addField("item_title", searchItem.getTitle());
			document.addField("item_sell_point", searchItem.getSell_point());
			document.addField("item_price", searchItem.getPrice());
			document.addField("item_image", searchItem.getImage());
			document.addField("item_category_name", searchItem.getCategory_name());
			//把文档写入索引库
			solrServer.add(document);
			//提交
			solrServer.commit();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Spring 配置监听

实现流程