Java 无OOM的字节消息

Java 无OOM的字节消息,java,jms,out-of-memory,Java,Jms,Out Of Memory,有没有一种方法可以将一个大文件放在JMS队列中,而不将整个文件加载到内存中?假设该文件是100MB,我可以将其从队列中流进流出,还是必须将整个字节数组加载到内存中?JMS不直接支持这一点。但也有支持JMS的实现,例如支持传递流的ApacheActiveMQ。有关更多信息,请参阅ActiveMQ站点上的 您可以将Apache Camel与您的Message Broker结合使用 利用企业集成模式,您可以将文件存放在中央存储区中。然后,消息(标题和声明引用)像普通消息一样通过代理发送。然后在传递消息

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

JMS不直接支持这一点。但也有支持JMS的实现,例如支持传递流的ApacheActiveMQ。有关更多信息,请参阅ActiveMQ站点上的

您可以将Apache Camel与您的Message Broker结合使用

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

例如:

<route>
<from uri="direct:start"/>
<pipeline>
    <to uri="bean:checkLuggage"/>
    <to uri="mock:testCheckpoint"/>
    <to uri="bean:dataEnricher"/>
    <to uri="mock:result"/>
</pipeline>
</route>
}

dataEnricher
看起来是这样的:

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);
}
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");
  }
}    

我会确保你有更多的内存,或者把你的信息分成可管理的大小。