Apache骆驼中如何调用bean方法?

时间:2021-06-28 06:29:45

标签: java apache-camel

这是我的豆子

package beans;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class setFileNames {
    public String getCityName(Document document) {
        NodeList cities = document.getDocumentElement().getElementsByTagName(
                "city");
        Element city = (Element) cities.item(0);
        String textContent = city.getTextContent();
            return textContent+".xml";
        }
}

这是我的路线

public void configure ( )  throws java .lang .Exception {
    from ( uril1ap .get ("Sender  cFile  1") ).routeId ( "Sender_cFile_ l").split()
    .xpath ( "/ people/ person") .id ( "cSplitter_ l")
    .setHeader ( "CamelFileName")  .method ( beans.setFileNames.class)
    .id ( "cSetHeader_ l") .to ( uril1ap .get ( "Receiver_cFile_2") )
    .id ( "cFile_2") .process ( new  org .apache .camel . Processor ( )  
            { public void  process ( org .apache .carnel .Exchange  exchange)
    throws  Exception  {
    System .out .println ( "File rece ived : "
                                        + exchange .getIn ().getHeader ( "CamelFileName") ) ;
    }) .id ( "cProcessor_ l");

您可能会在上述路线中发现一些语法问题,但它工作正常(此处复制的代码不准确)

想知道,如我们所见,CamelFileName bean 正在路由中使用,它是类 setFileNames 的一个实例,但是它如何在路由中调用它的 getCityName 方法?路由如何知道调用和打印哪个方法?

2 个答案:

答案 0 :(得分:0)

正是这个语句调用了 Bean:

.method ( beans.setFileNames.class)

尽管在您的情况下该参数有点奇怪,但您有多种选择可以传递给 method 语句。

最常见的是

  • 一个类.method(MyBean.class)
  • 在 Route 类中创建的 bean 实例 .method(myBean)
  • 如果 Bean 在应用程序上下文中注册,则按名称 .method("myBean")

就您而言,方法选择非常简单,因为只有一种方法。

然而,Camel 有一个相当“精心”的算法来选择 Bean 类中最合适的方法。

如果该算法选择了错误的方法,您可以通过名称显式调用该方法:.method(MyBean.class, "myMethod")

答案 1 :(得分:0)

据我所知,Camel 调用类中的公共方法,在这种情况下,它还将其参数 Document 推断为消息正文,因为没有注释(例如 @Header、@ExchangeProperty 等)已与论点联系在一起。

然而,如果你的 bean 类有多个公共方法,那么 Camel 会尝试调用参数与消息体类型匹配的方法。通过查找参数具有相同类型的多个公共方法,然后由于歧义问题引发运行时异常。

正如@burki 所提到的,您可以指明要在路由中调用的方法。但是您也可以通过使用 @Handler 注释来将 bean 类中的一个方法标记为默认方法。