易课寄在线购课系统开发笔记(二十四)–完成课程同步索引库相关功能
添加课程同步索引库
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();
}
}
}