IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Amazon SQS 消息相关接口测试用例 -> 正文阅读

[开发测试]Amazon SQS 消息相关接口测试用例

Amazon SQS 消息相关接口测试用例

因项目功能需求,对接了Amazon的SQS消息队列,封装了常用的接口,本文是对部分接口测试用例的简要说明。

1.发送消息

1.1.发送单条消息到标准队列

@Test
public void sendMessage() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue2";

    // 封装消息内容
    JSONObject messageBody = new JSONObject();
    messageBody.put("type", "order");
    messageBody.put("action", "add");
    messageBody.put("userId", "658786756756");
    messageBody.put("skuId", "111");

    // 封装请求参数
    ReqSendMessageBody reqSendMessageBody = new ReqSendMessageBody();
    reqSendMessageBody.setQueueUrl(queueUrl);
    reqSendMessageBody.setMessageBody(messageBody.toJSONString());
    // 发往标准队列的消息可以设置延迟时间,对该条消息有效
    reqSendMessageBody.setDelaySeconds(60);
    /*
     发送消息时,可以添加一些自定义的消息属性。一个完整的消息属性必须包含name、dataType、value,缺一个都会抛出异常
     例如下面添加的属性名称sender(发送人),属性类型String(字符串类型),属性值mgq(自定义值)。
     */
    Map<String, MessageAttributeValue> messageAttributes = new HashMap<>();
    messageAttributes.put("sender", MessageAttributeValue.builder().dataType("String").stringValue("mgq").build());
    reqSendMessageBody.setMessageAttributes(messageAttributes);

    // 发送消息时,可以添加一些消息系统属性。
    Map<MessageSystemAttributeNameForSends, MessageSystemAttributeValue> messageSystemAttributes = new HashMap<>();
    
    /*
     目前只支持属性AWSTraceHeader,AWSTraceHeader属性是AWS 在2016 Re:Invent上推出的X-Ray的保留系统属性。(欲了解X-Ray请自行查阅相关资料)
     若给属性AWSTraceHeader随意传值,则会抛出异常:
     SqsException: The message system attribute 'AWSTraceHeader' is reserved for AWS X-Ray trace header. Value 'what is this?' is invalid.
     */
//      messageSystemAttributes.put(MessageSystemAttributeNameForSends.AWS_TRACE_HEADER,
//        MessageSystemAttributeValue.builder().dataType("String").stringValue("what is this?").build());

    /*
     看源码发现消息系统属性还有一个UNKNOWN_TO_SDK_VERSION,这个“属性”的值其实是null,不是真正的属性,可以理解为它是系统属性枚举的一个“空值”。
     所以不能添加消息系统属性UNKNOWN_TO_SDK_VERSION,否则会抛出异常:
     SqsException: Message system attribute name 'null' is invalid.
     */
//      messageSystemAttributes.put(MessageSystemAttributeNameForSends.UNKNOWN_TO_SDK_VERSION,
//        MessageSystemAttributeValue.builder().dataType("String").stringValue("What's the use of this?").build());

    reqSendMessageBody.setMessageSystemAttributes(messageSystemAttributes);

    // 调用sendMessage接口
    SendMessageResponse response = this.sqsApiSdk.getMessageApi().sendMessage(reqSendMessageBody);

    // 响应信息
    System.out.println("sendMessage response = " + response.toString());
  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
sendMessage response = SendMessageResponse(MD5OfMessageBody=926b9d4682aacf6b756987662b7b7ac9, MD5OfMessageAttributes=593e6a2572f2afcfac33d4a2632701f1, MessageId=38121dcc-57ce-48e0-8f4c-89184ec37591)


1.2.发送单条消息到FIFO队列

@Test
public void sendMessage2fifo() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue1.fifo";

    // 封装消息内容
    JSONObject messageBody = new JSONObject();
    messageBody.put("type", "order");
    messageBody.put("action", "add");
    messageBody.put("userId", "658786756756");
    messageBody.put("skuId", "111");

    // 封装请求参数
    ReqSendMessageBody reqSendMessageBody = new ReqSendMessageBody();
    reqSendMessageBody.setQueueUrl(queueUrl);
    reqSendMessageBody.setMessageBody(messageBody.toJSONString());

    /*
     消息组,可根据实际业务逻辑对消息进行分组。
     若整个队列中的消息都属于同一个消息组,则可以将发往这个队列的消息的MessageGroupId设置为一个统一值,例如:default
     */
    reqSendMessageBody.setMessageGroupId("default");
    /*
     消息重复id,队列会根据这个id判断消息是否重复,fifo队列不会将重复的消息加入队列。
     要么显示的传入MessageDeduplicationId,要么开启队列的“基于内容的重复消息删除”功能,否则会抛出异常:
     SqsException: The queue should either have ContentBasedDeduplication enabled or MessageDeduplicationId provided explicitly

     MessageDeduplicationId的值要根据实际业务逻辑和场景来生成,不能每次都生成一个随机值,否之就无法判断消息是否重复了。
     */
    reqSendMessageBody.setMessageDeduplicationId(messageBody.toJSONString());

    // 调用sendMessage接口
    SendMessageResponse response = this.sqsApiSdk.getMessageApi().sendMessage(reqSendMessageBody);

    // 响应信息
    System.out.println("sendMessage response = " + response.toString());
  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
sendMessage response = SendMessageResponse(MD5OfMessageBody=926b9d4682aacf6b756987662b7b7ac9, MessageId=077215e0-41fa-4144-9aea-8048598b09f1, SequenceNumber=37310312980864223744)

1.3.批量发送消息到标准队列

@Test
public void sendMessageBatch() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue2";

    // 封装参数
    ReqSendMessageBatchBody reqSendMessageBatchBody = new ReqSendMessageBatchBody();
    reqSendMessageBatchBody.setQueueUrl(queueUrl);
    List<ReqSendMessageBody> list = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
      ReqSendMessageBody item = new ReqSendMessageBody();
      /* !!!
       批量发送消息相较于单条发送,唯一需要注意的就是每条消息都需要有一个id,用于传达结果。
       id的值确保在本次调用中唯一即可。如果能使用业务中的某个字段值更好,便于联系实际业务。
       */
      item.setId(UUID.randomUUID().toString().replace("-", ""));
      item.setMessageBody(String.valueOf(i));
      list.add(item);
    }
    reqSendMessageBatchBody.setSendMessageList(list);

    // 调用sendMessageBatch接口
    RespSendMessageBatchBody response = this.sqsApiSdk.getMessageApi().sendMessageBatch(reqSendMessageBatchBody);

    // 响应信息
    System.out.println("failed num = " + response.getFailedList().size());
    for (BatchResultErrorEntry batchResultErrorEntry : response.getFailedList()) {
      // 此处的id即是请求参数中每条消息的id
      System.out.println("failed id = " + batchResultErrorEntry.id());
      System.out.println("failed code = " + batchResultErrorEntry.code());
      System.out.println("failed message = " + batchResultErrorEntry.message());
      System.out.println("failed senderFault = " + batchResultErrorEntry.senderFault());
    }
    System.out.println("successful num = " + response.getSuccessfulList().size());
    for (SendMessageBatchResultEntry sendMessageBatchResultEntry : response.getSuccessfulList()) {
      // 此处的id即是请求参数中每条消息的id
      System.out.println("successful id = " + sendMessageBatchResultEntry.id());
      System.out.println("successful messageId = " + sendMessageBatchResultEntry.messageId());
    }
  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
failed num = 0
successful num = 10
successful id = 27b5c8691eb44a4ea238c33867dfeb04
successful messageId = 495daa30-3d45-41d7-967a-53b5af067f05
successful id = 066f8c3f91724e7cb51eaf36e7fa1389
successful messageId = 0ab00678-39ab-465b-a3e7-c993bc8e94b1
。。。中间省略 。。。
successful id = 7ce275db247f498cad26ae1c589a932e
successful messageId = 4999a488-0de7-4320-b6b1-46dd9bd38f2a

1.4.批量发送消息到FIFO队列

@Test
public void sendMessageBatch2fifo() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue1.fifo";

    // 封装参数
    ReqSendMessageBatchBody reqSendMessageBatchBody = new ReqSendMessageBatchBody();
    reqSendMessageBatchBody.setQueueUrl(queueUrl);
    List<ReqSendMessageBody> list = new ArrayList<>();
    for (int i = 0; i < 12; i++) {
      ReqSendMessageBody item = new ReqSendMessageBody();
      String iStr = String.valueOf(i);
      /* !!!
       同样,批量发送时,每条消息都需要一个id来传达结果
       */
      item.setId(iStr);
      item.setMessageBody(iStr);
      item.setMessageGroupId("default");
      item.setMessageDeduplicationId(iStr);
      list.add(item);
    }
    reqSendMessageBatchBody.setSendMessageList(list);

    // 调用sendMessageBatch接口
    RespSendMessageBatchBody response = this.sqsApiSdk.getMessageApi().sendMessageBatch(reqSendMessageBatchBody);

    // 响应信息
    System.out.println("failed size = " + response.getFailedList().size());
    for (BatchResultErrorEntry batchResultErrorEntry : response.getFailedList()) {
      // !!! 此处的id即是请求参数中每条消息的id
      System.out.println("failed id = " + batchResultErrorEntry.id());
      System.out.println("failed code = " + batchResultErrorEntry.code());
      System.out.println("failed message = " + batchResultErrorEntry.message());
      System.out.println("failed senderFault = " + batchResultErrorEntry.senderFault());
    }
    System.out.println("successful size = " + response.getSuccessfulList().size());
    for (SendMessageBatchResultEntry sendMessageBatchResultEntry : response.getSuccessfulList()) {
      // !!! 此处的id即是请求参数中每条消息的id
      System.out.println("successful id = " + sendMessageBatchResultEntry.id());
      System.out.println("successful messageId = " + sendMessageBatchResultEntry.messageId());
      System.out.println("successful sequenceNumber = " + sendMessageBatchResultEntry.sequenceNumber());
    }
  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
failed size = 0
successful size = 12
successful id = 0
successful messageId = 8e40a9d6-b82d-4156-ae67-b7d5d58f9460
successful sequenceNumber = 37310316626961119232
successful id = 1
successful messageId = 7d635dc9-8674-4a68-9466-7613bea1d5c0
successful sequenceNumber = 37310316626961119233
。。。中间省略 。。。
successful id = 10
successful messageId = 26d6d1f9-2650-4776-a7c5-32919b2f4b1a
successful sequenceNumber = 37310316626992351232
successful id = 11
successful messageId = b095fe7a-bddd-40a4-9fa5-5a4261af6371
successful sequenceNumber = 37310316626992351233

2.检索消息

@Test
public void receiveMessage() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue2";

    // 封装参数
    ReqReceiveMessageBody reqReceiveMessageBody = new ReqReceiveMessageBody();
    reqReceiveMessageBody.setQueueUrl(queueUrl);
    /*
     最大10条,但是不一定返回几条
     当队列中消息数量较少时,甚至一条都不返回(空响应 或 虚假空响应)
     */
    reqReceiveMessageBody.setMaxNumberOfMessages(10);

    /*
     通过设置 waitTimeSeconds参数 启用长轮询(最长20秒),可有效避免空响应和虚假空响应,
     若 waitTimeSeconds值 较小,(响应超时)仍然有可能收到空响应,
     否则至少包含一条有效消息
     */
//      reqReceiveMessageBody.setWaitTimeSeconds(1);

    // 调用receiveMessage接口
    ReceiveMessageResponse response = this.sqsApiSdk.getMessageApi().receiveMessage(reqReceiveMessageBody);

    // 响应信息
    System.out.println("hasMessages = " + response.hasMessages());
    System.out.println("messages size = " + response.messages().size());
    for (Message message : response.messages()) {
      System.out.println("");
      System.out.println("messageId = " + message.messageId());
      System.out.println("body = " + message.body());
      System.out.println("receiptHandle = " + message.receiptHandle());
      // 得到消息,处理完业务逻辑后,可以通过句柄receiptHandle,执行删除消息等操作
    }

  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
hasMessages = true
messages size = 4

messageId = 90a330cc-b7af-459e-991d-2961d62c527c
body = {“title”:“body33”}
receiptHandle = AQEBvi83cqdDMxLPhbjr0I7ehR7ANGAoKbL3R5emvV/wgS2tJGISLOTkw9VGehNwmmpvXdeXQ2cUb1GdM4l0boxa/v4dxW2ybFPP+nXYKkRn6LZ3e+T8N62mAOwckNEHreA3F+d6BEE3u939wUb+PZRo79cJi1Z8lSroFQQ4ZJ6F4IngLmrvQOKx81/gp2SqvFFFKKrVBAE43openFl7GNZ1QBSO8cfAFz05uNzMR126ZlsfnShuhySq0if7HizwrLrDGthOcD7migbpJkCBtO1fBQ2DHCDWcYWQA+h0sWBJZfQ1kU/szfN5EVcvEy1Ktgog2EUmmtrdD7YS63CUyZB6vwTp6Uyf/0ob+pMmUrpbwnkpaACNVwaN2d2oAjPHi+ZLhMIrHNfNs6d40XGmqqyiIw==

messageId = 1ec332e4-ebbb-40df-b95e-467a9c89d994
body = {“title”:“body444”}
receiptHandle = AQEBkLUzUgStwRxUK8dNG3oKoFmca/+Xdet4fTUcQqN6Ruv2C3uPZnC7W59g+v9UBR5lhuDiuoyYILWH1pNeGnk1P83qlm1s3kaRYkk0gngjjH/PIsg1SmfasXt9Laj/yXqajdk3QA2+Qo2abYk3nMkP5gkbRXAKbmVMAmen2GxvOGnCY+sRFMy8qdOk6mOHx7/HU0AN1ZGabWT6ySo9e6KZI7dqMMkTBmBgswAGoj4JJ4uc/rVHtY1McYc4mJJ9gyKU1q3vIxLlViwFMpAJPxiD0LFWg2pLNZHhVH7jDaOPDxify0cO8OPr0+EDvs11wrIUZypWCNPFKf09AU4fOfXGnlTnXRfNG1GEYU3l/dlcI1ScsIVrT/XgkmQvrFybsDV0wAV4wxXswTqFFbojDuxNPQ==

messageId = 495daa30-3d45-41d7-967a-53b5af067f05
body = 0
receiptHandle = AQEBGiOdGapf5Sg9hWEZYSz+d2N5WLTxKD+LelWIMujMwp5LaWJgVu0goLhrPRGEnOF6V73gZiibLdmF2UC0pit3QJ2HWNu9uAiIP25k75NG02ZiXcS8gqy1k9r8HuNn20VijcfxMN2bGaidI5CoA8RM5kvvEr32kasnIkS7iPMkBnamNC6TFZesAaDUVMKfrkNN2L3tWYwd7TKXerI6547b1yzyNUihW32FYBT4l76h+0/u0yrwZOac2V6TGQ7dU1bBlAGNUqA4RTY0DR6td1DdZh5dPDYSoU/5nNv2RaHwI8pGGr7BlZuYYWhbWiZ6EvK9m4G+YxRQHGBsPa365+SfD6Ff565XDOvT8Tdt12oduwnZPVFcd8keODSGv6sTvUvIOhm8tDwiSfEaFLnm8PRarw==

messageId = 0ab00678-39ab-465b-a3e7-c993bc8e94b1
body = 1
receiptHandle = AQEBopnBcWMntuFwOAAnEyz13rYQBjNA0xey2sOwzOMLFcaE+2LoPlXXBYLSb0OIIrL2ENuTL9egpowQrnJ9g5Qk00fA7zQY3Eq2WEEYOCZ5TVfNA2cDPk+Yx5Ro9FEtBwwZIQVhsO97aFlgQZk69ujWuqNmyNds/vcNovVLCvvKzsHdyCH37y4lkrVb0pRA99wNSX2VY3X2k9y+2+5zzjKTveq0DFVyPmKo9XBu35hijQGeWCQFE78Io2PlLEEOmYWm7nyhfh2SRfOB9Qj/FDRYn7QArSZGbcwng8A0aVH2UuaTr7vo2tWVP64HnW4TGeErlQ4UjjuUkvMzveX+Ti4jgFNPPwLL+MRP29VspgfZSkujnjNj+BUJ1aZUes/edIavW1nyqYmzf7zf+6awIq3dAQ==

3.删除消息

3.1.删除单条消息

@Test
public void deleteMessage() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue2";
    // 接收消息
    ReqReceiveMessageBody reqReceiveMessageBody = new ReqReceiveMessageBody();
    reqReceiveMessageBody.setQueueUrl(queueUrl);
    reqReceiveMessageBody.setWaitTimeSeconds(1);
    reqReceiveMessageBody.setMaxNumberOfMessages(1);
    ReceiveMessageResponse response = this.sqsApiSdk.getMessageApi().receiveMessage(reqReceiveMessageBody);

    // 调用删除请求
    if (response.hasMessages()) {
      for (Message message : response.messages()) {
        System.out.println("");
        System.out.println("messageId = " + message.messageId());
        // 处理各种业务逻辑后,通过句柄receiptHandle删除消息
        String receiptHandle = message.receiptHandle();
        System.out.println("receiptHandle = " + receiptHandle);
        this.sqsApiSdk.getMessageApi().deleteMessage(queueUrl, receiptHandle);
      }
    }
    System.out.println("deleteMessage succeed.");
  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
messageId = ed7f480d-9120-4d18-aee0-9f830618a074
receiptHandle = AQEBGCX0RgMinlXqCVzizeKa7T0pZQLmuwP6QjAHkUHKcvKJNvxYRFGgvlUImyGAFbCaommYbn8esmrkWhzArKXTXJj1qwqQHvidmwFflOONbj1DWf28MJ29fqzLIy/9IQp2us99chcAAkHFiS70vpeMJHc3hq9X1KLIbEUbI4elS6xMrtpIvzL1XFAOa6wrwq0apUtsGaaI52I9HvL5VIv790nV8/jCQgSFWq5AO0HyfJbgemui4QWK7qH60s0ITIiDjq62qYzsNIyUeGliSBqYI5orzACTgh9h1Y2Wnp9tIx8mCnhASrdG8Qi6vNixqvgZJxijGDsY3mGEzhV1ELfsBoFBFn74Z9VbMwYTgNiUvB8psP9H9DrySnBsOnSbFIZmJoGoPBJseXVWkPrLAOD8pw==
deleteMessage succeed.

3.2.批量删除消息

@Test
public void deleteMessageBatch() {
  try {
    // 队列url
    String queueUrl = "https://sqs.cn-northwest-1.amazonaws.com.cn/4203XXXX2685/queue2";

    // 接收消息
    ReqReceiveMessageBody reqReceiveMessageBody = new ReqReceiveMessageBody();
    reqReceiveMessageBody.setQueueUrl(queueUrl);
    reqReceiveMessageBody.setWaitTimeSeconds(2);
    reqReceiveMessageBody.setMaxNumberOfMessages(10);
    ReceiveMessageResponse response = this.sqsApiSdk.getMessageApi().receiveMessage(reqReceiveMessageBody);
    
    // 封装批量删除请求参数
    List<ReqDeleteMessageBatchBody> list = new ArrayList<>();
    for (Message message : response.messages()) {
      ReqDeleteMessageBatchBody body = new ReqDeleteMessageBatchBody()
        .setId(message.messageId()).setReceiptHandle(message.receiptHandle());
      list.add(body);
    }
    System.out.println("delete size = " + list.size());
    // 调用批量删除请求
    RespDeleteMessageBatchBody deleteMessageBatchResponse = this.sqsApiSdk.getMessageApi().deleteMessageBatch(queueUrl, list);

    // 响应信息
    System.out.println("deleteMessageBatch succeed.");
    List<BatchResultErrorEntry> failedList = deleteMessageBatchResponse.getFailedList();
    System.out.println("failedList size = " + failedList.size());
    for (BatchResultErrorEntry batchResultErrorEntry : failedList) {
      System.out.println("failed id = " + batchResultErrorEntry.id());
      System.out.println("failed code = " + batchResultErrorEntry.code());
      System.out.println("failed message = " + batchResultErrorEntry.message());
      System.out.println("failed senderFault = " + batchResultErrorEntry.senderFault());
    }
    List<DeleteMessageBatchResultEntry> successfulList = deleteMessageBatchResponse.getSuccessfulList();
    System.out.println("successfulList size = " + successfulList.size());
    for (DeleteMessageBatchResultEntry deleteMessageBatchResultEntry : successfulList) {
      System.out.println("delete id = " + deleteMessageBatchResultEntry.id());
    }
  } catch (SqsException e) {
    e.printStackTrace();
  }
}

控制台打印:
deleteMessageBatch succeed.
failedList size = 0
successfulList size = 5
delete id = 162f8ee0-a914-4a84-9426-27ecfc066596
delete id = cab709ce-e0d6-4eb9-9525-f1ce9db4057b
delete id = 8be12f13-6253-4fc0-b43d-1c3963f65778
delete id = 9b64ee4b-c2f0-431e-a9d0-07e1dcd9725f
delete id = 4999a488-0de7-4320-b6b1-46dd9bd38f2a

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:51:54  更:2021-08-08 11:52:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/2 23:22:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码