我正在使用Spymemcached访问服务器上的Memcached.我使用以下命令启动了memcached
memcached -m 4096 -p 11211 -u memcache -l 127.0.0.1 -d -vvv
我正在使用以下驱动程序将一些键/值对放入Memcache.出于某种原因,在最后一次get
操作之后,该main
功能才会挂起; 它永远不会终止.
import java.net.InetSocketAddress; import net.spy.memcached.MemcachedClient; public class memcache { public static void main(String args[]) { //Connect to Memcache. MemcachedClient c=null; try{ c = new MemcachedClient( new InetSocketAddress("127.0.0.1", 11211)); } catch (Exception e) { System.err.println("Could not connect to Memcached."); System.exit(-1); } System.out.println("Connected to Memcached."); Object myObject = null; for (int i = 0; i < 10; i++) { c.set(new String("HELLO"), 3600, i+1); myObject=c.get("HELLO"); String value = myObject.toString(); System.out.println("***" + value); } System.out.println("Done."); return; } }
我得到以下输出,但应用程序永远不会终止.
2011-12-04 14:18:31.839 INFO net.spy.memcached.MemcachedConnection: Added {QA sa=/127.0.0.1:11211, #Rops=0, #Wops=0, #iq=0, topRop=null, topWop=null, toWrite=0, interested=0} to connect queue Connected to Memcached. 2011-12-04 14:18:31.844 INFO net.spy.memcached.MemcachedConnection: Connection state changed for sun.nio.ch.SelectionKeyImpl@578088c0 ***1 Done.
服务器报告以下状态:
<32 server listening (udp) <33 new auto-negotiating client connection 33: going from conn_new_cmd to conn_waiting 33: going from conn_waiting to conn_read 33: going from conn_read to conn_parse_cmd 33: Client using the ascii protocol <33 set HELLO 512 3600 1 33: going from conn_parse_cmd to conn_nread > NOT FOUND HELLO >33 STORED 33: going from conn_nread to conn_write 33: going from conn_write to conn_new_cmd 33: going from conn_new_cmd to conn_waiting 33: going from conn_waiting to conn_read 33: going from conn_read to conn_parse_cmd <33 get HELLO > FOUND KEY HELLO >33 sending key HELLO >33 END 33: going from conn_parse_cmd to conn_mwrite 33: going from conn_mwrite to conn_new_cmd 33: going from conn_new_cmd to conn_waiting 33: going from conn_waiting to conn_read
什么问题可能导致main
函数永不终止?有没有人有什么建议?
解决方案很简单.客户端完成后必须断开连接:
c.shutdown(...)
这些例子都不包括这一关键步骤.