API มิดเดิลแวร์ส่วนใหญ่จะแสดงผลออบเจ็กต์ SdvResult หากสำเร็จ ออบเจ็กต์นี้จะมีออบเจ็กต์ผลลัพธ์ที่คาดไว้ หากไม่สำเร็จ ออบเจ็กต์นี้จะมีออบเจ็กต์ SdvStatus ซึ่งบ่งบอกถึงลักษณะการทำงานที่ไม่คาดคิดหรือเงื่อนไขข้อผิดพลาด ซึ่งมักจะระบุด้วยรหัสข้อผิดพลาด เช่น Internal, Unavailable หรือ DataLoss
หน้านี้จะช่วยคุณแก้ปัญหารหัสข้อผิดพลาดเหล่านี้
แก้ปัญหาการลงทะเบียนและการสร้างไม่สำเร็จ
การลงทะเบียนและการสร้างไม่สำเร็จมักเกิดขึ้นเมื่อคุณพยายามสร้างหรือลงทะเบียนบริการที่ไม่ถูกต้อง
สร้างบริการที่ 2 ไม่ได้
ข้อผิดพลาด:
ข้อผิดพลาด Internal
สาเหตุ:
คุณพยายามลงทะเบียนอินสแตนซ์ของชุดบริการเดียวกัน (ชื่อและรหัสอินสแตนซ์) 2 ครั้ง
วิธีแก้ไข:
อย่าพยายามลงทะเบียนอินสแตนซ์ของชุดบริการเดียวกัน (ชื่อและรหัสอินสแตนซ์) 2 ครั้ง
ลบชุดบริการที่ซ้ำกันไม่ได้
ข้อผิดพลาด:
Status(-3, EX_ILLEGAL_ARGUMENT)
สาเหตุ:
คุณพยายามลบชุดบริการที่ซ้ำกันซึ่งไม่มีอยู่
วิธีแก้ไข:
อย่าพยายามลบชุดบริการที่ซ้ำกันซึ่งไม่มีอยู่
เรียกอินสแตนซ์ของผู้เผยแพร่โฆษณาเพื่อส่งข้อความไม่ได้
ข้อผิดพลาด:
การเรียก take_publisher() จะแสดงผล none
สาเหตุ:
คุณเรียก take_publisher() 2 ครั้งสำหรับตัวแปรเดียวกันจากอินสแตนซ์ของชุดบริการเดียวกัน
วิธีแก้ไข:
อย่าเรียก take_publisher() 2 ครั้งสำหรับตัวแปรเดียวกันจากอินสแตนซ์ของชุดบริการเดียวกัน
สร้าง Subscriber, Observer, History หรือ InstantReader ไม่ได้
ข้อผิดพลาด:
ข้อผิดพลาด Unavailable
สาเหตุ:
คุณพยายามสร้าง Subscriber, Observer, History หรือ InstantReader สำหรับผู้เผยแพร่โฆษณาที่ไม่มีอยู่หรือยกเลิกการลงทะเบียนแล้ว
วิธีแก้ไข:
ตรวจสอบว่าผู้เผยแพร่โฆษณามีอยู่หรือลงทะเบียนแล้วก่อนที่จะพยายามสร้าง Subscriber, Observer, History หรือ InstantReader สำหรับผู้เผยแพร่โฆษณา
สร้างไคลเอ็นต์ RPC ไม่ได้
ข้อผิดพลาด:
ข้อผิดพลาด Unavailable
สาเหตุ:
คุณพยายามสร้างไคลเอ็นต์ RPC สำหรับชื่อหน่วยเซิร์ฟเวอร์ที่ไม่มีอยู่หรือไม่ได้ลงทะเบียน
วิธีแก้ไข:
ตรวจสอบว่าเซิร์ฟเวอร์มีอยู่และลงทะเบียนแล้วก่อนที่จะสร้างไคลเอ็นต์ RPC
แก้ปัญหาการสื่อสารไม่สำเร็จ
การสื่อสารไม่สำเร็จอาจเกิดขึ้นหลังจากที่บริการทำงานเสร็จแล้วและเริ่มสื่อสารกับบริการอื่นๆ
แก้ปัญหาการยกเลิกการลงทะเบียนผู้เผยแพร่โฆษณา
ข้อผิดพลาดอาจเกิดขึ้นเมื่อผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านยังคงใช้งานอยู่
read_next_messages() ของ Subscriber แสดงผลรายการว่าง
ข้อผิดพลาด:
read_next_messages() ทำงานสำเร็จแต่แสดงผลรายการว่าง
สาเหตุ:
ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนแล้วและไม่มีข้อความใหม่
next() ของ Observer แสดงผลข้อผิดพลาดภายใน
ข้อผิดพลาด:
next() แสดงผลข้อผิดพลาด Internal
สาเหตุ:
ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาหายไปแล้วและไม่มีข้อความใหม่
read_from_history() ของ History ไม่แสดงผลข้อความใหม่
ข้อผิดพลาด:
read_from_history() ไม่แสดงผลข้อความใหม่ แต่แสดงผลเฉพาะข้อความเก่า
สาเหตุ:
ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาหายไปแล้วและไม่มีข้อความใหม่
read_latest_message() ของ InstantReader แสดงผลข้อผิดพลาดภายใน
ข้อผิดพลาด:
read_latest_message() แสดงผลข้อผิดพลาด Internal
สาเหตุ:
ผู้เผยแพร่โฆษณายกเลิกการลงทะเบียนในขณะที่ผู้อ่านใช้งานอยู่
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานไม่พร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาหายไปแล้วและไม่มีข้อความใหม่
แก้ปัญหาคิวข้อความว่าง
ข้อผิดพลาดอาจเกิดขึ้นเมื่อพยายามอ่านจากคิวข้อความว่าง
read_next_messages() ของ Subscriber แสดงผลรายการว่าง
ข้อผิดพลาด:
read_next_messages() แสดงผลรายการว่างสำเร็จ
สาเหตุ:
ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่
next() ของ Observer แสดงผลข้อผิดพลาดภายใน
ข้อผิดพลาด:
next() แสดงผลข้อผิดพลาด Internal
สาเหตุ:
ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่
read_from_history() ของ History ไม่แสดงผลข้อความใหม่
ข้อผิดพลาด:
read_from_history() แสดงผลรายการว่างสำเร็จ
สาเหตุ:
ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่
read_latest_message() ของ InstantReader แสดงผลข้อผิดพลาดภายใน
ข้อผิดพลาด:
read_latest_message() แสดงผลข้อผิดพลาด Internal
สาเหตุ:
ผู้เผยแพร่โฆษณาใช้งานอยู่แต่ยังไม่ได้ส่งข้อความ
วิธีแก้ไข:
ใช้ Subscriber หรือ History ที่มีสตรีมความพร้อมใช้งาน หากข้อความสุดท้ายของสตรีมความพร้อมใช้งานพร้อมใช้งาน แสดงว่าผู้เผยแพร่โฆษณาใช้งานอยู่และไม่มีข้อความใหม่
แก้ปัญหาบัฟเฟอร์ล้นหรือข้อมูลรั่วไหล
ข้อผิดพลาดอาจเกิดขึ้นเมื่อผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้
การอ่านครั้งแรกของ Subscriber หลังจากบัฟเฟอร์ล้นจะแสดงผลข้อผิดพลาด DataLoss
ข้อผิดพลาด:
read_next_message() แสดงผลข้อผิดพลาด DataLoss
สาเหตุ:
ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้
วิธีแก้ไข:
next() ครั้งแรกของ Observer หลังจากบัฟเฟอร์ล้นจะแสดงผลข้อผิดพลาด DataLoss
ข้อผิดพลาด:
next() แสดงผลข้อผิดพลาด DataLoss
สาเหตุ:
ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้
วิธีแก้ไข:
ผู้เผยแพร่โฆษณาเผยแพร่ช้าลง เช่น คุณอาจมีตัวแปรที่มีการประทับเวลาของข้อความล่าสุด หากเวลาปัจจุบันน้อยกว่าเวลาเผยแพร่ล่าสุดบวกกับเดลต้า คุณจะไม่เผยแพร่ข้อความ กลไกนี้จะเผยแพร่ข้อความอย่างมาก 1 ข้อความต่อเดลต้า
ผู้รับใช้
InstantReadออบเจ็กต์แทน ObserverInstantReadออบเจ็กต์จะไม่แสดงผลข้อผิดพลาดบัฟเฟอร์ล้นและจะแสดงผลข้อความสุดท้ายเสมอ หากข้อความสุดท้ายเป็นข้อความเดียวที่คุณสนใจ คุณสามารถใช้InstantReadออบเจ็กต์แทน Observer ได้ผู้รับใช้การสุ่มตัวอย่าง หากโซลูชันของคุณมีผู้เผยแพร่โฆษณา (P1) ที่เผยแพร่ข้อความเร็วกว่าที่ Observer (01) จะอ่านได้ คุณสามารถสร้างผู้เผยแพร่โฆษณา (P2) และ Observer (02) ใหม่เพื่อรองรับความแตกต่างของความเร็วในการเผยแพร่และการอ่าน
ตัวอย่างเช่น สมมติว่า P1 เผยแพร่ข้อความทุกๆ 10 มิลลิวินาที แต่ O1 อ่านได้เพียงข้อความเดียวทุกๆ 100 มิลลิวินาทีและละทิ้งข้อความที่เหลืออีก 9 ข้อความ หากต้องการแก้ไขความคลาดเคลื่อน ให้สร้างโซลูชันที่ทำตามขั้นตอนต่อไปนี้
- P1 เผยแพร่ข้อความไปยัง O2
- O2 อ่านข้อความ 1 ข้อความและละทิ้งข้อความอีก 9 ข้อความ
- O2 ส่งข้อความที่อ่านแล้ว 1 ข้อความไปยัง P2
- P2 ส่งข้อความที่อ่านแล้ว 1 ข้อความไปยัง O1
- O1 อ่านข้อความ 1 ข้อความทุกๆ 10 วินาที
โค้ดตัวอย่างต่อไปนี้แสดงวิธีใช้สถานการณ์การสุ่มตัวอย่างนี้
int discarded_message = 10; while (true) { message m = O2.read_message(); if discarded_message == 10 { discarded_message = 0; P2.publish(m); } else { discarded_message ++; } }
การอ่านของ History ไม่สมบูรณ์
ข้อผิดพลาด:
ข้อความสูญหายก่อนที่จะคัดลอกประวัติ ไม่มีการแจ้งเตือนข้อผิดพลาดโดยตรงเมื่ออ่าน
สาเหตุ:
ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้
วิธีแก้ไข:
InstantReader อ่านเฉพาะข้อความสุดท้าย
ข้อผิดพลาด:
ข้อความสูญหายก่อนที่จะคัดลอกประวัติ ไม่มีการแจ้งเตือนข้อผิดพลาดโดยตรงเมื่ออ่าน
สาเหตุ:
ผู้เผยแพร่โฆษณาส่งข้อความเร็วกว่าที่ผู้อ่านจะรับได้
วิธีแก้ไข:
ไม่มี
ไคลเอ็นต์ RPC เรียกใช้เมธอด แต่เมธอดไม่พร้อมใช้งาน
ข้อผิดพลาด:
การเรียกใช้เมธอดไม่สำเร็จเนื่องจากข้อผิดพลาด Unavailable
สาเหตุ:
SDV ไม่รู้จักชื่อเซิร์ฟเวอร์และแสดงผล Unavailable มิดเดิลแวร์จะแสดงผลข้อผิดพลาดนี้หาก Service Discovery ไม่แสดงผลชื่อเซิร์ฟเวอร์ที่ถูกต้อง
วิธีแก้ไข:
เริ่มชุดบริการที่กำหนด server สำหรับอินเทอร์เฟซที่ไคลเอ็นต์ต้องการใช้
การติดตั้งใช้งานฝั่งเซิร์ฟเวอร์แสดงผลข้อผิดพลาด SdvStatus
ข้อผิดพลาด:
การติดตั้งใช้งานฝั่งเซิร์ฟเวอร์แสดงผล SdvResult ที่มี SdvStatus
ข้อผิดพลาด เช่น SdvStatusCode::NotFound ระบบจะส่งต่อข้อผิดพลาดกลับไปยังไคลเอ็นต์ที่เรียกใช้
สาเหตุ:
SDV และระบบการสื่อสารระหว่างไคลเอ็นต์กับเซิร์ฟเวอร์ทำงานตามที่คาดไว้ แต่ไคลเอ็นต์ส่งคำขอที่ทำให้เกิดข้อผิดพลาดในเซิร์ฟเวอร์
วิธีแก้ไข:
ส่งคำขอที่ถูกต้องด้วยไคลเอ็นต์หรือแก้ไขเซิร์ฟเวอร์เพื่อให้ตอบสนองต่อคำขอเหล่านั้นได้สำเร็จ