2012-01-18 2 views
1

글쎄, Quartz를 사용하여 응용 프로그램에서 필요한 작업을 계획하고있다. 하지만 내 작업에서 Stateful SessionBean에 액세스하려면 어떤 방법이 필요합니다. 나는 그것을 @EJB로 주입 할 수 없다는 것을 알고 있었다. 누구든지 나를 도울 수 있습니까? 감사합니다. .Quartz Job에서 EJB에 접근하는 방법

답변

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 이름은 콘솔에 인쇄됩니다. –

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");