添加商品
需要同步索引库,同步缓存,生成静态页面等等
很多地方,都需要监听添加商品的事件,所以,这里使用Topic模式
方案选择
方案一:直接写业务逻辑
在商品服务模块,添加商品的业务逻辑中,添加同步索引库的业务逻辑
缺点:业务逻辑耦合度高,业务拆分不明确
方案二:模块之间服务调用
在商品服务模块,添加商品业务逻辑服务中,调用索引服务模块,添加索引的服务,业务逻辑分开,通过服务调用
缺点:服务之间耦合度高,服务的启动有先后顺序
方案三:使用消息队列
在商品服务模块,添加商品业务逻辑中,通过消息中间件发布消息,然后索引模块中,通过监听接收消息,并添加索引
消息中间件可以使用ActiveMQ、RabbitMQ、kafka
JMSTemplate
配置信息
<!-- 配置JMSTemplate -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<!-- 配置消息的Destination对象 -->
<bean id="test-queue" class="org.apache.activemq.command.ActiveMQQueue">
<constructor-arg name="name" value="test-queue"></constructor-arg>
</bean>
<bean id="itemAddtopic" class="org.apache.activemq.command.ActiveMQTopic">
<constructor-arg name="name" value="item-add-topic"></constructor-arg>
</bean>
添加商品
向Activemq发送,商品添加消息
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private TbItemMapper itemMapper;
@Autowired
private TbItemDescMapper itemDescMapper;
@Autowired
private JmsTemplate jmsTemplate;
@Resource(name="itemAddtopic")
private Destination destination;
@Override
public TaotaoResult addItem(TbItem 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
TbItemDesc itemDesc = new TbItemDesc();
//补全pojo的属性
itemDesc.setItemId(itemId);
itemDesc.setItemDesc(desc);
itemDesc.setUpdated(new Date());
itemDesc.setCreated(new Date());
//向商品描述表插入数据
itemDescMapper.insert(itemDesc);
//向Activemq发送商品添加消息
jmsTemplate.send(destination, new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
//发送商品id
TextMessage textMessage = session.createTextMessage(itemId + "");
return textMessage;
}
});
//返回结果
return TaotaoResult.ok();
}
}