首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >不带对象模型的BytesMessage

不带对象模型的BytesMessage
EN

Stack Overflow用户
提问于 2012-01-24 04:01:47
回答 2查看 189关注 0票数 1

有没有一种方法可以把一个大文件放到JMS队列中,而不把整个文件加载到内存中?假设文件大小为100MB,我可以将其流式输入和输出队列,还是必须将整个字节数组加载到内存中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-24 04:11:53

JMS不直接支持这一点。但是也有一些支持JMS的实现,比如支持传递流的Apache ActiveMQ。有关详细信息,请参阅ActiveMQ站点上的this page

票数 3
EN

Stack Overflow用户

发布于 2012-01-24 04:25:20

您可以做的是将Apache Camel与您的消息代理结合使用。

利用企业集成模式here,您可以将文件存放在中央存储中。然后,消息(声明的标头和引用)将像普通消息一样通过代理发送。然后,在传递消息时,可以再次拾取该文件。

例如:

代码语言:javascript
代码运行次数:0
运行
复制
<route>
<from uri="direct:start"/>
<pipeline>
    <to uri="bean:checkLuggage"/>
    <to uri="mock:testCheckpoint"/>
    <to uri="bean:dataEnricher"/>
    <to uri="mock:result"/>
</pipeline>
</route>

其中checkLuggage如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
public static final class CheckLuggageBean {        
  public void checkLuggage(Exchange exchange, @Body String body, @XPath("/order/@custId") String custId) {   
    // store the message body into the data store, using the custId as the claim check
    dataStore.put(custId, body);
    // add the claim check as a header
    exchange.getIn().setHeader("claimCheck", custId);
    // remove the body from the message
    exchange.getIn().setBody(null);
}

}

dataEnricher看起来像这样:

代码语言:javascript
代码运行次数:0
运行
复制
public static final class DataEnricherBean {
  public void addDataBackIn(Exchange exchange, @Header("claimCheck") String claimCheck) { 
    // query the data store using the claim check as the key and add the data
    // back into the message body
    exchange.getIn().setBody(dataStore.get(claimCheck));
    // remove the message data from the data store
    dataStore.remove(claimCheck);
    // remove the claim check header
    exchange.getIn().removeHeader("claimCheck");
  }
}    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8977819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档