Java RMI-线程池子线程套接字权限问题

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

我有一个线程池,它的计划线程访问redis池并使用它执行一些查询

我在创建ThreadPool的类中将JedisPool实例创建为静态实例。 在构造每个任务时,我将JedisPool实例作为参数传递。我的构造函数将是
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时,我可能会得到同样的例外。请帮忙,这是安全经理的问题。看看我的答案。