【问题标题】:ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context仅 ERR (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT 在此上下文中允许
【发布时间】: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)

【问题讨论】:

标签: redis jedis


【解决方案1】:

看来您使用相同的 jedis 客户端进行订阅和发布。您只需要创建另一个客户端,一个用于订阅,另一个用于发布

【讨论】:

  • 在稍微不同的上下文中将 redis npm 客户端用于 Web 应用程序时,我遇到了相同的错误消息。我确保只有一个客户端用于发布,另一个客户端用于订阅,但是我在一些很少使用和被遗忘的路由中使用订阅客户端调用 redisClient.get()redisClient.set() 方法。因此,如果您也从谷歌来到这里,请确保您的订阅客户端没有做与专门收听/取消订阅/退出无关的工作。
  • 这个答案对于 Node.js Redis 客户端也是正确的。
  • 荒谬的是,这是正确的。在任何地方的任何文档中都找不到这个。哇。谢谢
猜你喜欢
  • 2019-02-07
  • 2020-01-20
  • 2021-09-08
  • 2012-01-12
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
相关资源
最近更新 更多