Ну, я использую Quartz для планирования некоторых заданий, которые мне нужны в моем приложении. Но мне нужен какой-то способ доступа к Sessionful SessionBean в моей работе. Я знал, что не могу вводить его с помощью @EJB. Может кто-нибудь мне помочь? Спасибо.Как получить доступ к EJB из задания кварца
ответ
Я использовал EJB3InvokerJob для вызова методов моего EJB. Затем я создал свои задания, которые расширяют EJB3InvokerJob, поместите параметры того, что EJB и метод он должен вызвать, а затем вызовите super.execute().
EJB3InvokerJob можно найти здесь: http://jira.opensymphony.com/secure/attachment/13356/EJB3InvokerJob.java
My Job выглядит так:
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, как это:
@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
}
Я ожидаю, чтобы помочь кому-то.
Простым решением будет поиск EJB через JNDI в реализации Job.
final Context context = new InitialContext();
myService= (MyService) context
.lookup("java:global/my-app/myejbmodule-ejb/MyService");
Я сделал это в текущем приложении, которое я разрабатываю на Glassfish 3.1.
вы можете сделать это просто путем поиска EJB через JNDI в реализации задания. В частности, имя 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 для поиска ваших услуг будут печататься на вашей консоли, когда вы запуска сервера. –