2011-05-06 64 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。檢查文檔。