【问题标题】:JBoss ActiveMQ Topic RedeliveryDelay too smallJBoss ActiveMQ Topic RedeliveryDelay 太小
【发布时间】:2017-01-30 19:18:53
【问题描述】:

我使用 JBoss 和默认的 ActiveMQ 来向一些订阅了主题的客户端发送消息。不幸的是,onMessage(Message message) 仅因一条消息而被多次调用。

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,我可以提供一个,包括很多内容(服务器、客户端、配置等)

【问题讨论】:

    标签: java jboss jms activemq


    【解决方案1】:

    代理正在做它的工作,即尽可能快地将消息传递给您的客户端。如果您的客户端无法处理该问题,那么还有其他工具(例如 Apache Camel)提供 Throttler 类型的组件,您可以使用它们插入客户端和代理之间以减慢传入消息的速度。 ActiveMQ 支持embedded Camel routes,因此您可以在代理上进行设置。

    如果您希望最大程度地控制应用程序中处理消息的速率,那么您应该切换到同步消费者模型并仅在您准备好处理新消息时调用您的消费者的接收。

    【讨论】:

    • 我不介意速度,这只是 onMessage 被多次调用,只有一条消息。这不是AUTO_ACKNOWLEDGE 应该做的事情,以便消息得到确认并可以从服务器中删除吗?如何设置重新投递之间的延迟?
    • 你不能像我说的那样,代理尽可能快地传递消息。如果您再次收到相同的消息,那么您可能需要检查您的生产者,看看他们是否在重复发送等。考虑到最少的信息,很难说
    猜你喜欢
    • 1970-01-01
    • 2015-10-01
    • 2015-11-12
    • 1970-01-01
    • 2023-03-13
    • 2011-03-21
    • 2014-12-14
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多