±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËRocketMQÏûÏ¢ÀàÐÍ£¬Ê×ÏȾÙÀý˵Ã÷ʲôÊÇÎÞÐòÏûÏ¢£¬Æä´Î½éÉÜÁËÓÐÐòÏûÏ¢ÊÇÈçºÎ±£Ö¤µÄ£¬×îºó½éÉÜÑÓʱÏûÏ¢µÄÉèÖÃÒÔ¼°Ó¦Óó¡¾°£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊé,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
ÆÕͨÏûÏ¢
ÆÕͨÏûÏ¢Ò²½Ð×öÎÞÐòÏûÏ¢£¬¼òµ¥À´Ëµ¾ÍÊÇûÓÐ˳ÐòµÄÏûÏ¢£¬producer Ö»¹Ü·¢ËÍÏûÏ¢£¬consumer
Ö»¹Ü½ÓÊÕÏûÏ¢£¬ÖÁÓÚÏûÏ¢ºÍÏûÏ¢Ö®¼äµÄ˳Ðò²¢Ã»Óб£Ö¤£¬¿ÉÄÜÏÈ·¢Ë͵ÄÏûÏ¢ÏÈÏû·Ñ£¬Ò²¿ÉÄÜÏÈ·¢Ë͵ÄÏûÏ¢ºóÏû·Ñ¡£
¾Ù¸ö¼òµ¥Àý×Ó£¬producer ÒÀ´Î·¢ËÍ order id Ϊ 1¡¢2¡¢3 µÄÏûÏ¢µ½ broker£¬consumer
½Óµ½µÄÏûϢ˳ÐòÓпÉÄÜÊÇ 1¡¢2¡¢3£¬Ò²ÓпÉÄÜÊÇ 2¡¢1¡¢3 µÈÇé¿ö£¬Õâ¾ÍÊÇÆÕͨÏûÏ¢¡£
ÒòΪ²»ÐèÒª±£Ö¤ÏûÏ¢µÄ˳Ðò£¬ËùÒÔÏûÏ¢¿ÉÒÔ´ó¹æÄ£²¢·¢µØ·¢ËͺÍÏû·Ñ£¬ÍÌÍÂÁ¿ºÜ¸ß£¬Êʺϴ󲿷ֳ¡¾°¡£
´úÂëʾÀý£º
Éú²úÕß
public class Producer
{
public static void main(String[] args) throws
MQClientException, InterruptedException {
//ÉùÃ÷²¢³õʼ»¯Ò»¸öproducer
//ÐèÒªÒ»¸öproducer groupÃû×Ö×÷Ϊ¹¹Ôì·½·¨µÄ²ÎÊý£¬ÕâÀïΪconcurrent_producer
DefaultMQProducer producer = new DefaultMQProducer("concurrent_producer");
//ÉèÖÃNameServerµØÖ·,´Ë´¦Ó¦¸ÄΪʵ¼ÊNameServerµØÖ·£¬ ¶à¸öµØÖ·Ö®¼äÓã»·Ö¸ô
//NameServerµÄµØÖ·±ØÐëÓУ¬µ«ÊÇÒ²¿ÉÒÔͨ¹ý»·¾³±äÁ¿µÄ ·½Ê½ÉèÖ㬲»Ò»¶¨·ÇµÃдËÀÔÚ´úÂëÀï
producer.setNamesrvAddr("10.1.54.121:9876;10.1.54. 122 :9876");
//µ÷ÓÃstart()·½·¨Æô¶¯Ò»¸öproducerʵÀý
producer.start(); //·¢ËÍ10ÌõÏûÏ¢µ½TopicΪTopicTest£¬tagΪTagA£¬ÏûÏ¢ÄÚÈÝΪ¡°Hello
RocketMQ¡±Æ´½ÓÉÏiµÄÖµ
for (int i = 0; i < 10; i++) {
try {
Message msg = new Message("TopicTestConcurrent",//
topic
"TagA",// tag
("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)//
body
); //µ÷ÓÃproducerµÄsend()·½·¨·¢ËÍÏûÏ¢
//ÕâÀïµ÷ÓõÄÊÇͬ²½µÄ·½Ê½£¬ËùÒÔ»áÓзµ»Ø½á¹û£¬ ͬʱĬÈÏ·¢Ë͵ÄÒ²ÊÇÆÕͨÏûÏ¢
SendResult sendResult = producer.send(msg); //´òÓ¡·µ»Ø½á¹û£¬¿ÉÒÔ¿´µ½ÏûÏ¢·¢Ë͵Ä״̬ÒÔ¼°Ò»Ð©Ïà¹ØÐÅÏ¢
System.out.println(sendResult);
} catch (Exception e) {
e.printStackTrace();
Thread.sleep(1000);
}
} //·¢ËÍÍêÏûÏ¢Ö®ºó£¬µ÷ÓÃshutdown()·½·¨¹Ø±Õproducer
producer.shutdown();
}
} |
Ïû·ÑÕß
public class
Consumer {
public static void main(String[] args) throws
InterruptedException, MQClientException //ÉùÃ÷²¢³õʼ»¯Ò»¸öconsumer
//ÐèÒªÒ»¸öconsumer groupÃû×Ö×÷Ϊ¹¹Ôì·½·¨µÄ²ÎÊý£¬ ÕâÀïΪconcurrent_consumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("concurrent_consumer");
//ͬÑùÒ²ÒªÉèÖÃNameServerµØÖ·
consumer.setNamesrvAddr("10.1.54.121:9876;10.1 .54 .122 : 9876"); //ÕâÀïÉèÖõÄÊÇÒ»¸öconsumerµÄÏû·Ñ²ßÂÔ
//CONSUME_FROM_LAST_OFFSET ĬÈϲßÂÔ£¬´Ó¸Ã¶ÓÁÐ×îβ¿ªÊ¼Ïû·Ñ£¬¼´Ìø¹ýÀúÊ·ÏûÏ¢
//CONSUME_FROM_FIRST_OFFSET
´Ó¶ÓÁÐ×ʼ¿ªÊ¼Ïû·Ñ£¬¼´ÀúÊ·ÏûÏ¢£¨»¹´¢´æÔÚbrokerµÄ£© È«²¿Ïû·ÑÒ»±é
//CONSUME_FROM_TIMESTAMP ´Óij¸öʱ¼äµã¿ªÊ¼Ïû·Ñ£¬ºÍsetConsumeTimestamp()ÅäºÏʹÓ㬠ĬÈÏÊǰë¸öСʱÒÔǰ
consumer.setConsumeFromWhere(ConsumeFromWhere. CONSUME_FROM_FIRST_OFFSET); //ÉèÖÃconsumerËù¶©ÔĵÄTopicºÍTag£¬*´ú±íÈ«²¿µÄTag
consumer.subscribe("TopicTestConcurrent",
"*"); //ÉèÖÃÒ»¸öListener£¬Ö÷Òª½øÐÐÏûÏ¢µÄÂß¼´¦Àí
//×¢ÒâÕâÀïʹÓõÄÊÇMessageListenerConcurrentlyÕâ¸ö½Ó¿Ú
consumer.registerMessageListener(new MessageListenerConcurrently()
{ @Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt>
msgs,
ConsumeConcurrentlyContext context) { System.out.println(Thread.currentThread().getName()
+ " Receive New Messages: " + msgs); //·µ»ØÏû·Ñ״̬
//CONSUME_SUCCESS Ïû·Ñ³É¹¦
//RECONSUME_LATER Ïû·Ñʧ°Ü£¬ÐèÒªÉÔºóÖØÐÂÏû·Ñ
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
}); //µ÷ÓÃstart()·½·¨Æô¶¯consumer
consumer.start(); System.out.println("Consumer Started.");
}
} |
ÓÐÐòÏûÏ¢
ÓÐÐòÏûÏ¢¾ÍÊǰ´ÕÕÒ»¶¨µÄÏȺó˳ÐòµÄÏûÏ¢ÀàÐÍ¡£
¾Ù¸öÀý×ÓÀ´Ëµ£¬producer ÒÀ´Î·¢ËÍ order id Ϊ 1¡¢2¡¢3 µÄÏûÏ¢µ½ broker£¬consumer
½Óµ½µÄÏûϢ˳ÐòÒ²¾ÍÊÇ 1¡¢2¡¢3 £¬¶ø²»»á³öÏÖÆÕͨÏûÏ¢ÄÇÑùµÄ 2¡¢1¡¢3 µÈÇé¿ö¡£
ÄÇôÓÐÐòÏûÏ¢ÊÇÈçºÎ±£Ö¤µÄÄØ£¿ÎÒÃǶ¼ÖªµÀÏûÏ¢Ê×ÏÈÓÉ producer µ½ broker£¬ÔÙ´Ó broker
µ½ consumer£¬·ÖÕâÁ½²½×ß¡£ÄÇôҪ±£Ö¤ÏûÏ¢µÄÓÐÐò£¬ÊƱØÕâÁ½²½¶¼ÊÇÒª±£Ö¤ÓÐÐòµÄ£¬¼´Òª±£Ö¤ÏûÏ¢Êǰ´ÓÐÐò·¢Ë͵½
broker£¬broker Ò²ÊÇÓÐÐò½«ÏûϢͶµÝ¸ø consumer£¬Á½¸öÌõ¼þ±ØÐëͬʱÂú×㣬ȱһ²»¿É¡£
½øÒ»²½»¹¿ÉÒÔ½«ÓÐÐòÏûÏ¢·Ö³É
1.È«¾ÖÓÐÐòÏûÏ¢
2.¾Ö²¿ÓÐÐòÏûÏ¢
֮ǰÎÒÃǽ²¹ý£¬topic Ö»ÊÇÏûÏ¢µÄÂß¼·ÖÀ࣬ÄÚ²¿ÊµÏÖÆäʵÊÇÓÉ queue
×é³É¡£µ± producer °ÑÏûÏ¢·¢Ë͵½Ä³¸ö topic ʱ£¬Ä¬ÈÏÊÇ»áÏûÏ¢·¢Ë͵½¾ßÌåµÄ queue
ÉÏ¡£

È«¾ÖÓÐÐò
¾Ù¸öÀý×Ó£¬producer ·¢ËÍ order id Ϊ 1¡¢2¡¢3¡¢4 µÄËÄÌõÏûÏ¢µ½ topicA
ÉÏ£¬¼ÙÉè topicA µÄ queue ÊýΪ 3 ¸ö£¨queue0¡¢queue1¡¢queue2£©£¬ÄÇôÏûÏ¢µÄ·Ö²¼¿ÉÄܾÍÊÇÕâÖÖÇé¿ö£¬id
Ϊ 1 µÄÔÚ queue0£¬id Ϊ 2 µÄÔÚ queue1£¬id Ϊ 3 µÄÔÚ queue2£¬id
Ϊ 4 µÄÔÚ queue0¡£Í¬ÑùµÄ£¬consumer Ïû·ÑʱҲÊǰ´ queue È¥Ïû·Ñ£¬Õâʱºò¾Í¿ÉÄܳöÏÖÏÈÏû·Ñ
1¡¢4£¬ÔÙÏû·Ñ 2¡¢3£¬ºÍÎÒÃǵÄÔ¤ÆÚ²»·û¡£ÄÇôÎÒÃÇÈçºÎʵÏÖ 1¡¢2¡¢3¡¢4 µÄÏû·Ñ˳ÐòÄØ£¿µÀÀíÆäʵºÜ¼òµ¥£¬Ö»ÐèÒª°Ñ¶©µ¥
topic µÄ queue Êý¸ÄΪ 1£¬Èç´ËÒ»À´£¬Ö»Òª producer °´ÕÕ 1¡¢2¡¢3¡¢4 µÄ˳ÐòÈ¥·¢ËÍÏûÏ¢£¬ÄÇô
consumer ×ÔȻҲ¾Í°´ÕÕ 1¡¢2¡¢3¡¢4 µÄ˳ÐòÈ¥Ïû·Ñ£¬Õâ¾ÍÊÇÈ«¾ÖÓÐÐòÏûÏ¢¡£
ÓÉÓÚÒ»¸ö topic Ö»ÓÐÒ»¸ö queue £¬¼´Ê¹ÎÒÃÇÓжà¸ö producer ʵÀýºÍ consumer
ʵÀýÒ²ºÜÄÑÌá¸ßÏûÏ¢ÍÌÍÂÁ¿¡£¾ÍºÃ±È¹ý¶ÀľÇÅ£¬´ó¼ÒÖ»ÄÜÒ»¸ö°¤×ÅÒ»¸ö¹ýÈ¥£¬Ð§ÂʵÍÏ¡£
ÄÇôÓÐûÓÐÍÌÍÂÁ¿ºÍÓÐÐòÖ®¼äÕÛÖеķ½°¸ÄØ£¿ÆäʵÊÇÓе쬾ÍÊǾֲ¿ÓÐÐòÏûÏ¢¡£

¾Ö²¿ÓÐÐò
ÎÒÃÇÖªµÀ¶©µ¥ÏûÏ¢¿ÉÒÔÔÙϸ·ÖΪ¶©µ¥´´½¨¡¢¶©µ¥¸¶¿î¡¢¶©µ¥Íê³ÉµÈÏûÏ¢£¬ÕâЩÏûÏ¢¶¼ÓÐÏàͬµÄ order id¡£Í¬Ê±£¬Ò²Ö»Óа´ÕÕ¶©µ¥´´½¨¡¢¶©µ¥¸¶¿î¡¢¶©µ¥Íê³ÉµÄ˳ÐòÈ¥Ïû·Ñ²Å·ûºÏÒµÎñÂß¼¡£µ«ÊDz»Í¬
order id µÄÏûÏ¢ÊÇ¿ÉÒÔ²¢Ðе쬲»»áÓ°Ïìµ½ÒµÎñ¡£Õâʱºò¾Í³£¼û×ö·¨¾ÍÊǽ« order id ½øÐд¦Àí£¬½«
order id ÏàͬµÄÏûÏ¢·¢Ë͵½ topicB µÄͬһ¸ö queue£¬¼ÙÉèÎÒÃÇ topicB ÓÐ
2 ¸ö queue£¬ÄÇôÎÒÃÇ¿ÉÒÔ¼òµ¥µÄ¶Ô id È¡Óà£¬ÆæÊýµÄ·¢Íù queue0£¬Å¼ÊýµÄ·¢Íù queue1£¬Ïû·ÑÕß°´ÕÕ
queue È¥Ïû·Ñʱ£¬¾ÍÄܱ£Ö¤ queue0 ÀïÃæµÄÏûÏ¢ÓÐÐòÏû·Ñ£¬queue1 ÀïÃæµÄÏûÏ¢ÓÐÐòÏû·Ñ¡£
ÓÉÓÚÒ»¸ö topic ¿ÉÒÔÓжà¸ö queue£¬ËùÒÔÔÚÐÔÄܱÈÈ«¾ÖÓÐÐò¸ßµÃ¶à¡£¼ÙÉè queue ÊýÊÇ n£¬ÀíÂÛÉÏÐÔÄܾÍÊÇÈ«¾ÖÓÐÐòµÄ
n ±¶£¬µ±È» consumer Ò²Òª¸ú×ÅÔö¼Ó²ÅÐС£ÔÚʵ¼ÊÇé¿öÖУ¬ÕâÖÖ¾Ö²¿ÓÐÐòÏûÏ¢ÊÇ»á±ÈÈ«¾ÖÓÐÐòÏûÏ¢Óõĸü¶à¡£
ʾÀý´úÂ룺
Éú²úÕß
public class
Producer {
public static void main(String[] args) throws
UnsupportedEncodingException {
try {
// ÉùÃ÷²¢³õʼ»¯Ò»¸öproducer
// ÐèÒªÒ»¸öproducer groupÃû×Ö×÷Ϊ¹¹Ôì·½·¨µÄ²ÎÊý£¬ÕâÀïΪordered_producer
DefaultMQProducer orderedProducer = new DefaultMQProducer("ordered_producer");
// ÉèÖÃNameServerµØÖ·,´Ë´¦Ó¦¸ÄΪʵ¼ÊNameServerµØÖ·£¬ ¶à¸öµØÖ·Ö®¼äÓã»·Ö¸ô
//NameServerµÄµØÖ·±ØÐëÓУ¬µ«ÊÇÒ²¿ÉÒÔͨ¹ý»·¾³±äÁ¿µÄ·½Ê½ÉèÖ㬠²»Ò»¶¨·ÇµÃдËÀÔÚ´úÂëÀï
orderedProducer.setNamesrvAddr("10.1.54.121: 9876;10.1.54.122:9876"); // µ÷ÓÃstart()·½·¨Æô¶¯Ò»¸öproducerʵÀý
orderedProducer.start(); // ×Ô¶¨ÒåÒ»¸ötagÊý×é
String[] tags = new String[]{"TagA",
"TagB", "TagC", "TagD",
"TagE"}; // ·¢ËÍ10ÌõÏûÏ¢µ½TopicΪTopicTestOrdered£¬tag ΪtagsÊý×鰴˳Ðòȡֵ£¬
// keyֵΪ¡°KEY¡±Æ´½ÓÉÏiµÄÖµ£¬ÏûÏ¢ÄÚÈÝΪ ¡°Hello RocketMQ¡±Æ´½ÓÉÏiµÄÖµ
for (int i = 0; i < 10; i++) { int orderId = i % 10;
Message msg =
new Message("TopicTestOrdered",
tags[i % tags. length], "KEY" + i,
("Hello RocketMQ " + i).getBytes(RemotingHelper. DEFAULT_CHARSET)); SendResult sendResult = orderedProducer.send(msg,
new MessageQueueSelector() { // Ñ¡Ôñ·¢ËÍÏûÏ¢µÄ¶ÓÁÐ
@Override
public MessageQueue select(List<MessageQueue>
mqs, Message msg, Object arg) { // argµÄÖµÆäʵ¾ÍÊÇorderId
Integer id = (Integer) arg; // mqsÊǶÓÁм¯ºÏ£¬Ò²¾ÍÊÇtopicËù¶ÔÓ¦µÄËùÓжÓÁÐ
int index = id % mqs.size(); // ÕâÀï¸ù¾ÝÇ°ÃæµÄid¶Ô¶ÓÁм¯ºÏ´óСÇóÓàÀ´·µ»ØËù¶ÔÓ¦µÄ¶ÓÁÐ
return mqs.get(index);
}
}, orderId); System.out.println(sendResult);
} orderedProducer.shutdown();
} catch (MQClientException e) {
e.printStackTrace();
} catch (RemotingException e) {
e.printStackTrace();
} catch (MQBrokerException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} |
ÖÁÓÚÊÇҪʵÏÖÈ«¾ÖÓÐÐò£¬»¹ÊǾֲ¿ÓÐÐò£¬ÔÚ´ËʾÀý´úÂëÖУ¬¾ÍÈ¡¾öÓÚ TopicTestOrdered Õâ¸ö
Topic µÄ¶ÓÁÐÊýÁË¡£
Ïû·ÑÕß
public class
Consumer {
public static void main(String[] args) throws
MQClientException { //ÉùÃ÷²¢³õʼ»¯Ò»¸öconsumer
//ÐèÒªÒ»¸öconsumer groupÃû×Ö×÷Ϊ¹¹Ôì·½·¨µÄ²ÎÊý£¬ ÕâÀïΪconcurrent_consumer
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ordered_consumer"); //ͬÑùÒ²ÒªÉèÖÃNameServerµØÖ·
consumer.setNamesrvAddr("10.1.54.121:9876;10.1.54
.122:9876");
//ÕâÀïÉèÖõÄÊÇÒ»¸öconsumerµÄÏû·Ñ²ßÂÔ
//CONSUME_FROM_LAST_OFFSET ĬÈϲßÂÔ£¬´Ó¸Ã¶ÓÁÐ×îβ¿ªÊ¼Ïû·Ñ£¬ ¼´Ìø¹ýÀúÊ·ÏûÏ¢
//CONSUME_FROM_FIRST_OFFSET ´Ó¶ÓÁÐ×ʼ¿ªÊ¼Ïû·Ñ£¬ ¼´ÀúÊ·ÏûÏ¢£¨»¹´¢´æÔÚbrokerµÄ£©È«²¿Ïû·ÑÒ»±é
//CONSUME_FROM_TIMESTAMP ´Óij¸öʱ¼äµã¿ªÊ¼Ïû·Ñ£¬ ºÍsetConsumeTimestamp()ÅäºÏʹÓã¬Ä¬ÈÏÊǰë¸öСʱÒÔǰ
consumer.setConsumeFromWhere(ConsumeFromWhere. CONSUME_FROM_FIRST_OFFSET); //ÉèÖÃconsumerËù¶©ÔĵÄTopicºÍTag
consumer.subscribe("TopicTestOrdered",
"TagA || TagC || TagD"); //ÉèÖÃÒ»¸öListener£¬Ö÷Òª½øÐÐÏûÏ¢µÄÂß¼´¦Àí
//×¢ÒâÕâÀïʹÓõÄÊÇMessageListenerOrderlyÕâ¸ö½Ó¿Ú
consumer.registerMessageListener(new MessageListenerOrderly()
{ @Override
public ConsumeOrderlyStatus consumeMessage (
List <MessageExt> msgs, ConsumeOrderlyContext
context) {
System.out.println(Thread.currentThread().getName()
+ " Receive New Messages: " + msgs); //·µ»ØÏû·Ñ״̬
//SUCCESS Ïû·Ñ³É¹¦
//SUSPEND_CURRENT_QUEUE_A_MOMENT Ïû·Ñʧ°Ü£¬ÔÝÍ£µ±Ç°¶ÓÁеÄÏû·Ñ
return ConsumeOrderlyStatus.SUCCESS;
}
}); //µ÷ÓÃstart()·½·¨Æô¶¯consumer
consumer.start(); System.out.println("Consumer Started.");
}
} |
ÑÓʱÏûÏ¢
ÑÓʱÏûÏ¢£¬¼òµ¥À´Ëµ¾ÍÊǵ± producer ½«ÏûÏ¢·¢Ë͵½ broker ºó£¬»áÑÓʱһ¶¨Ê±¼äºó²ÅͶµÝ¸ø
consumer ½øÐÐÏû·Ñ¡£
RcoketMQµÄÑÓʱµÈ¼¶Îª£º1s£¬5s£¬10s£¬30s£¬1m£¬2m£¬3m£¬4m£¬5m£¬6m£¬7m£¬8m£¬9m£¬10m£¬20m£¬30m£¬1h£¬2h¡£level=0£¬±íʾ²»ÑÓʱ¡£level=1£¬±íʾ
1 ¼¶ÑÓʱ£¬¶ÔÓ¦ÑÓʱ 1s¡£level=2 ±íʾ 2 ¼¶ÑÓʱ£¬¶ÔÓ¦5s£¬ÒÔ´ËÀàÍÆ¡£
ÕâÖÖÏûÏ¢Ò»°ãÊÊÓÃÓÚÏûÏ¢Éú²úºÍÏû·ÑÖ®¼äÓÐʱ¼ä´°¿ÚÒªÇóµÄ³¡¾°¡£±ÈÈç˵ÎÒÃÇÍø¹ºÊ±£¬Ïµ¥Ö®ºóÊÇÓÐÒ»¸öÖ§¸¶Ê±¼ä£¬³¬¹ýÕâ¸öʱ¼äδ֧¸¶£¬ÏµÍ³¾ÍÓ¦¸Ã×Ô¶¯¹Ø±Õ¸Ã±Ê¶©µ¥¡£ÄÇôÔÚ¶©µ¥´´½¨µÄʱºò¾Í»á¾ÍÐèÒª·¢ËÍÒ»ÌõÑÓʱÏûÏ¢£¨ÑÓʱ15·ÖÖÓ£©ºóͶµÝ¸ø
consumer£¬consumer ½ÓÊÕÏûÏ¢ºóÔÙ¶Ô¶©µ¥µÄÖ§¸¶×´Ì¬½øÐÐÅжÏÊÇ·ñ¹Ø±Õ¶©µ¥¡£
ÉèÖÃÑÓʱ·Ç³£¼òµ¥£¬Ö»ÐèÒªÔÚMessageÉèÖöÔÓ¦µÄÑÓʱ¼¶±ð¼´¿É¡£
|