PubSub 在 Redis 中不工作
PubSub is not working in Redis
因为我在 Redis 中使用以下代码作为发布者和订阅者。我正在使用 redis 服务器版本 3.2.6 并且我使用以下 maven 依赖性从版本 2.9.0 的 redis java 客户端 jedis 连接,
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
这是我的代码,
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import redis.clients.jedis.Jedis;
//import redis.clients.jedis.BinaryJedisPubSub;
import redis.clients.jedis.JedisPubSub;
public class JavaProject extends JedisPubSub{
public static void main(String[] args) throws IOException, InterruptedException {
Jedis jedis = new Jedis("192.168.0.20");
try {
jedis.connect();
System.out.println("Connected");
String subChannel = "192168026*";
JavaProject javaProject=new JavaProject();
jedis.subscribe(javaProject,subChannel);
System.out.println("Subscribed to topic");
jedis.publish(subChannel, "Hi".getBytes());
System.out.println("Published to topics");
}
catch(Exception jce){
jce.printStackTrace();
}
finally {
jedis.close();
}
System.out.println("Program Completed");
while(true){
}
}
@Override
public void onUnsubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPUnsubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPSubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPMessage(String arg0, String arg1, String arg2) {
// TODO Auto-generated method stub
}
@Override
public void onMessage(String channel, String message) {
System.out.println(message);
}
}
当我执行上面的代码时,我得到以下输出
已连接
但它挂在 subscribe() 方法上,执行不会进一步移动到下一行
那么这段代码有什么问题?
谢谢
订阅需要一个专用的 Redis 连接,可能还需要一个专用线程。
应用订阅操作后,除订阅相关命令(SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE、PING 和 QUIT)外,不能在此连接上向 Redis 服务器发送其他命令。
对于 Jedis,订阅操作是阻塞的,因此它应该 运行 在一个单独的线程中。请注意,由 Jedis 触发的回调也会 运行 在该线程中。
再次订阅需要使用新线程
public void subscribe() {
new Thread(){
Jedis jedis = new Jedis("localhost");
public void run(){
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
super.onMessage(channel, message);
}
},"Channel");
}
}.start();
}
因为我在 Redis 中使用以下代码作为发布者和订阅者。我正在使用 redis 服务器版本 3.2.6 并且我使用以下 maven 依赖性从版本 2.9.0 的 redis java 客户端 jedis 连接,
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
这是我的代码,
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import redis.clients.jedis.Jedis;
//import redis.clients.jedis.BinaryJedisPubSub;
import redis.clients.jedis.JedisPubSub;
public class JavaProject extends JedisPubSub{
public static void main(String[] args) throws IOException, InterruptedException {
Jedis jedis = new Jedis("192.168.0.20");
try {
jedis.connect();
System.out.println("Connected");
String subChannel = "192168026*";
JavaProject javaProject=new JavaProject();
jedis.subscribe(javaProject,subChannel);
System.out.println("Subscribed to topic");
jedis.publish(subChannel, "Hi".getBytes());
System.out.println("Published to topics");
}
catch(Exception jce){
jce.printStackTrace();
}
finally {
jedis.close();
}
System.out.println("Program Completed");
while(true){
}
}
@Override
public void onUnsubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onSubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPUnsubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPSubscribe(String arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onPMessage(String arg0, String arg1, String arg2) {
// TODO Auto-generated method stub
}
@Override
public void onMessage(String channel, String message) {
System.out.println(message);
}
}
当我执行上面的代码时,我得到以下输出 已连接
但它挂在 subscribe() 方法上,执行不会进一步移动到下一行 那么这段代码有什么问题?
谢谢
订阅需要一个专用的 Redis 连接,可能还需要一个专用线程。
应用订阅操作后,除订阅相关命令(SUBSCRIBE、PSUBSCRIBE、UNSUBSCRIBE、PUNSUBSCRIBE、PING 和 QUIT)外,不能在此连接上向 Redis 服务器发送其他命令。
对于 Jedis,订阅操作是阻塞的,因此它应该 运行 在一个单独的线程中。请注意,由 Jedis 触发的回调也会 运行 在该线程中。
再次订阅需要使用新线程
public void subscribe() {
new Thread(){
Jedis jedis = new Jedis("localhost");
public void run(){
jedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
super.onMessage(channel, message);
}
},"Channel");
}
}.start();
}