我在 Web 服务器上运行了两种不同的服务。这两个服务都有一个名为“xyz”的操作,带有以下参数。
服务一:
Public String xyx(Student object) {}
服务二:
public String xyz(Employee object){}
现在我有一个客户端,它将根据收到的消息调用其中一项服务的操作。该消息将作为骆驼交换接收。所以我需要识别消息的类型,然后调用适当的服务。
我如何识别作为骆驼交换接收到的消息的原始类型。
谢谢。
我在 Web 服务器上运行了两种不同的服务。这两个服务都有一个名为“xyz”的操作,带有以下参数。
服务一:
Public String xyx(Student object) {}
服务二:
public String xyz(Employee object){}
现在我有一个客户端,它将根据收到的消息调用其中一项服务的操作。该消息将作为骆驼交换接收。所以我需要识别消息的类型,然后调用适当的服务。
我如何识别作为骆驼交换接收到的消息的原始类型。
谢谢。
或者你可以这样做:
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();
尝试 exchange.getIn().getBody() instanceof Student
我会在标头中设置一个值来指示它是哪个服务,然后在骆驼路线上发送它。这种方法只是这样做的一种方法。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 发送消息的,那么我可能会提供更多帮助。
希望这能给您一些想法,如果代码中存在语法错误等,对不起,我在公共汽车站,没有时间检查它。
我更喜欢直接在路由定义中而不是在Processor
. 这是使用 aPredicate
来确定主体类类型的 Camel DSL 方法。它假定您已经将Exchange
主体反序列化为一个Student
或Employee
对象。
choice()
.when(body().isInstanceOf(Student::class))
.to(...)
.when(body().isInstanceOf(Employee::class))
.to(...)
.end()
如果您要在整个路由中对主体执行各种转换,从而在各个阶段产生各种Student
或Employee
对象类型(例如 aStudent
然后 aStudentEntity
等),那么将类型保存在标题或属性中作为某个字符串常量在路线的开始可能是更清洁的方法。
// 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)