2016-12-01 14 views
0

@JmsListenerによって1つのメソッドのデフォルト同時実行性を変更するにはどうすればよいですか? @JmsListenerに(以下のように)同時実行性を追加しましたが、「JBoss管理コンソールの実行時JMSキューメトリック」では何も変更されていません。 私はJBoss 6.4、Spring JMSバージョン4.3.1.RELEASEを持っています。Spring JMS @JmsListener別のメソッドの同時実行性

マイリスナー:

@JmsListener(containerFactory = "myJmsQueueListenerContainerFactory", destination = "some.destination", concurrency = "3-10") 
@SendTo("some.place") 
public TransactionBookingStatus bookTransaction(Message message) throws JMSException { 
    //my implementation 
} 

マイデフォルトの設定:

@Bean 
public JndiObjectFactoryBean jmsConnectionFactoryFactoryBean() { 
    JndiObjectFactoryBean factory = new JndiObjectFactoryBean(); 
    factory.setJndiName("java:/ConnectionFactory"); 

    return factory; 
} 

public ConnectionFactory jmsConnectionFactory() { 
    return (ConnectionFactory) jmsConnectionFactoryFactoryBean().getObject(); 
} 

@Bean 
public JmsTemplate testMessageTemplate() { 
    JmsTemplate tmpl = new JmsTemplate(); 

    tmpl.setConnectionFactory(jmsConnectionFactory()); 

    return tmpl; 
} 

@Bean 
public DefaultJmsListenerContainerFactory myJmsQueueListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(jmsConnectionFactory()); 
    factory.setConcurrency("3-40"); 

    factory.setErrorHandler(new TrnJmsErrorHandler()); 

    return factory; 
} 

答えて

0

何が動作するはずです持っている - org.springframework.jmsのデバッグログをオンにして、消費者の管理に関するメッセージが表示されます - ログ設定にスレッドを含めてください.3つのコンシューマスレッドが表示されます。

EDIT

@SpringBootApplication 
public class So40908517Application { 

    public static void main(String[] args) throws Exception { 
     ConfigurableApplicationContext context = SpringApplication.run(So40908517Application.class, args); 
     JmsTemplate template = context.getBean(JmsTemplate.class); 
     for (int i = 0; i < 3; i++) { 
      template.convertAndSend("foo", "bar"); 
     } 
     context.getBean(CountDownLatch.class).await(); 
     context.close(); 
    } 

    @Bean 
    public CountDownLatch latch() { 
     return new CountDownLatch(3); 
    } 

    @JmsListener(destination = "foo", concurrency = "3-40") 
    public void listen(String in) { 
     System.out.println(in + " received on " + Thread.currentThread().getName()); 
     latch().countDown(); 
    } 

} 

結果(予想3つのスレッドとして):

. ____   _   __ _ _ 
/\\/___'_ __ _ _(_)_ __ __ _ \ \ \ \ 
(()\___ | '_ | '_| | '_ \/ _` | \ \ \ \ 
\\/ ___)| |_)| | | | | || (_| | )))) 
    ' |____| .__|_| |_|_| |_\__, |//// 
=========|_|==============|___/=/_/_/_/ 
:: Spring Boot ::  (v1.4.2.RELEASE) 

bar received on DefaultMessageListenerContainer-3 
bar received on DefaultMessageListenerContainer-2 
bar received on DefaultMessageListenerContainer-1 
+0

私はあなたのアドバイスに応じて、いくつかのテストを行い、@JmsListenerからの同時実行がうまくいかなかったように、残念ながらそれが見えます。 1つのメソッドに対してのみ並行性を設定する別の方法はありますか? – Kryniek

+0

「動作しませんでした」を定義します。私はちょうどクイックテストアプリを書いた、それは期待どおりに正確に働いた - 私の編集を参照してください。 –

関連する問題