请您先登录,才能继续操作

[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?
Global site tag (gtag.js) - Google Analytics