0

メモリ制限とプロデューサーフロー制御を使用するようにActiveMQを設定しようとしています。これにより、メモリが不足しているときにメッセージを送信しようとしたときに見られるハング動作が表示されなくなります。私はプロデューサーフロー制御私のプロデューサーブロック、および接続構成URIのドキュメントに従いましたが、運が悪かったです。

私が遭遇している問題は、これらの設定が実際には適切に尊重されていないように見えることです。

私のActiveMQブローカーは私のSpring構成でそのように設定されています(私はこれをわずかにサニタイズしたので、100%有効なSpring構成ではない可能性があります):

<bean id="broker" class="org.apache.activemq.broker.BrokerService"
    init-method="start">
    <property name="brokerName" value="broker" />
    <property name="persistent" value="false" />
    <property name="useJmx" value="true" />
    <property name="managementContext" ref="mgmtContext" />
    <property name="transportConnectorURIs">
        <list>
            tcp://localhost:1234?jms.prefetchPolicy.queuePrefetch=0&jms.useAsyncSend=false&jms.alwaysSyncSend=true
        </list>
    </property>
        <property name="destinations">
            <list>
                <bean class="org.apache.activemq.command.ActiveMQQueue">
                    <property name="physicalName" value="requests"></property>
                </bean>
                <bean class="org.apache.activemq.command.ActiveMQQueue">
                    <property name="physicalName" value="responses"></property>
                </bean>
            </list>
    </property>
</bean>

そして、私のコードのinitメソッドの1つで、次のように設定します。

broker.getSystemUsage().setSendFailIfNoSpace(true);
broker.getSystemUsage().setSendFailIfNoSpaceAfterTimeout(5000);

// Limit memory usage to 10MB
broker.getSystemUsage().getMemoryUsage().setLimit(10 * 1024 * 1024);

それでも、コードを実行すると、ログに次のようなものが表示されます。

2013-Mar-14 14:47:31.538 GMT-06:00 DEBUG [ActiveMQ Transport: tcp:///127.0.0.1:45846@18086] [org.apache.activemq.usage.Usage:fireEvent] [Usage.java:245] [] [] [] - Main:memory: usage change from: 5640% of available memory, to: 0% of available memory

そのため、ActiveMQは、設定されたメモリ制限を露骨に無視しているように見えます。

十分に大きなメッセージをキューに入れるとブロック動作が発生する可能性があり、非常に大きなメッセージをキューに入れるとOOMエラーが発生することもあります。

メモリ使用量を制限するようにActiveMQを確実に構成するにはどうすればよいですか。

4

3 に答える 3

1

ブローカーの制限をプログラムで管理する方法を探している人のために、以下に例を示します。

    @Bean
    public BrokerService broker()
            throws Exception {
        final BrokerService broker = new BrokerService();
        broker.addConnector("tcp://localhost:61616");
        broker.addConnector("vm://localhost");
        broker.setPersistent(false);
        broker.getConsumerSystemUsage().getMemoryUsage().setLimit(100 * 1024);
        broker.getConsumerSystemUsage().getStoreUsage().setLimit(1024 * 1024);
        broker.getConsumerSystemUsage().getTempUsage().setLimit(100 * 1024);
        return broker;
    }

出発点のこの投稿に感謝します: Spring Boot で ActiveMQ ポートを設定する方法?

于 2019-06-21T22:09:47.273 に答える
0

xml ファイルを使用してブローカーを直接構成しようとしましたか? これは次のように行うことができます (公式の Java の例から抜粋):

BrokerService ブローカー = BrokerFactory.createBroker(configUrl);

後で実行中のSpringの例を取得してみます

于 2013-03-22T06:55:47.043 に答える
0

私はそれを試しましたが、私が探しているものを解決できませんでしたが、最終的にリンクの下に完全な情報があります

http://blogs.sourceallies.com/2014/10/activemq-memory-tuning/

上記のスレッドのおかげで、私は解決策を得ました。上記のスレッドには十分な量の情報があります。次のようにactivemq.xmlを変更しました

<systemUsage>
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="2048 mb"/>
                    <!--Earlier it use to be 
                    <memoryUsage limit="64 mb"/>
                    -->
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="100 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="50 gb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>
于 2015-08-13T04:19:48.687 に答える