2011-05-06 76 views
-1

我有一个线程池,它的调度线程访问redis池并执行一些查询。RMI - 线程池子线程套接字权限问题

我在创建ThreadPool的类中将JedisPool实例创建为静态。 我在构造每个任务时将JedisPool实例作为参数传递。我的构造函数将是public TestTask(DataSource ds,JedisPool pool,int xx,int yy)。由于该任务还需要一个mysql连接,因此我传递了一个mysql连接池的数据源实例。所有这些文件都在“packagen”中。

我server.policy文件是在 “/家/拉贾/ parent_to_package /” 目录,看起来像这样,

授予代码库 “文件:/首页/拉贾/ parent_to_package /”{

许可的Java .security.AllPermission;

权限java.net.SocketPermission“”,“connect,resolve”;

};

授予代码库 “文件:/首页/拉贾/ parent_to_package/packagen /”{

权限java.security.AllPermission;

权限java.net.SocketPermission“”,“connect,resolve”;

};

我从parent_to_package目录中运行该程序像

的Java -Djava.rmi.server.codebase =文件:/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:从池中 在redis.clients.util.Pool.getResource(Pool.java:22) 在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) 在java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.access $ 101(ScheduledThreadPoolExecutor.java:98) 在java.util.concurrent.ScheduledThreadPoolExecutor中的$ ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExe cutor.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) 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)

造成的:java.security.AccessControlException:在访问被拒绝java.security.AccessControlContext.checkPermission(java.net.SocketPermission 127.0.0.1:6379连接,解决) (AccessControlContext.java:323) (SecurityManager.java:1034) 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。(Socket.java:366) at java.net .Socket。(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更多

+0

这与RMI有什么关系? – EJP 2011-05-07 09:38:09

+0

我可以运行从JedisPool获取连接并执行查询的单个prog。当我将它作为RMI及其server.policy的调度程序中的Runnable进行排定时,我遇到了许可问题。当然,如果我没有RMI,我可能会得到同样的例外。请帮助。 – itsraja 2011-05-07 13:29:03

+0

所以它是一个安全管理器问题。看到我的答案。 – EJP 2011-05-08 07:27:44

回答

0

我不认为你的codeBase规范是正确的,因为你正在使用一个jar文件,并且我不认为你的SocketPermissions正确指定了host:port。检查文档。