2012-05-21 180 views
1

我有我的批處理應用程序,其中我在批處理應用程序中使用了ThreadPoolExecutor。所以只要它擊中了我的批處理應用程序中的行,我總是會在我的批處理應用程序中出現下面的錯誤。而且我無法關閉我自己的Executor服務。任何人都可以建議我該如何克服這個錯誤。java.security.AccessControlException:訪問被拒絕(java.lang.RuntimePermission modifyThread)

Batch Execution Failed! 
TaskResponse[exitCode= 
    <ExitCode 
     type="User" 
     code="30" 
     msg="Unexpected error encounted"/>, 
    causedByException=java.security.AccessControlException : Access denied (java.lang.RuntimePermission modifyThread) 
] 

java.security.AccessControlException: Access denied (java.lang.RuntimePermission modifyThread) 
    at java.security.AccessController.checkPermission(AccessController.java:108) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at java.util.concurrent.ThreadPoolExecutor.shutdown(ThreadPoolExecutor.java:1104) 
    at com.host.task.Testing.CommandExecutor.runNextCommand(CommandExecutor.java:185) 
    at com.host.task.Testing.PDSBatchTask.execute(PDSBatchTask.java:66) 
    at com.host.nel.batch.runtime.Task.start(Task.java:234) 
    at com.host.nel.batch.runtime.rt.TaskManager.__executeTask(TaskManager.java:138) 
    at com.host.nel.batch.runtime.rt.TaskManager.executeTask(TaskManager.java:73) 
    at com.host.nel.batch.runtime.rt.BatchManager.__executeTask(BatchManager.java:302) 
    at com.host.nel.batch.runtime.rt.BatchManager.executeBatchApplication(BatchManager.java:126) 
    at com.host.nel.batch.driver.BatchMain.main(BatchMain.java:95) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37) 
    at java.lang.reflect.Method.invoke(Method.java:599) 
    at com.host.nel.batch.testutils.TestBatchMain$1.run(TestBatchMain.java:50) 
    at java.security.AccessController.doPrivileged(AccessController.java:251) 
    at com.host.nel.batch.testutils.TestBatchMain.driver(TestBatchMain.java:37) 
    at com.host.nel.batch.testutils.TestBatchMain.driver(TestBatchMain.java:21) 
    at test.com.host.task.Testing.Driver.main(Driver.java:21) 

更新 - 我試着這樣做的方式,但仍然沒有luck-

// create thread pool with given size 
      final ExecutorService service = Executors.newFixedThreadPool(10); 

      // queue some tasks 
      for(int i = 0; i < 3 * 10; i++) { 
       service.submit(new ThreadTask(i)); 
      } 


      AccessController.doPrivileged(new PrivilegedAction() { 
       public Object run() { 
        // privileged code goes here, for example: 
        service.shutdown(); 
        try { 
         if (!service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS)) { 
          service.shutdownNow(); 
         } 
        } catch (final InterruptedException pCaught) { 
         service.shutdownNow(); 
         Thread.currentThread().interrupt(); 
        } 

        return null; // nothing to return 
       } 
      }); 

回答

1

請不要運行了SecurityManager您的批量測試代碼。或者,將您的代碼授予modifyThread RuntimePermission。

+0

我有使用安全管理器,因爲我認爲構架自己的努力經營我的批量測試代碼。我如何授予我的代碼modifyThreadRunttimePermission? – ferhan

0

您可以嘗試關閉您的執行官在doPriviledged

AccessController.doPrivileged(new PrivilegedAction() { 
      public Object run() { 
       // privileged code goes here, for example: 
       executorService.shutdown(); 
       return null; // nothing to return 
      } 
     }); 
+0

我試過這樣做,但不是運氣。 – ferhan

+0

我更新了我的問題,我是如何嘗試這樣做的。 – ferhan

+0

任何建議,因爲這不適合我。 – ferhan

相關問題