Область уровня маршрута для bean-компонента в схеме верблюда

Я разрабатываю одно приложение camel, в котором я хочу сохранить область действия beans на уровне маршрута. Это означает, что если я вызываю один bean-компонент из двух разных маршрутов, должны быть созданы два экземпляра, но внутри этого маршрута для этого bean-компонента должен использоваться один и тот же единственный экземпляр. Вот мой код:

<bean id="testbean" class="testClass">  </bean>
<camelContext id="test"
        xmlns="http://camel.apache.org/schema/blueprint">
    <route id="1">
        <from uri="timer"/>
        <to uri="bean:test"/>
    </route>
    <route id="2">
       <from uri="timer"/>
       <to uri="bean:test"/>  
    </route>
</camelContext>

Здесь, на маршруте 2, должен быть создан отдельный экземпляр bean-компонента. Пожалуйста, предложите, если есть идеи.


person nik    schedule 17.04.2018    source источник
comment
Почему вы хотите это сделать, в чем причина этого?   -  person Claus Ibsen    schedule 17.04.2018
comment
@ClausIbsen - потому что, если маршрут 1 выполняет некоторую обработку в одном экземпляре тестового класса, я не хочу, чтобы маршрут 2 использовал тот же экземпляр этого класса. У него должен быть свой собственный экземпляр компонента. Есть ли способ, чтобы я может вызвать маршрут 2 только после того, как маршрут 1 завершит свою задачу.   -  person nik    schedule 17.04.2018
comment
@nik, ты не совсем отвечаешь на вопрос. Какое требование заставляет вас думать, что вам нужны два экземпляра на каждом маршруте как решение, реализующее это требование?   -  person Ralf    schedule 17.04.2018
comment
@Ralf - Спасибо за ваш запрос. Мне нужен один экземпляр на маршрут, а не два экземпляра на маршрут.   -  person nik    schedule 18.04.2018
comment
@Ralf - Я только что прочитал об областях видимости bean-компонентов, может ли определение bean-компонента с помощью прототипа предоставить мне такую ​​функциональность?   -  person nik    schedule 18.04.2018


Ответы (1)


В Apache Camel и подобных ему не поддерживаются bean-компоненты с областью действия маршрута. У вас могут быть общие одноэлементные bean-компоненты или прототипы beans (новый экземпляр за вызов). Это области, которые исходят от Spring XML или Blueprint XML.

Чтобы использовать область видимости прототипа, вам необходимо:

  • объявить bean-компонент как прототип в Spring / Blueprint XML
  • установить параметр cache=false в конечной точке bean:xxx в Camel

Вы также можете подумать о наличии двух бобов, например

<bean id="testbean" class="testClass">  </bean>
<bean id="testbean2" class="testClass">  </bean>

Затем используйте testbean в первом маршруте и testbean2 во втором маршруте.

person Claus Ibsen    schedule 18.04.2018
comment
Большое спасибо. Это была та информация, которая мне была нужна. - person nik; 18.04.2018
comment
В онлайн-документе bean-компонента нет указаний на то, что cache=false необходим для прототипа bean-компонентов. . Может стоит добавить? - person Ralf; 18.04.2018
comment
Обновленные документы находятся по адресу: github.com/apache/camel/blob/master/camel-core/src/main/docs/ - а кеш по умолчанию является ложным, поэтому вам не нужно его устанавливать - person Claus Ibsen; 18.04.2018