从处理器内部设置 Camel 交换属性

Java 8 和 Camel 2.19.x 在这里。我有以下骆驼路线:


<route id="widgetProcessing">

  <from uri="activemq:inputQueue"/>

  <to uri="{{widgetFetcher}}"/>

</route>

和widgetFetcher处理器:


@Component("widgetFetcher")

public class WidgetFetcher {

  private WidgetDao widgetDao;


  public WidgetFetcher(WidgetDao widgetDao) {

    this.widgetDao = widgetDao;

  }


  public Widget getWidgetToProcess() {

    // get the next widget id from the database

    final Integer firstWidgetId = widgetDao.getFirstSubmittedWidgetId();


    // Do lots of stuff with 'firstWidgetId' down here...

  }

}

我想在 之后<from>和之前创建一个交换属性WidgetFetcher,并将该属性的初始值设置为null; 然后有条件地将其值设置为WidgetFetcher. 此外,我希望这个重新分配的值在剩余的路线/处理中“坚持”。所以像:


<route id="widgetProcessing">

  <from uri="activemq:inputQueue"/>


  <setProperty propertyName="fizzId">

    <constant>null</constant>

  </setProperty>


  <to uri="{{widgetFetcher}}"/>


  <log message="fizzId = ${property[fizzId]}" loggingLevel="ERROR"/>

</route>

接着:


public Widget getWidgetToProcess(@ExchangeProperty("fizzId") final String fizzId) {

  // get the next widget id from the database

  final Integer firstWidgetId = widgetDao.getFirstSubmittedWidgetId();


  if (someMethodReturnsTrue()) {

    // Does this actually get saved outside the 

    log.info("About to update fizzId...")

    fizzId = UUID.randomUUID().toString();

  }


  // Do lots of stuff with 'firstWidgetId' down here...

}

然而,在运行时,本地分配fizzId = ...似乎并没有被日志输出读取:


About to update fizzId...

fizzId = null

所以我认为我的处理器正在接收交换属性的副本,fizzId但是重新分配它的值内联实际上并没有修改路由其余部分的实际值。关于如何做到这一点的任何想法?


尚方宝剑之说
浏览 110回答 2
2回答

青春有我

不要将属性传递给处理器,而是接受交换 - 然后您可以在交换上设置属性。

森林海

您可能需要参考更高的东西来设置值。尝试对完整的属性映射 @Properties 使用注释,或者让您的 WidgetFetcher 实现处理器以获取对完整交换的引用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java