Penanganan Kesalahan dengan Apache Camel dan ActiveMQ - sehingga keluar dari jalur pipa untuk pertukaran

Saya telah bolak-balik dengan masalah pada sistem kami yang bahkan dengan beberapa penelitian di forum dan beberapa tes, kami sepertinya tidak dapat memperbaikinya.

Saya akan mencoba menjelaskan sejelas mungkin tentang apa yang sedang kita hadapi

Kami memiliki layanan utama dengan rute yang membaca dari antrian activemq (boot musim semi dengan broker tertanam) mengirimkannya ke Route(B) dan kemudian mengirimkan semuanya ke Route(C) terakhir. Rute(B) bergantung pada layanan.

Versi Unta: 3.3.0 Versi boot musim semi: 2.3.3.RELEASE

Rute A:

 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")

Rute B:

 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

Rute C:

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

Konfigurasi activemq Spring Boot

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

Semuanya berjalan sangat baik dan lancar ketika prosesor B tidak mengeluarkan pengecualian. Ketika hal ini terjadi, meskipun mereka sedang dirawat dan objek normal dikembalikan ke isi pesan, yang kita miliki di log hanyalah

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. {}

Kami bahkan menambahkan penangan kesalahan default ke pabrik koneksi activemq kami tetapi tidak ada yang terjadi di sana juga. Kami memiliki konsumen DLQ yang sepertinya juga tidak mendapatkan apa-apa. Pemroses kesalahan pada ruteA juga tidak menangkap apa pun yang diharapkan sejak pengecualian ditangani sebelumnya.

Adakah yang pernah mengalami masalah ini atau serupa? Saya tahu bahwa beberapa masalah antara Camel dan komponen JMS mengenai penanganan kesalahan pernah dikemukakan di masa lalu, tetapi kami kesulitan memahami apa akar masalah ini.

Terima kasih sebelumnya, Pedro


person NokusFerreira    schedule 10.04.2021    source sumber


Jawaban (1)


Mungkin yang Anda cari adalah opsi lanjutan pada klausa pengecualian Rute B Anda. Opsi ini memungkinkan Anda untuk melanjutkan perutean ke rute asli seolah-olah pengecualian tidak terjadi. Jangan gunakan opsi ditangani karena tidak akan memungkinkan perutean ke rute asli tetapi keluar. Jadi Rute B Anda harus didefinisikan seperti ini:

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

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

Lihat dokumentasi unta untuk detail lebih lanjut: KLAUSUL PENGECUALIAN CAMEL

person Avijit Gupta    schedule 22.04.2021