我使用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,我可以提供一个,包括(服务器,客户端,配置等)很多
答案 0 :(得分:0)
经纪人正在做的工作就是尽可能快地向客户传递信息。如果您的客户端无法处理,那么还有其他工具,如Apache Camel,它们提供Throttler类型的组件,您可以使用这些组件插入客户端和代理之间以减慢传入的消息。 ActiveMQ支持embedded Camel routes,因此您可以在代理上进行设置。
如果您希望最大限度地控制在应用程序中处理消息的速率,那么您应该切换到同步消费者模型,并且只有在您准备好处理新消息时才在消费者上调用接收。