您的位置:首页 > 其它

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

2020-06-05 06:07 417 查看

添加课程同步索引库

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 配置监听

实现流程

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐