第十六篇:ActiveMQ與Spring整合

1.Spring和ActiveMQ整合

第一步:在taotao-manager-services中引入jar包


image.png
<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

第二步:配置ActiveMQ整合spring


image.png
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">


    <!-- 真正可以產(chǎn)生Connection的ConnectionFactory逆巍,由對(duì)應(yīng)的 JMS服務(wù)廠商提供 -->
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.208.40:61616" />
    </bean>
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory"
          class="org.springframework.jms.connection.SingleConnectionFactory">
        <!-- 目標(biāo)ConnectionFactory對(duì)應(yīng)真實(shí)的可以產(chǎn)生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="targetConnectionFactory" />
    </bean>
    <!-- 配置生產(chǎn)者 -->
    <!-- Spring提供的JMS工具類帽撑,它可以進(jìn)行消息發(fā)送、接收等 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <!-- 這個(gè)connectionFactory對(duì)應(yīng)的是我們定義的Spring提供的那個(gè)ConnectionFactory對(duì)象 -->
        <property name="connectionFactory" ref="connectionFactory" />
    </bean>
    <!--這個(gè)是隊(duì)列目的地,點(diǎn)對(duì)點(diǎn)的 -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <value>spring-queue</value>
        </constructor-arg>
    </bean>
    <!--這個(gè)是主題目的地,一對(duì)多的 -->
    <bean id="itemAddTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="item-change-topic" />
    </bean>

</beans>

2.代碼測(cè)試

 @Test
    public void testQueueProducer() {
        //1.讀取配置文件
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
        //2.從容器中獲得JMSTemplate對(duì)象
        JmsTemplate jmsTemplate = applicationContext.getBean(JmsTemplate.class);
        //3.從容器中獲得一個(gè)Destination對(duì)象
        Queue queue = (Queue)applicationContext.getBean("queueDestination");
        //4.使用JMSTemplate對(duì)象發(fā)送消息,需要知道Destination
        jmsTemplate.send(queue,new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage("spring activemq test");
                return textMessage;
            }
        });

    }

接收的時(shí)候我們?cè)趖aotao-search-service中接收
第一步:把Activemq相關(guān)的jar包添加到工程中(同上)
第二步:創(chuàng)建一個(gè)MessageListener的實(shí)現(xiàn)類。

**
 * 接收ActiveMq消息
 */
public class MyMessageListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        try {
            TextMessage textMessage = (TextMessage) message;
            //取消息內(nèi)容
            String text = textMessage.getText();
            System.out.println(text);
        } catch (JMSException e) {
            e.printStackTrace();

        }
    }
}

第三步:配置spring和Activemq整合

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">

    <!-- 真正可以產(chǎn)生Connection的ConnectionFactory,由對(duì)應(yīng)的 JMS服務(wù)廠商提供 -->
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.208.40:61616" />
    </bean>
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory"
          class="org.springframework.jms.connection.SingleConnectionFactory">
        <!-- 目標(biāo)ConnectionFactory對(duì)應(yīng)真實(shí)的可以產(chǎn)生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="targetConnectionFactory" />
    </bean>
    <!--這個(gè)是隊(duì)列目的地抢肛,點(diǎn)對(duì)點(diǎn)的 -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <value>spring-queue</value>
        </constructor-arg>
    </bean>
    <!--這個(gè)是主題目的地,一對(duì)多的 -->
    <bean id="itemAddTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="item-change-topic" />
    </bean>
    <!-- 接收消息 -->
    <!-- 配置監(jiān)聽(tīng)器 -->
    <bean id="myMessageListener" class="com.taotao.search.listener.MyMessageListener" />
    <!-- 消息監(jiān)聽(tīng)容器 -->
    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="queueDestination" />
        <property name="messageListener" ref="myMessageListener" />
    </bean>
</beans>

如何測(cè)試碳柱?我們已經(jīng)在配置文件中配置了監(jiān)聽(tīng)器相關(guān)的bean捡絮,直接加載就好了

 @Test
    public void testQueueConsumer() throws Exception {
        //初始化spring容器
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-activemq.xml");
        //等待
        System.in.read();

    }

3.添加商品同步到索引庫(kù)

3.1 生產(chǎn)者

這里我們用的topic一對(duì)多的消息傳送形式,由于添加商品涉及到同步緩存莲镣,同步索引庫(kù)福稳,添加靜態(tài)頁(yè)面等操作。也就是一個(gè)消息會(huì)有多個(gè)消費(fèi)者剥悟。下面是配置


image.png

image.png

然后我們找到添加商品的方法灵寺,在添加完商品后曼库,發(fā)送消息,這里需要考慮一個(gè)問(wèn)題略板,那就是消息的內(nèi)容應(yīng)該是什么毁枯?既然是添加商品,消費(fèi)者肯定是要知道添加的商品是哪個(gè)商品叮称,同時(shí)本著簡(jiǎn)單的原則种玛,我們只需要傳新增商品的ID即可,如下圖所示


image.png

完整的代碼如下
@Service
public class ItemServiceImpl implements ItemService {
    @Autowired
    private TbItemMapper tbItemMapper;
    @Autowired
    private TbItemDescMapper itemDescMapper;
    @Autowired
    private JmsTemplate jmsTemplate;
    @Resource(name = "itemAddTopic")
    private Destination itemAddTopic;
    @Override
    public TbItem getItemById(long itemId) {
        TbItem item = tbItemMapper.selectByPrimaryKey(itemId);
        return item;
    }

    @Override
    public EasyUIDataGridResult getItemList(int page, int rows) {
        //1.在執(zhí)行查詢之前配置分頁(yè)條件瓤檐。使用PageHelper的靜態(tài)方法
        PageHelper.startPage(page,rows);
        //2.執(zhí)行查詢
        TbItemExample tbItemExample = new TbItemExample();
        List<TbItem> list = tbItemMapper.selectByExample(tbItemExample);
        //3.創(chuàng)建PageInfo對(duì)象
        PageInfo<TbItem> pageInfo = new PageInfo<>(list);
        EasyUIDataGridResult result = new EasyUIDataGridResult();
        //設(shè)置數(shù)目
        result.setTotal(pageInfo.getTotal());
        //設(shè)置返回的數(shù)據(jù)
        result.setRows(list);
        return result;
    }

    @Override
    public TaotaoResult addItem(TbItem item, String desc) {
        final long id = IDUtils.genItemId();
        item.setId(id);
        item.setCreated(new Date());
        item.setUpdated(new Date());
        item.setStatus((byte) 1);
        tbItemMapper.insert(item);
        TbItemDesc itemDesc = new TbItemDesc();
        itemDesc.setItemDesc(desc);
        itemDesc.setCreated(new Date());
        itemDesc.setUpdated(new Date());
        itemDescMapper.insert(itemDesc);
        //使用ActiveMq發(fā)送消息
        jmsTemplate.send(itemAddTopic,new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage textMessage = session.createTextMessage(id + "");
                return textMessage;
            }
        });
        return TaotaoResult.ok();
    }


}

3.2 消費(fèi)者

我們的思路是赂韵,消費(fèi)者傳一個(gè)商品的id過(guò)來(lái),然后通過(guò)id查詢到商品的所需要的信息挠蛉,再添加到索引庫(kù)中去祭示;所以我們要在Mapper中增加一個(gè)通過(guò)id查詢商品的方法


image.png

image.png

完整代碼

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.taotao.search.mapper.SearchItemMapper">

    <select id="getItemList" resultType="com.taotao.common.pojo.SearchItem">
        SELECT
        a.id,
        a.title,
        a.sell_point,
        a.price,
        a.image,
        b. NAME category_name,
        c.item_desc
        FROM
        tb_item a
        LEFT JOIN tb_item_cat b ON a.cid = b.id
        LEFT JOIN tb_item_desc c ON a.id = c.item_id
        WHERE
        a.`status` = 1
    </select>
    <select id="getItemById" parameterType="long" resultType="com.taotao.common.pojo.SearchItem">
        SELECT
        a.id,
        a.title,
        a.sell_point,
        a.price,
        a.image,
        b. NAME category_name,
        c.item_desc
        FROM
        tb_item a
        LEFT JOIN tb_item_cat b ON a.cid = b.id
        LEFT JOIN tb_item_desc c ON a.id = c.item_id
        WHERE
        a.`status` = 1
        AND
        a.id = #{itemId}
    </select>

</mapper>
image.png
package com.taotao.search.listener;

import com.taotao.search.service.SearchItemService;
import com.taotao.search.service.SearchService;
import org.springframework.beans.factory.annotation.Autowired;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

public class ItemAddMessageListener implements MessageListener {
    @Autowired
    private SearchItemService searchItemService;
    @Override
    public void onMessage(Message message) {
        try{
            //從消息中獲取商品的id
            TextMessage textMessage = (TextMessage)message;
            String text = textMessage.getText();
            Long itemId = Long.parseLong(text);
            //根據(jù)商品ID查詢數(shù)據(jù),添加商品到索引庫(kù)谴古,因?yàn)槭聞?wù)提交需要一段時(shí)間质涛,為了避免查詢不到商品的情況出現(xiàn)
            //所以需要設(shè)置一下等待的時(shí)間
            //等待事務(wù)的提交
            Thread.sleep(1000);
            //查詢商品,并將商品添加到索引庫(kù)
            searchItemService.addDocument(itemId);
        }catch(Exception e) {
            e.printStackTrace();
        }

    }
}

在SearchItmService中添加一個(gè)方法


image.png

完整代碼

package com.taotao.search.service.impl;

import com.taotao.common.pojo.SearchItem;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.search.mapper.SearchItemMapper;
import com.taotao.search.service.SearchItemService;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
@Service
public class SearchItemServiceImpl implements SearchItemService {
    //注入SolrServer在bean中裝配
    @Autowired
    private SolrServer solrServer;
    @Autowired
    private SearchItemMapper searchItemMapper;
    @Override
    public TaotaoResult addSerchItem() throws Exception {
        //查詢所有數(shù)據(jù)
        List<SearchItem> searchItemList = searchItemMapper.getItemList();
        //遍歷商品數(shù)據(jù)掰担,添加到索引庫(kù)
        for (SearchItem searchItem:
            searchItemList ) {
            //為每個(gè)商品創(chuàng)建文檔對(duì)象SolrInputDocument
            SolrInputDocument document = new SolrInputDocument();
            //對(duì)文檔對(duì)象添加域
            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());
            document.addField("item_desc", searchItem.getItem_desc());
            //向索引庫(kù)中添加文檔
            solrServer.add(document);
        }
        //提交修改
        solrServer.commit();
        //返回結(jié)果
        return TaotaoResult.ok();
    }

    public TaotaoResult addDocument(Long itemId) throws Exception {
        // 1汇陆、根據(jù)商品id查詢商品信息。
        SearchItem searchItem = searchItemMapper.getItemById(itemId);
        // 2带饱、創(chuàng)建一SolrInputDocument對(duì)象毡代。
        SolrInputDocument document = new SolrInputDocument();
        // 3、使用SolrServer對(duì)象寫(xiě)入索引庫(kù)勺疼。
        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());
        document.addField("item_desc", searchItem.getItem_desc());
        // 5教寂、向索引庫(kù)中添加文檔。
        solrServer.add(document);
        solrServer.commit();
        // 4恢口、返回成功孝宗,返回TaotaoResult。
        return TaotaoResult.ok();
    }


}

為什么我們要等待一秒呢耕肩。因?yàn)橛锌赡苌唐诽砑拥氖聞?wù)還沒(méi)有完成的時(shí)候就把消息傳遞過(guò)來(lái),并且消費(fèi)者馬上消息了问潭,這樣的話會(huì)造成一個(gè)問(wèn)題就是查詢不到商品的信息.所以我們一般會(huì)設(shè)置一個(gè)等待時(shí)間

Spring中配置監(jiān)聽(tīng)

image.png

完整配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">

    <!-- 真正可以產(chǎn)生Connection的ConnectionFactory猿诸,由對(duì)應(yīng)的 JMS服務(wù)廠商提供 -->
    <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://192.168.208.40:61616" />
    </bean>
    <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
    <bean id="connectionFactory"
          class="org.springframework.jms.connection.SingleConnectionFactory">
        <!-- 目標(biāo)ConnectionFactory對(duì)應(yīng)真實(shí)的可以產(chǎn)生JMS Connection的ConnectionFactory -->
        <property name="targetConnectionFactory" ref="targetConnectionFactory" />
    </bean>
    <!--這個(gè)是隊(duì)列目的地,點(diǎn)對(duì)點(diǎn)的 -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg>
            <value>spring-queue</value>
        </constructor-arg>
    </bean>
    <!--這個(gè)是主題目的地狡忙,一對(duì)多的 -->
    <bean id="itemAddTopic" class="org.apache.activemq.command.ActiveMQTopic">
        <constructor-arg value="item-change-topic" />
    </bean>
    <!-- 接收消息 -->
    <!-- 配置監(jiān)聽(tīng)器 -->
    <bean id="myMessageListener" class="com.taotao.search.listener.MyMessageListener" />
    <!-- 消息監(jiān)聽(tīng)容器 -->
    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory" />
        <property name="destination" ref="queueDestination" />
        <property name="messageListener" ref="myMessageListener" />
    </bean>

    <!-- 配置監(jiān)聽(tīng)器 -->
    <bean id="itemAddMessageListener" class="com.taotao.search.listener.ItemAddMessageListener"/>
    <!-- 消息監(jiān)聽(tīng)容器 -->
    <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="itemAddTopic"/>
        <property name="messageListener" ref="itemAddMessageListener"/>
    </bean>

</beans>

4.測(cè)試結(jié)果

啟動(dòng)所有服務(wù)梳虽,然后添加商品


activeMq測(cè)試結(jié)果.png

然后再前臺(tái)搜索少兒可以看到效果


activeMq2.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灾茁,隨后出現(xiàn)的幾起案子窜觉,更是在濱河造成了極大的恐慌谷炸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禀挫,死亡現(xiàn)場(chǎng)離奇詭異旬陡,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)语婴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門描孟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人砰左,你說(shuō)我怎么就攤上這事匿醒。” “怎么了缠导?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵廉羔,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我僻造,道長(zhǎng)憋他,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任嫡意,我火速辦了婚禮举瑰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔬螟。我一直安慰自己此迅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布旧巾。 她就那樣靜靜地躺著耸序,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鲁猩。 梳的紋絲不亂的頭發(fā)上坎怪,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音廓握,去河邊找鬼搅窿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛隙券,可吹牛的內(nèi)容都是我干的男应。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娱仔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼沐飘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤耐朴,失蹤者是張志新(化名)和其女友劉穎借卧,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體筛峭,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡铐刘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蜒滩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滨达。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖俯艰,靈堂內(nèi)的尸體忽然破棺而出捡遍,到底是詐尸還是另有隱情,我是刑警寧澤竹握,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布画株,位于F島的核電站,受9級(jí)特大地震影響啦辐,放射性物質(zhì)發(fā)生泄漏谓传。R本人自食惡果不足惜照筑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一烙无、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奸腺,春花似錦侥衬、人聲如沸诗祸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)直颅。三九已至,卻和暖如春怀樟,著一層夾襖步出監(jiān)牢的瞬間功偿,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工往堡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留械荷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓虑灰,卻偏偏與公主長(zhǎng)得像养葵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瘩缆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容