При передаче сообщений размера 100MB с использованием очереди, ActiveMQ впадающим отказа от ошибки памяти, мы используем файл курсор для очереди -ActiveMQ вышел из памяти при отправке больших файлов по очереди
Очереди Detail - Наш продюсера отправляет Непрерывные сообщения размером 100 МБ на сообщения, а продюсер будет продолжать производить через цикл while из тех же 100 МБ сообщений.
Мы используем размер кучи по умолчанию, который поставляется с activeMQ с макс. 1 ГБ.
У нас есть настройки конфигурации ActiveMQ следующим образом:
<policyEntry queue=">" producerFlowControl="false" memoryLimit="512mb" maxPageSize="1000000">
<pendingQueuePolicy>
<fileQueueCursor />
</pendingQueuePolicy>
</policyEntry>
На потребляем стороне мы имеем потребителя Async, который будет держать прослушивание сообщений, поступающих и отправить авто-Ack.
После этой программы работает некоторое время ActiveMQ выдает следующее сообщение об ошибке:
2016-04-21 14:52:18,961 | ERROR | Error in thread 'ActiveMQ BrokerService.worker.1' | org.apache.activemq.broker.BrokerService | ActiveMQ BrokerService.worker.1
java.lang.OutOfMemoryError: Java heap space
at org.apache.activemq.util.DataByteArrayOutputStream.ensureEnoughBuffer(DataByteArrayOutputStream.java:249)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.util.DataByteArrayOutputStream.writeBoolean(DataByteArrayOutputStream.java:140)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.BaseDataStreamMarshaller.looseMarshalByteSequence(BaseDataStreamMarshaller.java:627)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.MessageMarshaller.looseMarshal(MessageMarshaller.java:300)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.ActiveMQMessageMarshaller.looseMarshal(ActiveMQMessageMarshaller.java:111)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.v11.ActiveMQTextMessageMarshaller.looseMarshal(ActiveMQTextMessageMarshaller.java:111)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.openwire.OpenWireFormat.marshal(OpenWireFormat.java:161)[activemq-client-5.13.1.jar:5.13.1]
at org.apache.activemq.broker.region.cursors.FilePendingMessageCursor.getByteSequence(FilePendingMessageCursor.java:480)[activemq-broker-5.13.1.jar:5.13.1]
at org.apache.activemq.broker.region.cursors.FilePendingMessageCursor.flushToDisk(FilePendingMessageCursor.java:440)[activemq-broker-5.13.1.jar:5.13.1]
at org.apache.activemq.broker.region.cursors.FilePendingMessageCursor.onUsageChanged(FilePendingMessageCursor.java:401)[activemq-broker-5.13.1.jar:5.13.1]
at org.apache.activemq.usage.Usage$1.run(Usage.java:308)[activemq-client-5.13.1.jar:5.13.1]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[:1.8.0_74]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)[:1.8.0_74]
at java.lang.Thread.run(Thread.java:745)[:1.8.0_74]
Кто-нибудь знает, как решить эту проблему? Кажется, что это не происходит, когда я отправляю сообщения меньшего размера, например, сообщения размером менее 10 МБ.
Другое дело, что я отправляю много недолгих сообщений темы размером 1 МБ, но после того, как производитель отправил около 7000 экземпляров, я получил OOM. У меня есть следующие настройки на ступице: \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t pendingSubscriberPolicy> \t \t \t \t \t policyEntry> Я не уверен, почему производительFlowControl не действует. –