2016-09-22 6 views
0

トピックに登録している一部のクライアントにメッセージを送信するために、デフォルトのActiveMQでJBossを使用します。残念ながらonMessage(Message message)は1つのメッセージに対して複数回呼び出されます。JBoss ActiveMQトピック再配信遅延が小さすぎます

JNDIルックアップ:

private static void lookupRemoteTopic() throws NamingException, JMSException 
{ 
    final String DEFAULT_CONNECTION_FACTORY = "jms/RemoteConnectionFactory"; 
    final String DEFAULT_DESTINATION = "jms/topic/refresh"; 
    final String DEFAULT_USERNAME = "ejb"; 
    final String DEFAULT_PASSWORD = "ejbSuperSecret"; 
    final String INITIAL_CONTEXT_FACTORY = "org.jboss.naming.remote.client.InitialContextFactory"; 
    final String PROVIDER_URL = "http-remoting://192.168.2.72:8080"; 

    final Properties env = new Properties(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY); 
    env.put(Context.PROVIDER_URL, PROVIDER_URL); 
    env.put(Context.SECURITY_PRINCIPAL, DEFAULT_USERNAME); 
    env.put(Context.SECURITY_CREDENTIALS, DEFAULT_PASSWORD); 
    InitialContext namingContext = new InitialContext(env); 

    // Perform the JNDI lookups 
    TopicConnectionFactory connectionFactory = (TopicConnectionFactory) namingContext.lookup(DEFAULT_CONNECTION_FACTORY); 
    Topic destination = (Topic) namingContext.lookup(DEFAULT_DESTINATION); 

    TopicConnection con = connectionFactory.createTopicConnection(DEFAULT_USERNAME, DEFAULT_PASSWORD);   
    con.start(); 
    TopicSession session = con.createTopicSession(false, Session.AUTO_ACKNOWLEDGE); 
    TopicSubscriber sub = session.createSubscriber(destination); 
    sub.setMessageListener(this); 
} 

のonMessage:

public void onMessage(Message message) 
{ 
    try 
    { 
     // Do some stuff with it 
    } 
    catch (JMSException e) 
    { 
     e.printStackTrace(); 
    } 
} 

メッセージの送信者:

@Inject 
private JMSContext context; 
@Resource(lookup = "java:/jms/topic/refresh") 
private Destination topic; 

MapMessage mesg = context.createMapMessage(); 
// set message body 
context.createProducer().send(topic, mesg); 

つのメッセージが送信された後、クライアントはAUTO_ACKNOWLEDGEものの、メッセージが殺到します設定されています。

送信者を遅くするにはどうすればよいですか?

SSCCEが必要な場合は、私は1つを提供することができますが、それは(サーバー、クライアント、設定、など)を含むことだけたくさんある

答えて

0

ブローカーはそれのようにあなたのクライアントにメッセージを配信することである仕事ですやっていますできるだけ早く。クライアントがそれを処理できない場合は、Throttlerタイプのコンポーネントを提供するApache Camelのようなツールがあります。これらのコンポーネントを使用すると、クライアントとブローカの間に挿入して着信メッセージを遅くすることができます。 ActiveMQはembedded Camel routesをサポートしているため、ブローカでこれを設定できます。

アプリケーションでメッセージが処理される速度を最大限に制御したい場合は、同期コンシューマモデルに切り替えて、新しいメッセージを処理する準備ができたときにのみコンシューマで受信を呼び出す必要があります。

+0

私はスピードに気をつけません。ただonMessageが1つのメッセージに対して複数回呼び出されるということだけです。 'AUTO_ACKNOWLEDGE'がやろうとしていることではないので、メッセージは確認応答を受け、サーバから削除されますか?どのように送り返す間に遅延を設定することができますか? – TheFreddy1404

+0

私が言ったように、ブローカーは可能な限り速くメッセージを配信することはできません。同じメッセージをもう一度受信している場合は、送信者などを複製しているかどうかを確認することができます。 –

関連する問題