Я использую 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 необходимо, я могу предоставить, то он просто много, чтобы включить (сервер, клиент, конфигурацию и т.д.)
Я не против скорости, это просто то, что 'onMessage' вызывается несколько раз за одно сообщение. Разве это не означает, что должно выполняться 'AUTO_ACKNOWLEDGE', чтобы сообщение получило подтверждение и может быть удалено с сервера? Как установить задержку между репозиториями? – TheFreddy1404
Вы не можете, как я уже сказал, брокер доставляет сообщение так быстро, как только может. Если вы снова получите одно и то же сообщение, вы можете проверить своих продюсеров, чтобы убедиться, что они дублируют их отправления и т. Д. Трудно сказать, учитывая минимальную информацию –