1.同步Solr索引库
问题1:我们在后台管理系统中,新添加的商品,为什么在门户系统中搜不到?
答:因为这个新添加的商品,只保存到了数据库中,没有保存到Solr索引库中。
所以,我们需要将新添加的商品,同步到索引库中。
问题2:我们是在后台管理系统中添加的商品,索引库的相关操作是在Search搜索系统中,如何将商品从后台管理系统发送给搜索系统呢?
答:使用ActiveMQ。
1.1.实现的思路
(1)搭建ActiveMQ服务器。
(2)修改添加商品的逻辑,将商品写入队列模型中。
(3)在搜索系统中开发同步索引库业务。
1.2.实现步骤
1.2.1.第一部分:搭建ActiveMQ服务器
1.2.1.1.第一步:下载、上传至Linux
--说明:确保已经安装了jdk
1.2.1.2.第二步:安装到/usr/local/activemq目录
(1)解压到/usr/local目录下
[root@node07192 ~]# tar -zxvf apache-activemq-5.9.0-bin.tar.gz -C /usr/local
(2)修改名称为activemq
[root@node07192 ~]# cd /usr/local/
[root@node07192 local]# mv apache-activemq-5.9.0/ activemq
1.2.1.3.第三步:启动ActiveMQ服务器
--说明:ActiveMQ是免安装软件,解压即可启动服务。
[root@node07192 local]# cd activemq/bin
[root@node07192 bin]# ./activemq start
--查看ActiveMQ启动状态
[root@node07192 bin]# ./activemq status
1.2.1.4.第四步:浏览器访问ActiveMQ管理界面
1.2.1.4.1.Step1:查看ActiveMQ管理界面的服务端口。在/conf/jetty.xml中
--访问管理控制台的服务端口,默认为:8161
[root@node07192 bin]# cd ../conf
[root@node07192 conf]# vim jetty.xml
1.2.1.4.2.Step2:查看ActiveMQ用户、密码。在/conf/users.properties中:
--默认的用户名、密码均为amdin
[root@node07192 conf]# vim users.properties
1.2.1.4.3.Step3:访问ActiveMQ管理控制台。地址:http://ip:8161/
--注意:防火墙是没有配置该服务的端口的。
因此,要访问该服务,必须在防火墙中配置。
(1)修改防火墙,开放8161端口
[root@node07192 conf]# vim /etc/sysconfig/iptables
(2)重启防火墙
[root@node07192 conf]# service iptables restart
(3)登录管理控制台
--登陆,用户名、密码均为admin
--控制台主界面
--搭建ActiveMQ服务器成功!!!
1.2.2.第二部分:修改商品添加逻辑
添加商品的时候,同时将商品写入消息队列中。
步骤说明:
(1)导入ActiveMQ依赖。
(2)Spring整合ActiveMQ。
(3)修改商品添加的业务逻辑。
1.2.2.1.第一步:导入jar依赖
修改ego-manager工程的pom文件,添加如下依赖:
org.apache.activemq
activemq-all
5.9.0
org.apache.activemq
activemq-pool
5.9.0
org.springframework
spring-jms
4.3.16.RELEASE
1.2.2.2.第二步:Spring整合ActiveMQ
(1)修改resource.properties文件,添加ActiveMQ服务器配置信息
#ActiveMQ配置
MQ_ADDRESS=tcp://192.168.23.12:61616
MQ_USER=admin
MQ_PASSWD=admin
MQ_ITEM_QUEUE_NAME=ego-item-mq
在src目录下创建spring-jms.xml文件,用来整合ActiveMQ.
1.2.2.3.第三步:修改ItemServiceImpl类
(1)注入JmsTemplate对象、队列名称
(2)修改save方法。
package cn.gzsxt.manager.service.impl;
import java.util.Date;
import java.util.List;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import cn.gzsxt.common.pojo.EUDataGrid;
import cn.gzsxt.common.pojo.SearchItem;
import cn.gzsxt.common.utils.EgoResult;
import cn.gzsxt.common.utils.IDUtils;
import cn.gzsxt.common.utils.JsonUtils;
import cn.gzsxt.manager.mapper.ItemDescMapper;
import cn.gzsxt.manager.mapper.ItemMapper;
import cn.gzsxt.manager.mapper.ItemParamItemMapper;
import cn.gzsxt.manager.pojo.Item;
import cn.gzsxt.manager.pojo.ItemDesc;
import cn.gzsxt.manager.pojo.ItemExample;
import cn.gzsxt.manager.pojo.ItemExample.Criteria;
import cn.gzsxt.manager.pojo.ItemParamItem;
import cn.gzsxt.manager.service.ItemService;
@Service
public class ItemServiceImpl implements ItemService{
@Autowired
private ItemMapper mapper;
@Autowired
private ItemParamItemMapper itemParamMapper;
@Autowired
private ItemDescMapper descMapper;
@Autowired
private JmsTemplate jmsTemplate;
@Value("${MQ_ITEM_QUEUE_NAME}")
private String MQ_ITEM_QUEUE_NAME;
@Override
public EgoResult save(Item item, String desc, String itemParams) {
try {
//保存商品信息
long itemId = IDUtils.genItemId();
item.setId(itemId);
item.setStatus((byte) 1);
item.setCreated(new Date());
item.setUpdated(item.getCreated());
mapper.insertSelective(item);
//保存商品详情
ItemDesc itemDesc = new ItemDesc();
itemDesc.setItemId(itemId);
itemDesc.setItemDesc(desc);
itemDesc.setCreated(item.getCreated());
itemDesc.setUpdated(item.getCreated());
descMapper.insertSelective(itemDesc);
//保存商品规格参数
ItemParamItem paramItem = new ItemParamItem();
paramItem.setCreated(item.getCreated());
paramItem.setUpdated(item.getCreated());
paramItem.setItemId(itemId);
paramItem.setParamData(itemParams);
itemParamMapper.insertSelective(paramItem);
//将商品写入到消息队列
SearchItem temp = new SearchItem();
temp.setId(itemId);
temp.setImage(item.getImage());
temp.setPrice(item.getPrice());
temp.setSell_point(item.getSellPoint());
temp.setTitle(item.getTitle());
jmsTemplate.send(MQ_ITEM_QUEUE_NAME, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
//使用Map类型保存消息
MapMessage mapMessage = session.createMapMessage();
//key用来标记当前是在添加商品
//value是存储的是商品的信息
mapMessage.setString("key", "add");
mapMessage.setString("value", JsonUtils.objectToJson(temp));
return mapMessage;
}
});
return EgoResult.ok();
} catch (Exception e) {
e.printStackTrace();
return EgoResult.build(400, e.getMessage());
}
}
}
1.2.2.4.第四步:测试
(1)重新启动后台管理系统
(2)新增一个商品。
(3)查看ActiveMQ控制台。
1.2.3.第三部分:同步Solr索引库
说明:同步索引库,是在ego-search搜索工程中实现的。
思路:
(1)导入jar包。
(2)Spring整合ActiveMQ
(3)创建监听器
(4)加载监听器,监听商品这个队列。
1.2.3.1.第一步:导入jar依赖
org.apache.activemq
activemq-all
5.9.0
org.apache.activemq
activemq-pool
5.9.0
org.springframework
spring-jms
4.3.16.RELEASE
1.2.3.2.第二步:Spring整合ActiveMQ
(1)修改resource.properties文件,添加AcitveMQ配置信息
#ActiveMQ配置
MQ_ADDRESS=tcp://192.168.23.12:61616
MQ_USER=admin
MQ_PASSWD=admin
MQ_ITEM_QUEUE_NAME=ego-item-mq
(2)创建spring-jms.xml文件,整合框架
1.2.3.3.第三步:创建监听器
说明:监听器需要实现MessageListener这个接口。
package cn.gzsxt.search.listener;
import java.io.IOException;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import cn.gzsxt.common.pojo.SearchItem;
import cn.gzsxt.common.utils.JsonUtils;
@Component
public class ItemListener implements MessageListener{
@Autowired
private HttpSolrServer server;
@Override
public void onMessage(Message message) {
if(null!=message){
MapMessage mapMessage = (MapMessage) message;
try {
String key = mapMessage.getString("key");
if("add".equals(key)){
String jsonItem = mapMessage.getString("value");
SearchItem item = JsonUtils.jsonToPojo(jsonItem, SearchItem.class);
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", item.getId());
doc.addField("item_title", item.getTitle());
doc.addField("item_sell_point", item.getSell_point());
doc.addField("item_price", item.getPrice());
doc.addField("item_image", item.getImage());
doc.addField("item_category_name", item.getCategory_name());
server.add(doc);
server.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
1.2.3.4.第四步:加载监听器
修改spring-jms.xml文件,配置监听器。
1.2.3.5.第五步:测试
(1)重新启动搜索工程。
(2)查看ActiveMQ管理控制台。消息已经被消费了。
(3)在门户系统中,搜索该商品
能成功收到新添加的商品,索引库同步成功!!!