我想在jBoss里面用ZooKeeper做分布式锁,结合ehcache做缓存共享用的,遇到报错不懂了
报错:
10:34:20,712 INFO [ZooKeeper] Initiating client connection, connectString=192.168.0.141:2180,192.168.0.22:2181 sessionTimeout=3000 watcher=org.menagerie.DefaultZkSessionManager$SessionWatcher@14349ae
10:34:20,942 ERROR [UsersRolesLoginModule] Failed to load users/passwords/role filesjava.io.IOException: No properties file: users.properties or defaults: defaultUsers.properties found
at org.jboss.security.auth.spi.Util.loadProperties(Util.java:198)
at org.jboss.security.auth.spi.UsersRolesLoginModule.loadUsers(UsersRolesLoginModule.java:186)
at org.jboss.security.auth.spi.UsersRolesLoginModule.createUsers(UsersRolesLoginModule.java:200)
at org.jboss.security.auth.spi.UsersRolesLoginModule.initialize(UsersRolesLoginModule.java:127)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:756)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:186)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:680)
at javax.security.auth.login.LoginContext.login(LoginContext.java:579)
at org.apache.zookeeper.Login.login(Login.java:292)
at org.apache.zookeeper.Login.<init>(Login.java:93)
at org.apache.zookeeper.client.ZooKeeperSaslClient.createSaslClient(ZooKeeperSaslClient.java:226)
at org.apache.zookeeper.client.ZooKeeperSaslClient.<init>(ZooKeeperSaslClient.java:131)
at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:949)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1003)
10:34:20,943 WARN [ClientCnxn] SASL configuration failed: javax.security.auth.login.LoginException: Missing users.properties file. Will continue connection to Zookeeper server without SASL authentication, if Zookeeper server allows it.
10:34:20,946 INFO [ClientCnxn] Opening socket connection to server 192.168.0.141/192.168.0.141:2180
就是这一步的时候报错:
csAccessor.lock();//就是这一步的时候报错:
csAccessor.put(Long.valueOf("123"),new AlertSession());
boolean a = csAccessor.containsKey(Long.valueOf("456"));
boolean b = csAccessor.containsKey(Long.valueOf("123"));
csAccessor.unlock();
获取锁的方法:
public static Lock getZKLock(){
ZkSessionManager manager = new DefaultZkSessionManager(connectionString, timeout);
Lock lock = Locksmith.reentrantLock(manager, lockPath);
return lock;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我已经按照http://duqiangcise.iteye.com/blog/780450里面的
二、WEB-CONSOLE的安全配置
配置了,还是没有用,看来不是这个问题,有人知道是怎么回事吗?
非常感谢,解决我的问题
弄好了,我自己回答吧
我觉得是因为zookeeper是一个外部应用,当它放到jBoss里面用了以后,肯定要通过容器向系统申请资源吧,所以就默认要使用sasl和jass(暂时还搞不清楚他们两的关系,大概是混合使用的一套安全模式)。如果没有在这套安全模式里面给zookeeper做配置,那就会报错了,就像我这样。
解决这个问题有两套思路,一种是给zookeeper做安全配置,怎么配我也搞不清楚,只知道应该是在jboss-5.1.0.GAserverdefaultconflogin-config.xml里面配的。
另外一种就是让zookeeper绕过sasl安全机制,直接向系统获取资源。具体就是只要在第一次调用锁之前执行这行代码就可以了:System.setProperty("zookeeper.sasl.client", "false");
具体可以参见官网的这个修正:https://issues.apache.org/jira/browse/ZOOKEEPER-1657