Redis: Jedis中publish/subscribe 使用

来源:互联网 发布:英国大学 档次 知乎 编辑:程序博客网 时间:2024/06/06 10:49

在Redis早期版本就已经提供publish/subscribe 模式,该文使用Jedis客户端的一个小例子.

 

Jedis 类中提供:

在Jedis中提供 发布二进制编码 ,string字符串 以及pattern匹配模式三种方式来发布publish消息.

 

public Long publish(final String channel, final String message);

public Long publish(byte[] channel, byte[] message);

public List<String> pubsubChannels(String pattern) ;

 

同时提供 二进制编码和string字符串来订阅消息.

public void subscribe(BinaryJedisPubSub jedisPubSub, byte[]... channels)

public void subscribe(final JedisPubSub jedisPubSub, final String... channels)

 

在订阅消息中涉及到2个重要类.BinaryJedisPubSub 和JedisPubSub 类,这2个类用来处理收到消息时,对消息的逻辑处理.

public abstract class JedisPubSub {

}

public abstract class BinaryJedisPubSub {

}

这两个类为抽象类必须通过用户来实现该类. 这两个类中分别有重要的方法onMessage 当收到消息时需要处理.

public void onMessage(byte[] channel, byte[] message) {
  }

  public void onMessage(String channel, String message) {
  }

 

 

PublishMsg.Java  发布消息端:

 

[java] view plain copy
  1.    Jedis jedis = new Jedis("localhost");  
  2.    //发布Protocol Buffer 协议消息  
  3.      
  4.    Builder builder = UserBean.newBuilder();  
  5.    builder.setId(1000);  
  6.    UserBean userbean = builder.build();  
  7.    ByteArrayOutputStream output =new ByteArrayOutputStream();  
  8.    userbean.writeTo(output);  
  9.    long loop=0;  
  10. while (loop++<10000) {  
  11.     //发布userbean 二进制消息  
  12.     jedis.publish("userbean".getBytes(), output.toByteArray());  
  13.   
  14.     Thread.sleep(1000);  
  15. }   
  16.    jedis.disconnect();    


SubscribeMsg.java 订阅消息端:

[java] view plain copy
  1.    Jedis jedis = new Jedis("localhost");  
  2.      
  3.       //业务逻辑处理  
  4.    UserBeanListener l =new UserBeanListener();  
  5.    //订阅userbean二进制消息  
  6.    jedis.subscribe(l, "userbean".getBytes());  
  7.   
  8.    long loop=0;  
  9. while (loop++<10000)  
  10. {  
  11.     Thread.sleep(1000);  
  12. }   
  13.    jedis.disconnect();    


UserBeanListener.java 业务消息处理:

[java] view plain copy
  1. public class UserBeanListener extends BinaryJedisPubSub {  
  2.   
  3.     @Override  
  4.     public void onMessage(byte[] channel, byte[] message) {  
  5.           
  6.         try {  
  7.             UserBean u = UserBean.parseFrom(message);  
  8.             System.out.println(u.getId());  
  9.               
  10.         } catch (InvalidProtocolBufferException e) {  
  11.             // TODO Auto-generated catch block  
  12.             e.printStackTrace();  
  13.         }  
  14.     }  
  15.       
  16.       
  17. }  


UserMsg.proto  ProtocolBuffer协议文件:

[java] view plain copy
  1. message UserBean{  
  2.       
  3.     // ID(必需)  
  4.     required int32 id = 1;  
  5.   
  6. }  
0 0
原创粉丝点击