第一步:当添加商品时通过消息中间件ActiveMQ发送消息
配置
<!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->
<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://192.168.25.133:61616" />
</bean>
<!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.SingleConnectionFactory">
<!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->
<property name="targetConnectionFactory" ref="targetConnectionFactory" />
</bean>
<!-- 配置生产者 -->
<!-- Spring提供的JMS工具类,它可以进行消息发送、接收等 -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
<property name="connectionFactory" ref="connectionFactory" />
</bean>
<bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg value="topic" />
</bean>
@Autowired
private JmsTemplate jmsTemplate;
@Resource
private Destination topicDestination;
@Override
public E3Result addItem(TbItem tbItem, String desc) {
final long id = IDUtils.genItemId();
tbItem.setId(id);
tbItem.setStatus((byte)1);
tbItem.setCreated(new Date());
tbItem.setUpdated(new Date());
tbItemMapper.insert(tbItem);
TbItemDesc tbItemDesc=new TbItemDesc();
tbItemDesc.setItemDesc(desc);
tbItemDesc.setItemId(id);
tbItemDesc.setCreated(new Date());
tbItemDesc.setUpdated(new Date());
tbItemDescMapper.insert(tbItemDesc);
//在响应之前需要将添加商品信息这个消息发出去,
//告诉监听器,你需要把我新插入的数据更新到索引库
jmsTemplate.send(topicDestination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
return session.createTextMessage(id+"");
}
});
return E3Result.ok();
}
此时消息已经发送。
第二步:监听消息,
配置:
SearchItem getItemByid(long id);
<!-- 监听商品添加消息,同步索引库 -->
<bean id="itemAddMessageListener" class="cn.e3mall.search.message.ItemAddMessageListener"/>
<bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="topicDestination" />
<property name="messageListener" ref="itemAddMessageListener" />
</bean>
<select id="getItemByid" parameterType="long" resultType="cn.e3mall.common.pojo.SearchItem">
SELECT
a.id,
a.title,
a.sell_point,
a.price,
a.image,
b. NAME category_name
FROM
tb_item a
LEFT JOIN tb_item_cat b ON a.cid = b.id
WHERE
a.`status` = 1
AND a.id=#{itemid}
</select>
@Autowired
private ItemMapper itemMapper;
@Autowired
private SolrServer solrServer;
@Override
public void onMessage(Message message) {
TextMessage messageid= (TextMessage) message;
try {
String text = messageid.getText();
Long itemId=new Long(text);
Thread.sleep(1000);
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();
}
}