0

我已经在 Glassfish 4.1.2 下部署了一个带有许多 OSGi 包的 OSGi maven 应用程序。这个捆绑包是通过一个 web 应用程序激活的,该应用程序会在其上定义 Jobs 进行一些调用。所有这一切实际上都在以预期的方式工作。

Web 应用程序执行作业,作业调用 OSGi 包。当我尝试从外部获取批处理状态时,问题就来了。

目的是使用 REST Web 服务部署其他 Web 应用程序,以便我可以按需查询批处理状态。当我运行时:

private JobExecution getJob(int id) {

   JobOperator jobOperator = BatchRuntime.getJobOperator();
   JobExecution job = null;

   try {

           job = jobOperator.getJobExecution(id);

           System.out.println("job: " + job);
           System.out.println("name: " + job.getJobName());
           System.out.println("batchStatus: " + job.getBatchStatus());

   } catch (Exception e) {

           e.printStackTrace();

   }

   return job;

}

我得到这个例外:

javax.batch.operations.JobSecurityException:当前用户无权执行此操作

我已经尝试在运行批处理的同一个 Web 应用程序中部署 web 服务,只是为了测试行为,并且在发送批处理之后,我不断收到相同的异常。

奇怪的是,当我从 webapp 控制器运行批处理时,它运行了,我可以像魅力一样获得批处理状态:

@ViewScoped
@ManagedBean(name = "controller")
public class Controller implements Serializable {


   public void executeJobController() {

       JobOperator jobOperator = BatchRuntime.getJobOperator();
       Long executionIdDummy = jobOperator.start("DummyJob", new Properties());
       JobExecution jobExecutionDummy = jobOperator.getJobExecution(executionIdDummy);
       System.out.println("BatchDummyStatus : " + jobExecutionDummy.getBatchStatus());

   }
}

我在 JSR352 规范、Javadoc 或 Java EE 教程中找不到任何关于批处理安全性的内容。

有可能做到这一点吗?是关于 Glassfish JSR352 的吗?我怎样才能做到这一点?

感谢您的时间。

编辑

按照@Scott Kurz的建议将大部分日志设置为 FINE 后,我可以看到这些新行:

[2017-12-05T13:10:45.100-0500] [glassfish 4.1] [FINE] [] [javax.enterprise.web.core] [tid: _ThreadID=64 _ThreadName=http-listener-1(4)] [timeMillis : 1512497445100] [levelValue: 500] [CLASSNAME: org.apache.catalina.authenticator.AuthenticatorBase] [METHODNAME: invoke] [[ 安全检查请求 GET /ws/webresources/facturacion/getJobs ]] [2017-12-05T13:10 :45.101-0500] [glassfish 4.1] [FINE] [] [javax.enterprise.web.core] [tid: _ThreadID=64 _ThreadName=http-listener-1(4)] [timeMillis: 1512497445101] [levelValue: 500] [CLASSNAME:org.apache.catalina.authenticator.AuthenticatorBase] [METHODNAME:invoke] [[ 不受任何约束]]

这意味着一些奇怪的东西:

[2017-12-05T13:10:45.104-0500] [glassfish 4.1] [FINE] [AS-WEB-NAMING-00005] [javax.enterprise.web.naming] [tid: _ThreadID=64 _ThreadName=http-listener- 1(4)] [timeMillis: 1512497445104] [levelValue: 500] [CLASSNAME: org.apache.naming.resources.FileDirContext] [METHODNAME: file] [[ 文件无法读取/home/felipe/Documents/Programas/glassfish4/ glassfish/domains/domain1/applications/ws/WEB-INF/classes/META-INF/services/javax.batch.operations.JobOperator]]

我尝试在 localhost 中将 glassfish 作为 sudo 运行,但我得到了相同的行为,并且得到了完全相同的错误。

4

1 回答 1

1

当我在 OSGi 环境中工作时,首先重新部署(手动取消部署并逐个部署)所有 OSGi 捆绑包,最后重新部署(取消部署和部署)Web 服务所在的 Web 应用程序,然后它开始工作。

在进行一些重新部署后,似乎以某种方式无法识别 OSGi 依赖项,从而导致安全问题。

于 2018-03-01T14:13:33.140 回答