В моих серверных журналах наблюдается нечастая ошибка, которую трудно отследить. Мне интересно, может ли вызвать такое исключение, чтобы я мог определить, что в нашем коде происходит, чтобы вызвать его? К сожалению, у меня нет шагов для воспроизведения, поэтому я не могу определить, какие вызовы в коде вызывают это.
java.lang.ClassCastException: net.spy.memcached.MemcachedClient$5 cannot be cast to net.spy.memcached.ops.GetOperation$Callback
at net.spy.memcached.protocol.ProxyCallback.addCallbacks(ProxyCallback.java:25)
at net.spy.memcached.protocol.binary.OptimizedGetImpl.addOperation(OptimizedGetImpl.java:28)
at net.spy.memcached.protocol.binary.OptimizedGetImpl.<init>(OptimizedGetImpl.java:21)
at net.spy.memcached.protocol.binary.BinaryMemcachedNodeImpl.optimizeGets(BinaryMemcachedNodeImpl.java:46)
at net.spy.memcached.protocol.binary.BinaryMemcachedNodeImpl.optimize(BinaryMemcachedNodeImpl.java:35)
at net.spy.memcached.protocol.TCPMemcachedNodeImpl.fillWriteBuffer(TCPMemcachedNodeImpl.java:177)
at net.spy.memcached.MemcachedConnection.handleWrites(MemcachedConnection.java:374)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:326)
at net.spy.memcached.MemcachedConnection.handleIO(MemcachedConnection.java:219)
at net.spy.memcached.MemcachedClient.run(MemcachedClient.java:1591)
Обновление:
Я вполне уверен, что это оскорбительный код на моей стороне:
Future<CASValue<Object>> profiles;
String userID = "OBFUSCATED";
profiles = memClient.asyncGets("PROFILES_" + userID);
И в шпионе memcached он должен работать:
public <T> OperationFuture<CASValue<T>> asyncGets(final String key,
final Transcoder<T> tc) {
final CountDownLatch latch = new CountDownLatch(1);
final OperationFuture<CASValue<T>> rv =
new OperationFuture<CASValue<T>>(key, latch, operationTimeout);
Operation op = opFact.gets(key, new GetsOperation.Callback() {
private CASValue<T> val = null;
public void receivedStatus(OperationStatus status) {
rv.set(val, status);
}
public void gotData(String k, int flags, long cas, byte[] data) {
assert key.equals(k) : "Wrong key returned";
assert cas > 0 : "CAS was less than zero: " + cas;
val =
new CASValue<T>(cas, tc.decode(new CachedData(flags, data,
tc.getMaxSize())));
}
public void complete() {
latch.countDown();
}
});
rv.setOperation(op);
addOp(key, op);
return rv;
}
Все вроде бы в порядке, оно помещает анонимную реализацию правильного интерфейса в очередь, которая должна быть оптимизирована позже. Мне не хватает там, где возникает проблема.