骆驼:pollEnrich 和访问 Exchange
Camel: pollEnrich and access to the Exchange
我有这条路线
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new ProcessorTratarWS())
.pollEnrich("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName=${property.archivoRespuesta}", timeOut, new EstrategiaConfirmacion())
.to(WS_RESPONDER)
在 ProcessorTratarWS() 中我设置了 property.archivoRespuesta 的值并且是 pollEnrich 应该下载的文件的名称。
但是,文档说“PollEnrich 没有访问 Exchange”的权限。这意味着 PollEnrich 无法读取 ${property.archivoRespuesta}
的值
是否有一些替代方法可以在 Camel 中执行我正在尝试的相同操作?
谢谢!
来自http://camel.apache.org/content-enricher.html
...
Instead of using enrich you can use Recipient List and have dynamic
endpoints and define an AggregationStrategy on the Recipient List
which then would work as a enrich would do. ...
试试这样的东西:
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new ProcessorTratarWS())
.recipientList(simple("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName=${property.archivoRespuesta}")).aggregationStrategy(new EstrategiaConfirmacion())
.to(WS_RESPONDER)
编辑:
以上代码是将文件保存在FTP服务器中。
如果你想从 FTP 服务器轮询文件,你可以尝试
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
// logic of ProcessorTratarWS goes here
ConsumerTemplate consumer=exchange.getContext().createConsumerTemplate();
String filename=exchange.getProperty("archivoRespuesta",String.class);
Object file=consumer.receiveBody("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName="+filename,timeOut);
// logic of EstrategiaConfirmacion goes here
}
})
.to(WS_RESPONDER);
免责声明:我polling consumer用得不多,可能会有更多elegant/efficient解决方案
你可以用“简单”的表达方式
在字符串
中也使用“exchangeProperty”代替“属性”
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new ProcessorTratarWS())
.pollEnrich().simple("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName=${exchangeProperty.archivoRespuesta}")
.timeout(timeOut)
.aggregationStrategy(new EstrategiaConfirmacion())
.to(WS_RESPONDER)
我有这条路线
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new ProcessorTratarWS())
.pollEnrich("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName=${property.archivoRespuesta}", timeOut, new EstrategiaConfirmacion())
.to(WS_RESPONDER)
在 ProcessorTratarWS() 中我设置了 property.archivoRespuesta 的值并且是 pollEnrich 应该下载的文件的名称。
但是,文档说“PollEnrich 没有访问 Exchange”的权限。这意味着 PollEnrich 无法读取 ${property.archivoRespuesta}
的值是否有一些替代方法可以在 Camel 中执行我正在尝试的相同操作?
谢谢!
来自http://camel.apache.org/content-enricher.html
... Instead of using enrich you can use Recipient List and have dynamic endpoints and define an AggregationStrategy on the Recipient List which then would work as a enrich would do. ...
试试这样的东西:
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new ProcessorTratarWS())
.recipientList(simple("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName=${property.archivoRespuesta}")).aggregationStrategy(new EstrategiaConfirmacion())
.to(WS_RESPONDER)
编辑:
以上代码是将文件保存在FTP服务器中。 如果你想从 FTP 服务器轮询文件,你可以尝试
from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
// logic of ProcessorTratarWS goes here
ConsumerTemplate consumer=exchange.getContext().createConsumerTemplate();
String filename=exchange.getProperty("archivoRespuesta",String.class);
Object file=consumer.receiveBody("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName="+filename,timeOut);
// logic of EstrategiaConfirmacion goes here
}
})
.to(WS_RESPONDER);
免责声明:我polling consumer用得不多,可能会有更多elegant/efficient解决方案
你可以用“简单”的表达方式 在字符串
中也使用“exchangeProperty”代替“属性”from(URI_WEBSERVICE)
.convertBodyTo(Entrada.class)
.process(new ProcessorTratarWS())
.pollEnrich().simple("ftp://10.100.8.2/entradaCamel?username=USER&password=PASSWORD&delete=true&fileName=${exchangeProperty.archivoRespuesta}")
.timeout(timeOut)
.aggregationStrategy(new EstrategiaConfirmacion())
.to(WS_RESPONDER)