Camel可以用作纯粹的RESTful Web服务客户端吗?

时间:2013-08-01 22:20:43

标签: rest apache-camel

假设我想利用Camel作为RESTful Web服务的客户端。但不确定Camel是否适合这种工作。我也想使用http4或ahc组件,而不是cxf。

一般来说,我只需要两种路线:

    来自Bean的
  1. - >马歇尔到杰森 - >到具有静态URI的Ahc - >和解组 来自Json - >到Bean。静态uri示例:ahc:http://host/api/user/create
  2. 来自Bean的
  3. - >马歇尔到杰森 - >带有动态URI的Ahc - >和解组 来自Json - >到Bean。动态uri示例:ahc:http://host/api/user/id/1
  4. 我想有一个服务类以这样的方式触发这样的路由:

    UserService {
    
        @Autowired
        protected CamelContext restApiCamelContext;
    
        public UserCreateResponse createUser (UserModel user) {
            ... Camel's magick which starts create user route ...
        } 
    
        public UserModel getUserById (Long id) {        
            ... the id must be placed somehow into endpoint uri: http://host:port/api/user/id/${id} ...
            ... Camel's magick which get user by id ...
        }
    }
    

    UserService应该在Spring MVC控制器中使用。

    那么,是否可以基于Camel的功能实现这样的UserService?如果是,那么它会在大量用户请求弹簧控制器的高压下工作吗?近百种不同的uris能否正常使用?

2 个答案:

答案 0 :(得分:0)

您可以通过动态设置CamelHttpUri的邮件头来更改请求uri。 如果您的业务逻辑很简单,我认为您可以创建一个简单的驼峰路线来完成这项工作。 然后使用camel ProducerTemplate将请求发送到camel路由。

答案 1 :(得分:0)

    来自Bean的
  1. - >马歇尔到杰森 - >到具有静态URI的Ahc - > 来自Json的unmarshall - >到Bean。
  2. 来自Bean的
  3. - >马歇尔到杰森 - >至 带有动态URI的Ahc - >来自Json的unmarshall - >到Bean。
  4. CAMEL方法与()&的区别recipientList()是to-method无法解析camel的动态参数,其中receiveList-method可以。

    from("restlet:/your/some/address/{sourceId}?restletMethods=GET")
    .log("execute '${header.sourceId}' for something").to("log:WebRequestThroughput?groupSize=10")
    .beanRef("yourServiceBeanRef", "serviceMethodName")
    .marshal().json(JsonLibrary.Jackson)
    .to("http://domain/address/?bridgeEndpoint=true&throwExceptionOnFailure=true")
    .unmarshal().json(JsonLibrary.Jackson, YourResponseObject.class)
    .beanRef("anotherServiceBeanRef", "anotherMethodName");
    
    
    from("restlet:/your/address/{sourceId}?restletMethods=GET")
    .log("execute '${header.sourceId}' for something").to("log:WebRequestThroughput?groupSize=10")
    .beanRef("yourServiceBeanRef", "serviceMethodName")
    .marshal().json(JsonLibrary.Jackson)
    .setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.POST))
    .recipientList(simple("http://domain/address/${header.sourceId}?bridgeEndpoint=true&throwExceptionOnFailure=true"))
    .unmarshal().json(JsonLibrary.Jackson, YourResponseObject.class)
    .beanRef("anotherServiceBeanRef", "anotherMethodName");