2016-09-22 3 views
0

Я использую JBoss с ActiveMQ по умолчанию для отправки сообщений некоторым клиентам, которые подписались на тему. К сожалению, onMessage(Message message) вызывается несколько раз за одно сообщение.JBoss ActiveMQ Тема RedeliveryDelay слишком маленькая

JNDI-Lookup:

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 необходимо, я могу предоставить, то он просто много, чтобы включить (сервер, клиент, конфигурацию и т.д.)

ответ

0

брокер делает это работа, которая должна доставлять сообщения вашего клиента как как можно быстрее. Если ваш клиент не может справиться с этим, есть другие инструменты, такие как Apache Camel, которые предоставляют компоненты типа Throttler, которые вы можете использовать для вставки между клиентом и брокером для замедления входящих сообщений. ActiveMQ поддерживает embedded Camel routes, чтобы вы могли установить это на брокере.

Если вам нужен максимальный контроль скорости обработки сообщений в приложении, вам следует переключиться на синхронную потребительскую модель и получить вызов на вашем потребителе только тогда, когда вы готовы обработать новое сообщение.

+0

Я не против скорости, это просто то, что 'onMessage' вызывается несколько раз за одно сообщение. Разве это не означает, что должно выполняться 'AUTO_ACKNOWLEDGE', чтобы сообщение получило подтверждение и может быть удалено с сервера? Как установить задержку между репозиториями? – TheFreddy1404

+0

Вы не можете, как я уже сказал, брокер доставляет сообщение так быстро, как только может. Если вы снова получите одно и то же сообщение, вы можете проверить своих продюсеров, чтобы убедиться, что они дублируют их отправления и т. Д. Трудно сказать, учитывая минимальную информацию –

Смежные вопросы