BytesMessage без OOM - PullRequest
       0

BytesMessage без OOM

1 голос
/ 24 января 2012

Есть ли способ поместить большой файл в очередь JMS, не загружая все это в память? Допустим, файл имеет размер 100 МБ. Могу ли я передать его в очередь из очереди или загрузить весь массив байтов в память?

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Это не поддерживается JMS напрямую. Но есть реализации, поддерживающие JMS, такие как Apache ActiveMQ, которые поддерживают передачу потоков. См. эту страницу на сайте ActiveMQ для получения дополнительной информации.

0 голосов
/ 24 января 2012

Что вы можете сделать, это использовать Apache Camel в сочетании с вашим брокером сообщений.

Используя шаблон интеграции предприятия здесь , вы можете поместить свой файл в центральное хранилище.Затем сообщение (заголовки и ссылка на заявку) отправляется как обычное сообщение через вашего брокера.Затем при доставке сообщения файл может быть снова поднят.

Например:

<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 выглядит так:

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 выглядит так:

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