2
回答
我想在jBoss里面用ZooKeeper做分布式锁,结合ehcache做缓存共享用的,遇到报错不懂了
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

报错:

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 files
java.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;
}


举报
藤真
发帖于3年前 2回/2K+阅
共有2个答案 最后回答: 3年前

弄好了,我自己回答吧

我觉得是因为zookeeper是一个外部应用,当它放到jBoss里面用了以后,肯定要通过容器向系统申请资源吧,所以就默认要使用sasl和jass(暂时还搞不清楚他们两的关系,大概是混合使用的一套安全模式)。如果没有在这套安全模式里面给zookeeper做配置,那就会报错了,就像我这样。

解决这个问题有两套思路,一种是给zookeeper做安全配置,怎么配我也搞不清楚,只知道应该是在jboss-5.1.0.GA\server\default\conf\login-config.xml里面配的。

另外一种就是让zookeeper绕过sasl安全机制,直接向系统获取资源。具体就是只要在第一次调用锁之前执行这行代码就可以了:System.setProperty("zookeeper.sasl.client", "false"); 

具体可以参见官网的这个修正:https://issues.apache.org/jira/browse/ZOOKEEPER-1657

--- 共有 1 条评论 ---
幽燕非常感谢,解决我的问题 3个月前 回复

我已经按照http://duqiangcise.iteye.com/blog/780450里面的

二、WEB-CONSOLE的安全配置 

配置了,还是没有用,看来不是这个问题,有人知道是怎么回事吗?

顶部