글쎄, Quartz를 사용하여 응용 프로그램에서 필요한 작업을 계획하고있다. 하지만 내 작업에서 Stateful SessionBean에 액세스하려면 어떤 방법이 필요합니다. 나는 그것을 @EJB로 주입 할 수 없다는 것을 알고 있었다. 누구든지 나를 도울 수 있습니까? 감사합니다. .Quartz Job에서 EJB에 접근하는 방법
1
A
답변
4
EJB3InvokerJob을 사용하여 EJB의 메소드를 호출했습니다. 그런 다음 EJB3InvokerJob을 확장하는 작업을 작성하고 EJB 및 호출해야하는 메소드의 매개 변수를 넣은 다음 super.execute()를 호출합니다. http://jira.opensymphony.com/secure/attachment/13356/EJB3InvokerJob.java
내 작업은 다음과 같이보고한다 :
public class BuscaSistecJob extends EJB3InvokerJob implements Job{
private final Logger logger = Logger.getLogger(this.getClass());
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDataMap dataMap = jobExecutionContext.getMergedJobDataMap();
dataMap.put(EJB_JNDI_NAME_KEY, "java:app/JobService");
dataMap.put(EJB_INTERFACE_NAME_KEY, "br.org.cni.pronatec.controller.service.JobServiceLocal");
dataMap.put(EJB_METHOD_KEY, "buscaSistec");
Object[] arguments = new Object[1];
arguments[0] = jobExecutionContext.getTrigger().getStartTime();
dataMap.put(EJB_ARGS_KEY, arguments);
Class[] argumentTypes = new Class[1];
argumentTypes[0] = Date.class;
dataMap.put(EJB_ARG_TYPES_KEY, argumentTypes);
super.execute(jobExecutionContext);
}
}
을 그리고 내 EJB는 다음과 같이이다 :
EJB3InvokerJob는 여기에서 찾을 수 있습니다
@Stateless
@EJB(name="java:app/JobService", beanInterface=JobServiceLocal.class)
public class JobService implements JobServiceLocal {
@PersistenceContext
private EntityManager entityManager;
@Resource
private UserTransaction userTransaction;
@Override
public void buscaSistec(Date dataAgendamento) {
// Do something
}
내가 누군가를 도울 것으로 기대합니다.
1
간단한 솔루션은 작업 구현에서 JNDI를 통해 EJB를 검색하는 것입니다.
final Context context = new InitialContext();
myService= (MyService) context
.lookup("java:global/my-app/myejbmodule-ejb/MyService");
현재 응용 프로그램에서 Glassfish 3.1에서 개발 중입니다.
0
작업 구현에서 JNDI를 통해 EJB를 조회하면됩니다. 특히, JNDI 이름은 다음과 같습니다
mappedName#name_of_businessInterface
어디 name_of_businessInterface
이 세션 빈의 비즈니스 인터페이스의 완전한 이름입니다. 예를 들어, mappedName="bank"
을 지정하고 비즈니스 인터페이스의 완전한 이름이 com.CheckingAccount
이면 비즈니스 인터페이스의 JNDI는 bank#com.CheckingAccount
입니다.
코드 예 : 서버를 시동하면 서비스를 조회 할 수
Context context = new InitialContext();
MyService myService= (MyService) context.lookup("MyService#com.test.IMyService");
의 JNDI 이름은 콘솔에 인쇄됩니다. –