2016-12-04 6 views
2

私のカスタムシリアライズ可能なメッセージをActiveMQ Queueから消費するSpringBootアプリケーションがあります。これまでのところ、消費率は非常に悪く、わずか1〜20 msg /秒です。Springboot JMS LIstener ActiveMQが非常に遅い

@JmsListener(destination = "${channel.consumer.destination}", concurrency="${channel.consumer.maxConcurrency}") 
public void receive(IMessage message) { 
    processor.process(message); 
} 

上記の私のチャンネルの消費者クラスの抜粋である、それはプロセッサインスタンス(autowired、注入さを持っており、その中に私が@Asyncサービスを持っているので、私は、メインスレッドがメッセージを入力するとすぐにリリースされると仮定することができます@非同期方式)ともそれは私がアプリケーションプロパティ通知する価値

# ACTIVEMQ (ActiveMQProperties) 
spring.activemq.broker-url= tcp://localhost:61616?keepAlive=true 
spring.activemq.in-memory=true 
spring.activemq.pool.enabled=true 
spring.activemq.pool.expiry-timeout=1 
spring.activemq.pool.idle-timeout=30000 
spring.activemq.pool.max-connections=50 

いくつかのことから設定springboot ActiveMQのデフォルトCONN工場使用しています:
1.私は私の地元のラップトップですべてのもの(Eclipseの、ActiveMQの、MYSQL)を実行し
2.これの前に、私も試しましたカスタムスレッドプールタスクエグゼキュータを備えたカスタム接続ファクトリ(デフォルトのAMQ、プーリング、およびキャッシング)を使用しても、同じ結果が得られます。以下は、私もnotive JVMモニターで使用されるヒープが

My JVM Monitor Instance

Performance Counter Snapshot


私が欲しいインクリメント保つスナップショットのパフォーマンス私が撮ったキャプチャと更新ごとに1秒
3です。知る:
1.私のステップから何か間違っている/紛失していますか?メッセージレートで数百に触れることはできません
2. Annotat ed @ JmsListenerメソッドはprocess asyncまたはsyncを実行しますか?
3.可能な限りサポートされていれば、従来のsync receive()をSpringBootで適切かつ丁寧に使用する方法は?私は似た何かをチェックしています

答えて

0


はありがとうございました。私はこのような私のJMSConfigurationクラス(Spring構成)でDefaultJmsListenerContainerFactory定義している:あなたが見ることができるように

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(CachingConnectionFactory connectionFactory) { 

    // settings made based on https://bsnyderblog.blogspot.sk/2010/05/tuning-jms-message-consumption-in.html 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(){ 
     @Override 
     protected void initializeContainer(DefaultMessageListenerContainer container) { 
      super.initializeContainer(container); 
      container.setIdleConsumerLimit(5); 
      container.setIdleTaskExecutionLimit(10); 
     } 
    }; 
    factory.setConnectionFactory(connectionFactory); 
    factory.setConcurrency("10-50"); 
    factory.setCacheLevel(CACHE_CONSUMER); 
    factory.setReceiveTimeout(5000L); 
    factory.setDestinationResolver(new BeanFactoryDestinationResolver(beanFactory)); 
    return factory; 
} 

を、私はhttps://bsnyderblog.blogspot.sk/2010/05/tuning-jms-message-consumption-in.htmlからこれらの値を取りました。それは2010年からですが、私はそれまでのところ新しい/良いものは見つけられませんでした。

は、私はまたのConnectionFactoryとしてSpringのCachingConnectionFactoryビーンを定義している:

@Bean 
public CachingConnectionFactory buildCachingConnectionFactory(@Value("${activemq.url}") String brokerUrl) { 
    // settings based on https://bsnyderblog.blogspot.sk/2010/02/using-spring-jmstemplate-to-send-jms.html 
    ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(); 
    activeMQConnectionFactory.setBrokerURL(brokerUrl); 
    CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory(activeMQConnectionFactory); 
    cachingConnectionFactory.setSessionCacheSize(10); 
    return cachingConnectionFactory; 
} 

この設定は、送信とJmsTemplateを支援します。

私の答えは、リンクに記載されているような接続プールの値に設定されています。また、私はspring.activemq.in-memory = trueを削除することができると思います。なぜなら、カスタムブローカURLを指定した場合(ドキュメントに基づいて)、「メモリ内」プロパティは無視されるからです。

これが役立ったかどうか教えてください。

G.