我已经在 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 运行,但我得到了相同的行为,并且得到了完全相同的错误。