调用其它程序时候,IO并发问题。
基本原理是利用
		Runtime r = Runtime.getRuntime();
		r.exec(cmdStringBuffer.toString());
执行了一个CMD命令对一个文件进行了写入操作。
我这里做得例子是注册用户,然后用apache的htpasswd.exe这个二进制文件(当然可以是您手头的任何可以IO操作文件)写入指定的文件passwd。
现在的问题点在多用户同时注册的时候,我调用外部文件写入passwd就会漏写,我该在哪里synchronized或者锁定住文本进行一点点写入呢?
下面写流程
SSH2架子,啥也没写,直接访问BtnAction(测试中,没注入)
public class BtnAction extends ActionSupport
{
	@Override
	public String execute() throws Exception
	{
		PasswdConfIO p = new PasswdConfIOImpl();
		for (int i = 1; i <= 10; i++)
		{
			User user = new User();
			user.setUsername("yulei" + i);
			user.setPassword("admin");
			
			p.addPasswd(user);
			Thread.sleep(3000); //这里是我自己的本方法,休眠3秒,因为这个插入根本用不了3秒钟
		}
		return SUCCESS;
	}
}
实现类
public class PasswdConfIOImpl implements PasswdConfIO
{
	@Override
	public void addPasswd(User user) throws IOException
	{
		// 读出来配置文件中的文件路径
		Properties pro = new Properties();
		pro.loadFromXML(new FileInputStream(Constant.CONFIG_XML_PATH));
		StringBuffer cmdStringBuffer = new StringBuffer();
		cmdStringBuffer.append(Constant.CMD) // cmd基础命令
				.append(pro.getProperty(Constant.HTPASSWD_PATH_NAME)) // htpasswd.exe完整文件路径
				.append(Constant.CMD_HTPASSWD_B) // -b 表示增加用户,默认 MD5 加密密码
				.append(Constant.PASSWD_PATH) // passwd.conf完整文件路径
				.append(Constant.CMD_SPACE).append(user.getUsername()) // 用户名
				.append(Constant.CMD_SPACE).append(user.getPassword()); // 密码
		Runtime r = Runtime.getRuntime();
		r.exec(cmdStringBuffer.toString());
	}
}
具体执行命令如下:
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei1 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei2 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei3 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei4 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei5 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei6 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei7 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei8 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei9 admin
cmd.exe /c start D:/Apache2/bin/htpasswd.exe -b F:/user/passwd yulei10 admin
这是等待后按照我自己思路应该的正常执行。
现在问题就在去掉睡眠那句后,连续10条插入肯定会遗漏的。
这里我试过把addPasswd方法给synchronized的,但是没起到效果,我的想法是:只要执行命令时候passwd 是synchronized的,那就实现自己要的同步效果了。但是可惜没起到过结果。
自己思考了下,因为IO操作时htpasswd.exe完成的,所以我的synchronized似乎不对它起效,现在除了等待,希望各位能给我个其它的思路。
这会写过程,我又