我有一个基于redis构建的消息传递应用程序,但是,我注意到spring数据redis模板的convertAndSend可能正在重复消息,因为消息监听器每三次试验中就会收到一条重复消息。
你可以想象这可能不适合某些应用程序,在我的二级存储中抱怨重复键。
我在@Configuration注释类中注册了消息监听器:
@Bean
RedisMessageListenerContainer container(JobsListener receiver, RedisConnectionFactory connectionFactory) {
MessageListenerAdapter jobsMessageListener = new MessageListenerAdapter(receiver);
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(jobsMessageListener, new PatternTopic(RedisCacheService.JOBS_KEY));
return container;
}
在JobsListener实现中,我使用了onMessageReceived方法。
@Override
public void onMessage(Message message, byte[] pattern) {
System.out.println(new String(message.getBody()));
Job job = cacheService.processNextJob();
if (job != null) {
logger.debug("Job id processed is " + job.getId() + " " + Thread.currentThread().getId());
update(job);
} else {
logger.debug("Job id processed is null");
}
}
但是,如果我将synchronized添加到onMessageReceived方法,它似乎可以解决这个问题。
有同步帮助的原因吗?闻起来就像一些并发问题。