package com.oreilly.springdata.redis;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author Jon Brisbin
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PubSubConfig.class})
public class PubSubTest {
@Autowired RedisConnectionFactory connectionFactory;
@Test public void testPubSubWithoutConversion() {
RedisConnection redis = connectionFactory.getConnection();
try {
redis.publish( PubSubConfig.DUMP_CHANNEL.getBytes(), "Hello World!".getBytes() );
} finally {
redis.close();
}
}
@Test public void testPubSubWithConversion() {
RedisConnection redis = connectionFactory.getConnection();
RedisMessageListenerContainer listeners = new RedisMessageListenerContainer();
listeners.setConnectionFactory( connectionFactory );
MessageListenerAdapter listener = new MessageListenerAdapter( new BeanMessageListener() );
listener.setSerializer( new BeanMessageSerializer() );
listener.afterPropertiesSet();
listeners.addMessageListener( listener, new ChannelTopic( PubSubConfig.DUMP_CHANNEL ) );
listeners.afterPropertiesSet();
listeners.start();
try {
redis.publish( PubSubConfig.DUMP_CHANNEL.getBytes(), "Hello World!".getBytes() );
} finally {
redis.close();
listeners.stop();
}
}
private class BeanMessage {
String message;
private BeanMessage( String message ) {
this.message = message;
}
}
private class BeanMessageListener {
public void handleMessage( BeanMessage msg ) {
System.out.println( "msg: " + msg.message );
}
}
private class BeanMessageSerializer implements RedisSerializer<BeanMessage> {
@Override public byte[] serialize( BeanMessage beanMessage ) throws SerializationException {
return (null != beanMessage.message ? beanMessage.message.getBytes() : new byte[0]);
}
@Override public BeanMessage deserialize( byte[] bytes ) throws SerializationException {
return new BeanMessage( new String( bytes ) );
}
}
}