Java RMI-线程池子线程套接字权限问题
我有一个线程池,它的计划线程访问redis池并使用它执行一些查询 我在创建ThreadPool的类中将JedisPool实例创建为静态实例。 在构造每个任务时,我将JedisPool实例作为参数传递。我的构造函数将是Java RMI-线程池子线程套接字权限问题,java,redis,threadpool,rmi,Java,Redis,Threadpool,Rmi,我有一个线程池,它的计划线程访问redis池并使用它执行一些查询 我在创建ThreadPool的类中将JedisPool实例创建为静态实例。 在构造每个任务时,我将JedisPool实例作为参数传递。我的构造函数将是publictesttask(数据源ds、spool池、int-xx、int-yy)。由于该任务还需要一个mysql连接,因此我传递了一个mysql连接池的数据源实例。所有这些文件都在“PackageGen”中 我的server.policy文件位于“/home/raja/paren
publictesttask(数据源ds、spool池、int-xx、int-yy)
。由于该任务还需要一个mysql连接,因此我传递了一个mysql连接池的数据源实例。所有这些文件都在“PackageGen”中
我的server.policy文件位于“/home/raja/parent_to_package/”目录中,如下所示
grant codeBase "file:/home/raja/parent_to_package/" {
permission java.security.AllPermission;
permission java.net.SocketPermission "*:*","connect,resolve";
};
grant codeBase "file:/home/raja/parent_to_package/packagen/" {
permission java.security.AllPermission;
permission java.net.SocketPermission "*:*","connect,resolve";
};
我将程序从父目录运行到包目录,如下所示
java -Djava.rmi.server.codebase=file:/home/raja/parent_to_package/interface.jar -Djava.rmi.server.hostname=192.168.0.1 -Djava.security.policy=/home/raja/parent_to_package/server.policy -Xmx256m -Xms256m packagen.MainClass
我仍然从子线程中得到以下异常
redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
at redis.clients.util.Pool.getResource(Pool.java:22)
at packagen.TestTask.run(TestTask.java:172)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:573)
at java.security.AccessController.doPrivileged(Native Method)
at java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:570)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:6379 connect,resolve)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
at java.net.Socket.connect(Socket.java:513)
at java.net.Socket.connect(Socket.java:469)
at java.net.Socket.<init>(Socket.java:366)
at java.net.Socket.<init>(Socket.java:180)
at redis.clients.jedis.Connection.connect(Connection.java:105)
at redis.clients.jedis.Jedis.connect(Jedis.java:1657)
at redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63)
at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:974)
at redis.clients.util.Pool.getResource(Pool.java:20)
... 13 more
redis.clients.jedis.exceptions.JedisConnectionException:无法从池中获取资源
位于redis.clients.util.Pool.getResource(Pool.java:22)
运行(TestTask.java:172)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
位于java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317)
位于java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150)
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98)
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:181)
位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:205)
位于java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
位于java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:573)
位于java.security.AccessController.doPrivileged(本机方法)
位于java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:570)
运行(Thread.java:619)
原因:java.security.AccessControlException:拒绝访问(java.net.SocketPermission 127.0.0.1:6379连接,解析)
位于java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
在java.security.AccessController.checkPermission(AccessController.java:546)
位于java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
位于java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
位于java.net.Socket.connect(Socket.java:513)
位于java.net.Socket.connect(Socket.java:469)
位于java.net.Socket(Socket.java:366)
位于java.net.Socket(Socket.java:180)
位于redis.clients.jedis.Connection.connect(Connection.java:105)
在redis.clients.jedis.jedis.connect(jedis.java:1657)
位于redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63)
位于org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:974)
位于redis.clients.util.Pool.getResource(Pool.java:20)
... 还有13个
鉴于您使用的是jar文件,我认为您的代码库规范不正确,并且我认为您的SocketPermissions也没有正确指定host:port。检查文档。这与RMI有什么关系?我可以运行从JedisPool获取连接的单个程序并执行查询。当我在带有RMI及其server.policy的调度器中将其作为可运行的进行调度时,我遇到了权限问题。当然,当我没有RMI时,我可能会得到同样的例外。请帮忙,这是安全经理的问题。看看我的答案。