如何确定CAMEL交换对象的类型

rsl1atfo  于 12个月前  发布在  Apache
关注(0)|答案(4)|浏览(171)

我有两个不同的服务运行在一个Web服务器上。这两个服务都有一个名为'xyz'的操作,参数如下。
服务1:
第一个月
服务二:
public String xyz(Employee object){}
现在我有了一个客户端,它将根据接收到的消息调用其中一个服务的操作。该消息将作为camel交换接收。因此,我需要识别消息的类型,然后调用适当的服务。
如何识别作为camel交换接收的消息的原始类型。
谢谢.

3mpgtkmj

3mpgtkmj1#

或者你可以这样做:

from("foo:incommingroute")
    .choice()
        .when(simple("${body} is 'java.lang.String'"))
            .to("webservice:Student")
        .when(simple("${body} is 'foo.bar.Employee'"))
            .to("webservice:Employee")
        .otherwise()
            .to("jms:Deadletter")
        .end();

字符集

lstz6jyr

lstz6jyr2#

尝试exchange.getIn().getBody()instanceof Student

hlswsv35

hlswsv353#

我会在header中设置a值来表示它是哪个服务,然后在camel路由上发送它。这种方法只是这样做的一种方式。Christian Schneider有另一个很好的解决方案,我可能会更多地使用它,因为我已经比以前更了解Camel了。然而,两者都将实现相同的事情,取决于你问谁,其中一个可能比另一个更清楚。
例如,您可以:

public void foo(Exchange exchange){

 exchange.getIn().setHeader("MsgType", "Student");

}

字符集
然后,您可以在Java DSL甚至spring DSL中过滤头。
在Java DSL中,你可以这样做(伪代码)

from("foo:incommingroute")
.choice()
.when(header("MsgType").equals("Student"))
    .to("webservice:Student")
.when(header("MsgType").equals("Employee"))
    .to("webservice:Employee")
.otherwise()
    .to("jms:Deadletter")
.end();


在Spring DSL中,你可以这样做(伪代码)

<route>
 <from uri="foo:incommingroute"/>
   <choice>
     <when>
       <simple>${header.MsgType} equals 'Student'</simple>
       <to uri="webservice:Student"/>
    </when>
    <when>
      <simple>${header.MsgType} equals 'Employee'</simple>
      <to uri="webservice:Employee"/>
   </when>
   <otherwise>
      <to uri="jms:badOrders"/>
   <stop/>
 </otherwise>
 </choice>
 <to uri="jms:Deadletter"/>
</route>


你也可以在这个链接http://camel.apache.org/content-enricher.html上看看更丰富的模式。基本上我建议的是遵循更丰富的模式。如果你能告诉我你是如何向 Camel 发送消息的,那么我可能会帮助更多。
希望这给予你一些想法,如果有语法错误等代码对不起,我在一个公共汽车站,没有时间检查它。

nbnkbykc

nbnkbykc4#

我更喜欢将这种类型的逻辑直接写在路由定义中,而不是写在Processor中。下面是Camel DSL方法,它使用Predicate来确定主体类类型。它假设您已经将Exchange主体转换为StudentEmployee对象。

choice()
  .when(body().isInstanceOf(Student.class))
    .to(...)
  .when(body().isInstanceOf(Employee.class))
    .to(...)
.end()

字符集
如果你要在整个路由中对主体执行各种转换,在不同的阶段产生各种StudentEmployee对象类型(例如,Student然后是StudentEntity等),那么在路由的开头将类型保存在头部或属性中作为一些String常量可能是更干净的方法。

// Note that this labelling could be bundled into a processor
choice()
  .when(body().isInstanceOf(Student.class))
    .setProperty("TYPE", "STUDENT")
  .when(body().isInstanceOf(Employee.class))
    .setProperty("TYPE", "EMPLOYEE")
.end()

// later after some body transformations
.choice()
  .when(exchangeProperty("TYPE").isEqualTo("STUDENT"))
    // process student


最后,您可能能够在处理器中完成所有工作,但我认为这种结合了服务调用的分支逻辑是Camel反模式。

class MyProcessor implements Processor {
  @Override
  public void process(Exchange exchange) {
    Object body = exchange.getIn().getBody()
    if (body instanceOf Student) {
      // invoke StudentService
    } else if (body instanceOf Employee) {
      // invoke EmployeeService
    }
  }
}

// Route definition
from(...)
  .process(myProcessor)

相关问题