【发布时间】:2016-12-06 22:52:38
【问题描述】:
我在我的网络应用程序中使用jdish.publish,在我的桌面应用程序中使用jedis.subscribe。所以两者都是独立的应用程序。
我有这个 pubsub 类
public class RedisNewPostListener extends JedisPubSub {
private final Jedis jedis;
private final AppInstances appInstances;
public RedisNewPostListener(AppInstances instances, Jedis jedis) {
this.jedis = jedis;
appInstances = instances;
}
@Override
public void onMessage(String channel, String message) {
String[] pos = message.split("##");
double lat = Double.parseDouble(pos[0]);
double lon = Double.parseDouble(pos[1]);
List<GeoRadiusResponse> members = jedis.georadius("UsersByLocation", lon, lat, GEO_SEARCH_RANGE, GeoUnit.KM);
我这样称呼它
RedisNewPostListener postListener = new RedisNewPostListener(instances, jedis);
jedis.subscribe(postListener, "NewPostArrived");
我收到此错误:
redis.clients.jedis.exceptions.JedisDataException: ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context
at redis.clients.jedis.Protocol.processError(Protocol.java:117)
at redis.clients.jedis.Protocol.process(Protocol.java:151)
at redis.clients.jedis.Protocol.read(Protocol.java:205)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297)
at redis.clients.jedis.Connection.getRawObjectMultiBulkReply(Connection.java:242)
at redis.clients.jedis.Connection.getObjectMultiBulkReply(Connection.java:248)
at redis.clients.jedis.Jedis.georadius(Jedis.java:3452)
at com.app.redis.RedisNewPostListener.onMessage(RedisNewPostListener.java:39)
at redis.clients.jedis.JedisPubSub.process(JedisPubSub.java:129)
at redis.clients.jedis.JedisPubSub.proceed(JedisPubSub.java:102)
at redis.clients.jedis.Jedis.subscribe(Jedis.java:2628)
【问题讨论】:
-
您确定您没有使用相同的 JedisPool 在 W-App 和 D-App 中获取 Jedis 吗?如果是,则需要关闭 jedis-client。
-
@КонстантинВан 这很奇怪,因为订阅状态基本上是锁定的,那么客户端如何被重用?我在更新 Jedis 之后遇到了这些错误,而它之前正在工作。在订阅模式下,我看不到连接如何返回到池中。