请您先登录,才能继续操作
[lucene] lucene 使用rmi分两台服务器,怎么弄? rmi有超时问题吗
strayly
2010-06-25
我在rmi服务端放索引,把服务端程序打包成jar,让它在后台一直运行
前端调用服务端的索引来搜索,可是过一会之后就说索引已关闭,要把服务端的程序重新启动下,才能搜, 第一次用rmi,不知道这玩意怎么弄,有知道的吗,该怎么解决呢 |
|
luckaway
2010-06-25
如果你不显示的调用IndexReader.close,是不会自己关闭的
|
|
strayly
2010-06-25
我没有去关闭IndexReader,问题是出在rmi服务端,我感觉rmi服务端时间长了,他就自己关掉了
|
|
luckaway
2010-06-25
public class RMISearchServer { private static final Logger LOG = Logger.getLogger(RMISearchServer.class); private static final long DEFAULT_REFRESH_INTERVAL = 3 * 60 * 1000l; private int port = 0; private String rmiURL = null; private String area = null; private long refreshInterval = DEFAULT_REFRESH_INTERVAL; private IndexReaderPool indexReaderPool = null; private Timer timer = new Timer(true); public static void main(String args[]) { if (args.length != 1) { showusage(); } final String serverName = args[0]; ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"rmi_server_context.xml"}); RMISearchServer rmiSearchServer = null; if ("fp1".equals(serverName)) { rmiSearchServer = (RMISearchServer) context.getBean("fpRmiSearchServer1"); } else if ("fp2".equals(serverName)) { rmiSearchServer = (RMISearchServer) context.getBean("fpRmiSearchServer2"); } else if ("ba".equals(serverName)) { rmiSearchServer = (RMISearchServer) context.getBean("baRmiSearchServer"); } else { showusage(); } try { rmiSearchServer.start(); } catch (Exception e) { e.printStackTrace(); System.out.println("Exception while RMISearchServer starting:" + e.getMessage()); LOG.error("Exception while RMISearchServer starting:%s", e.getMessage()); } } private static void showusage() { System.out.println("根据指定serverName[fp1|fp2|ba]来启动一个RMISearchServer"); System.out.println("usage:RMISearchServer serverName"); System.out.println("eg:RMISearchServer fp1"); System.exit(0); } public void destroy() { timer.cancel(); } public void start() throws IOException { ensureFieldsValid(); indexReaderPool.init(); LocateRegistry.createRegistry(port); Naming.rebind(rmiURL, createRemoteSearchable()); timer.schedule(new SearchableRefreshTask(), refreshInterval, refreshInterval); System.out.println("rmi server started at " + rmiURL); LOG.info("rmi server started at " + rmiURL); } public void refresh() throws IOException { final RemoteSearchable remoteSearchable = createRemoteSearchable(); Naming.rebind(rmiURL, remoteSearchable); } private RemoteSearchable createRemoteSearchable() throws IOException { List<IndexReader> indexReaders = indexReaderPool.getIndexReaders(area); if (indexReaders.isEmpty())// try one more time indexReaders = indexReaderPool.getIndexReaders(area); if (indexReaders.isEmpty()) throw new ServiceException("can not found any available IndexReader from " + indexReaderPool.getName()); final Searcher[] searchers = new Searcher[indexReaders.size()]; int i = 0; for (IndexReader indexReader : indexReaders) { searchers[i] = new IndexSearcher(indexReader); i++; } return new RemoteSearchable(new MultiSearcher(searchers)); } /** *简单的验证rmiURl格式是否正确,如果不正确,抛出异常 **/ private void ensureFieldsValid() { if (area == null || area.length() != 2) throw new IllegalArgumentException("illegal area:" + area); if (rmiURL.indexOf(String.valueOf(port)) == -1) throw new IllegalArgumentException("port of rmi url and port,must same value"); } class SearchableRefreshTask extends TimerTask { @Override public void run() { try { refresh(); LOG.info("%s refreshed by SearchableRefreshTask", rmiURL); } catch (IOException e) { e.printStackTrace(); LOG.error("IOException while refreshing %s:%s", rmiURL, e.getMessage()); } catch (Exception e) { e.printStackTrace(); LOG.error("Exception while refreshing %s:%s", rmiURL, e.getMessage()); } } } /** spring injects */ public void setPort(int port) { this.port = port; } public void setRmiURL(String rmiURL) { this.rmiURL = rmiURL; } public void setIndexReaderPool(IndexReaderPool indexReaderPool) { this.indexReaderPool = indexReaderPool; } public void setArea(String area) { this.area = area; } public void setRefreshInterval(long refreshInterval) { this.refreshInterval = refreshInterval; } } 我把我的贴上去给你看下,我是要加载新的索引,所以需要刷新RMI |
|
ctxyzhanwei
2010-06-30
是不是搜索到一半,系统提示indexReader is closed?
|