Apache camel DefaultExchange的并发修改

Apache camel DefaultExchange的并发修改,apache-camel,Apache Camel,我必须确保运行路由的线程(以及错误处理程序)能够在exchange实例上看到异常集,如果该实例由多个线程共享,并且异常是由其中一个线程设置的 我有一个路由步骤,在代理到实际的web服务器之前对输入流(jetty端点)中的数据进行处理。对于流数据操作,我使用流管道(PipedInputStream/PipedOutputStream),它需要在每个管道元素各自的线程中运行。每个管道元素都保存对exchange的引用,如果遇到错误,则在exchange上设置异常。 这似乎工作正常。但我不认为它一定能

我必须确保运行路由的线程(以及错误处理程序)能够在exchange实例上看到异常集,如果该实例由多个线程共享,并且异常是由其中一个线程设置的

我有一个路由步骤,在代理到实际的web服务器之前对输入流(jetty端点)中的数据进行处理。对于流数据操作,我使用流管道(
PipedInputStream
/
PipedOutputStream
),它需要在每个管道元素各自的线程中运行。每个管道元素都保存对exchange的引用,如果遇到错误,则在exchange上设置异常。 这似乎工作正常。但我不认为它一定能工作,因为
异常
不是
易失性
成员
默认交换
。因此,主线程不能保证看到工作线程在exchange上设置的异常。工作线程本身都使用我提供的
ReentrantLock
作为交换属性(属性映射是
ConcurrentHashMap
)来同步它们对交换的访问。因此,工作线程之间的数据可见性不应成为问题。 但是如何为主线程执行此操作

我看了一下拆分器的实现,以及它如何处理并行执行和聚合。据我所知,拆分器通过返回主线程以前从未见过的交换的
AtomicReference
来增强可见性。原子引用引用的交换在原子引用上设置后被视为只读。因此,主线程中原子引用上的
get()
保证可以看到引用的exchange实例的最新版本

我不能应用这种方法,因为它需要主线程等待工人完成处理。如果我阻止主线程,我的工作线程将被阻止,并且主线程负责使用最后一个
PipedInputStream
元素中修改的输入流内容并将其转发到web服务器

我也找不到一个工厂机制,允许我告诉Camel实例化我自己的
Exchange
接口实现(带有一个易失性成员“exception”)。 (
DefaultException
似乎也没有考虑子分类。例如,
DefaultException::isFailed()
使用私有成员
exception
而不是
DefaultException::getException()
作为答案。但这是另一个问题。)

有人有其他想法吗

(交叉张贴)