2012-02-07 74 views
2

我有一个CXFRS端点,其中诸如“GET/files/x”的请求应从特定目录返回文件“x”,然后将其删除。这些文件是从另一个进程输出的,然后通过此路由很快消耗。因此,如果需要的话,他们可以被接受调查并暂时保留在记忆中。骆驼请求/回复关联

以下是我的网络服务。

@Component 
@Path("/") 
public class WebService { 
@GET 
@Path("files/{id}") 
public String getFile(@PathParam("id") String id) { 
    return null; 
} 
} 

下面是不完整的路线。

<route> 
<from uri="cxfrs://bean:webService"/> 
<choice> 
    <when> 
    <simple>${in.headers.operationName} == 'getFile'</simple> 
    <setHeader headerName="correlationId"> 
    <simple>mandatoryBodyAs(java.lang.String)</simple> 
    </setHeader> 
    ??? 
    </when> 
<choice> 
</route> 

我已经调查内容富集模式,但是这不会帮助,因为原来的交换不能由浓缩塔内的消费者进行访问。因此,文件名不能由输入消息动态确定。换句话说,下面的例子不会读取文件“x”,因为文件端点永远不会看到文件头。

...setHeader(Exchange.FILE_NAME, "x").pollEnrich("file://dir")... 

我也尝试使用网络服务的路由和一个单独的文件路径之间的集成模式,如下所示的聚合策略。

@Component 
public class Aggregator implements AggregationStrategy { 
public Exchange aggregate(Exchange oldExchange, Exchange newExchange) { 
    if (oldExchange == null) { 
    return newExchange; 
    } else { 
    oldExchange.getOut().setBody(newExchange.getIn().getBody()); 
    return oldExchange; 
    } 
} 
} 

这不起作用,因为聚合器模式似乎是“仅在”交换;在“进出”交换中,只要消息到达聚合器,回复就会返回给客户端,而不是在聚合完成后。随后,我开始编写下面的流程。

@Component 
public class FileEnricher implements Processor { 

@Value("${folder}") 
private String folder; 

public void process(Exchange exchange) throws Exception { 

    Endpoint endpoint = exchange.getContext().getEndpoint(String.format(
    "file://%s?fileName=%s", 
    folder, 
    exchange.getIn().getHeader("correlationId") 
)); 
    PollingConsumer consumer = endpoint.createPollingConsumer(); 
    PollEnricher enricher = new PollEnricher(consumer); 
    enricher.setTimeout(10000); 

    consumer.start(); 
    enricher.process(exchange); 
    enricher.shutdown(); 
    consumer.stop(); 
} 
} 

此过程只不过是允许我动态配置内容丰富。我觉得很难相信没有更好的方法来做到这一点。特别是,我担心在上下文中线程化并不断添加/删除组件/端点。

任何人都可以提出更好的解决方案来解决这个问题吗?

+2

有一个JIRA票可以改善未来骆驼版本中的pollEnrich:https://issues.apache.org/jira/browse/CAMEL-4163 – 2012-02-08 04:47:17

回答

1

只需使用java.io.File为要丰富的文件设置消息主体,例如从一个java bean中进行丰富。然后将消息路由到bean:

public File whichFileToPick(@Header("id") String id) { 
    return new File("somedir/" + id"); 
} 

在未来pollEnrich将得到增强,因此会更容易直接在骆驼的路线做。 Christian提出了一个好主意,允许指定一个Camel表达式作为pollEnrich的URI。