When the subscriber/listener completes execution, i wish to publish a new event to redis within the onMessage method in the subscriber.
RedisLettuceConfiguration
@Configurationpublic class RedisLettuceConfiguration { @Bean LettuceConnectionFactory lettuceConnectionFactory() { RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(); configuration.setHostName(OcrService.dotenv != null ? OcrService.dotenv.get("REDIS_HOST") : "127.0.0.1"); configuration.setPassword(OcrService.dotenv != null ? OcrService.dotenv.get("REDIS_PASSWORD") : ""); configuration.setPort(OcrService.dotenv != null ? (OcrService.dotenv.get("REDIS_PORT") != null ? Integer.parseInt(OcrService.dotenv.get("REDIS_PORT")) : 6379) : 6379); return new LettuceConnectionFactory(configuration); } @Bean RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(lettuceConnectionFactory()); redisTemplate.setValueSerializer(new GenericToStringSerializer<Object>(Object.class)); return redisTemplate; } //init listeners @Bean RedisMessageListenerContainer container() { final RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer(); redisMessageListenerContainer.setConnectionFactory(lettuceConnectionFactory()); redisMessageListenerContainer.addMessageListener(new MessageListenerAdapter(new OcrProcessorSubscriber()), new ChannelTopic("OCR-TOPIC")); return redisMessageListenerContainer; } //end listeners //start publisher @Bean ChannelTopic topic() { return new ChannelTopic("OCR-TOPIC"); } @Bean IMessagePublisher messagePublisher() { return new OcrSuccessPublisher(redisTemplate(), topic()); } //end publisher}
OcrSuccessPublisher
@Componentpublic class OcrSuccessPublisher implements IMessagePublisher { @Autowired private RedisTemplate<String,Object> redisTemplate; @Autowired private ChannelTopic topic; public OcrSuccessPublisher(RedisTemplate<String, Object> redisTemplate, ChannelTopic topic) { this.redisTemplate = redisTemplate; this.topic = topic; } @Override public void publish(String message) { redisTemplate.convertAndSend(topic.getTopic(),message); }}
Objective of the method below is to publish a new event after listener completes successfuly
OcrProcessorSubscriber*
public class OcrProcessorSubscriber implements MessageListener { private final List<String> messagesList = new ArrayList<>(); @Override public void onMessage(Message message, byte[] pattern) { System.out.println("Message Received:- " + message.toString());//how to publish message here e.g ocrSuccessPublisher.publish("new payload to redis"); }}
SOLVED BY
- Adding to RedisTemplate field type OcrProcessorSubscriber
private RedisTemplate<String, Object> redisTemplate; public OcrProcessorSubscriber(RedisTemplate<String, Object> redisTemplate){ this.redisTemplate=redisTemplate; }@Override public void onMessage(Message message, byte[] pattern) { System.out.println("Message Received:- " + message.toString()); // Publish a message to another Redis channel new OcrSuccessPublisher(redisTemplate, new ChannelTopic("OCR-TOPIC-PROCESSED")).publish("{\"fileId\":\"yyy\",\"ocrStatus\":\"PENDING\",\"fileName\":\"xx\"}"); }
- Updating RedisLettuceConfiguration
@Bean RedisMessageListenerContainer container() { final RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer(); redisMessageListenerContainer.setConnectionFactory(lettuceConnectionFactory()); redisMessageListenerContainer.addMessageListener(new MessageListenerAdapter(new OcrProcessorSubscriber(redisTemplate())), new ChannelTopic("OCR-TOPIC")); return redisMessageListenerContainer; }