เกิดข้อผิดพลาดในการจัดการกับ Apache Camel และ ActiveMQ - จึงไม่อยู่ในขั้นตอนการแลกเปลี่ยน

ฉันกลับไปกลับมาพร้อมกับปัญหาในระบบของเรา ซึ่งแม้จะมีการค้นคว้าเกี่ยวกับฟอรัมและการทดสอบหลายครั้ง แต่เราก็ดูเหมือนจะไม่สามารถแก้ไขได้

ฉันจะพยายามทำให้ชัดเจนที่สุดเท่าที่จะทำได้กับสิ่งที่เรากำลังเผชิญอยู่

เรามีบริการหลักพร้อมเส้นทางที่อ่านจากคิว activemq ( spring boot พร้อมโบรกเกอร์แบบฝัง ) ส่งไปยัง Route(B) จากนั้นจัดส่งทุกอย่างไปยัง Route(C) สุดท้าย Route(B) ขึ้นอยู่กับบริการ

เวอร์ชัน Camel: 3.3.0 เวอร์ชัน Spring-boot: 2.3.3.RELEASE

เส้นทาง ก:

 onException(Exception::class.java)
            .handled(true)
            .bean("foo.ErrorProcessor", "processError")

 from("activemq:queue:myqueue")
            .routeId("myroute")
            .to("direct:my_external_route")
            .to(ExchangePattern.InOnly,"direct:myroute_result")

เส้นทาง ข:

 onException(Exception::class.java)
            .handled(true)
            .bean("foo.ErrorProcessor", "processError")

 from("direct:my_external_route")
            .routeId("my_external_route")
            .process {something()} //This processor can throw exceptions that are treated in our processor

เส้นทาง ค:

from("direct:myroute_result")
      .process(someProcess())
      .to(ExchangePattern.InOnly,"activemq:queue:results_queue")

Spring Boot กำหนดค่า activemq

spring:
  jmx:
    enabled: true
  activemq:
    broker-url: vm://localhost?broker.persistent=false,useShutdownHook=false
    in-memory: true
    non-blocking-redelivery: true
    packages:
      trust-all: false
      trusted: com.mypackage
    pool:
      block-if-full: true
      block-if-full-timeout: -1
      enabled: false
      idle-timeout: 30000
      max-connections: 10
      time-between-expiration-check: -1
      use-anonymous-producers: true

ทุกอย่างทำงานได้ดีและราบรื่นเมื่อโปรเซสเซอร์ของ B ไม่มีข้อยกเว้น เมื่อมันเป็นเช่นนั้น แม้ว่าพวกมันจะได้รับการปฏิบัติและมีการส่งคืนออบเจ็กต์ปกติในเนื้อหาข้อความ แต่ทั้งหมดที่เรามีในบันทึกก็คือ

2021-04-10 15:33:32.354 DEBUG [#1 - JmsConsumer[consumerName]] o.a.c.p.Pipeline                   
: Message exchange has failed: so breaking out of pipeline for exchange: Exchange[ID-1234] Handled by the error handler. {}

เรายังเพิ่มตัวจัดการข้อผิดพลาดเริ่มต้นให้กับแฟกทอรีการเชื่อมต่อ activemq ของเราด้วย แต่ก็ไม่มีอะไรเกิดขึ้นที่นั่นเช่นกัน เรามีผู้บริโภค DLQ ที่ดูเหมือนจะไม่ได้รับอะไรเลย ตัวประมวลผลข้อผิดพลาดบนเส้นทาง A ตรวจไม่พบสิ่งที่คาดหวังเนื่องจากมีการจัดการข้อยกเว้นก่อนหน้านี้

มีใครเคยประสบปัญหานี้หรือคล้ายกันหรือไม่ ฉันรู้ว่าปัญหาบางอย่างระหว่าง Camel และส่วนประกอบ JMS เกี่ยวกับการจัดการข้อผิดพลาดเกิดขึ้นในอดีต แต่เรากำลังดิ้นรนเพื่อทำความเข้าใจว่าอะไรคือสาเหตุของปัญหานี้

ขอบคุณล่วงหน้าเปโดร


person NokusFerreira    schedule 10.04.2021    source แหล่งที่มา


คำตอบ (1)


บางทีสิ่งที่คุณกำลังมองหาคือตัวเลือก ต่อ ในส่วนคำสั่งข้อยกเว้น Route B ของคุณ ตัวเลือกนี้ช่วยให้คุณสามารถกำหนดเส้นทางต่อไปยังเส้นทางเดิมได้เสมือนว่าไม่มีข้อยกเว้นเกิดขึ้น อย่าใช้ตัวเลือก จัดการ เนื่องจากจะไม่อนุญาตให้มีการกำหนดเส้นทางไปยังเส้นทางเดิม แต่จะแยกออก ดังนั้น Route B ของคุณควรกำหนดไว้ดังนี้:

onException(Exception::class.java)
.continued(true)
.bean("foo.ErrorProcessor", "processError")

from("direct:my_external_route")
.routeId("my_external_route")
.process {something()}

โปรดดูเอกสารประกอบของ Camel สำหรับรายละเอียดเพิ่มเติม: ประโยคข้อยกเว้นของ CAMEL

person Avijit Gupta    schedule 22.04.2021