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

时间:2011-05-06 05:53:41

标签: java redis threadpool rmi

我有一个Threadpool,其调度的线程访问redis池并用它执行一些查询。

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

我的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";

};

我从parent_to_package目录运行程序,如

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

1 个答案:

答案 0 :(得分:0)

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