使ってます 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)
サブスクライブとパブリッシュに同じjedisクライアントを使用しているようです。別のクライアントを作成する必要があります。1つはサブスクライブ用で、もう1つは公開用です。