2

さて、Quartz を使用して、アプリケーションで必要ないくつかのジョブをスケジュールしています。しかし、ジョブでステートフル SessionBean にアクセスする方法が必要です。@EJBで注入できないことはわかっていました。誰でも私を助けることができますか?ありがとう。

4

3 に答える 3

4

EJB3InvokerJob を使用して、EJB のメソッドを呼び出しました。次に、EJB3InvokerJob を拡張するジョブを作成し、呼び出す必要のある EJB とメソッドのパラメーターを配置してから、super.execute() を呼び出します。

EJB3InvokerJob は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は次のようなものです:

@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
    }

私は誰かを助けることを期待しています。

于 2012-01-19T11:35:20.307 に答える
2

簡単な解決策は、ジョブ実装で JNDI を介して EJB をルックアップすることです。

final Context context = new InitialContext();

myService= (MyService) context
                .lookup("java:global/my-app/myejbmodule-ejb/MyService");

Glassfish 3.1 で開発中の現在のアプリケーションでこれを実行しました。

于 2012-03-13T10:27:53.490 に答える
0

これは、Job 実装で JNDI を介して EJB をルックアップするだけで実行できます。特に、JNDI 名は次のようになります。

mappedName#name_of_businessInterface

name_of_businessInterface、このセッション Bean のビジネス インターフェースの完全修飾名です。たとえば、指定mappedName="bank"したビジネス インターフェースの完全修飾名が の場合、ビジネス インターフェースcom.CheckingAccountの JNDI は ですbank#com.CheckingAccount

コード例:

Context context = new InitialContext();
MyService myService= (MyService) context.lookup("MyService#com.test.IMyService");
于 2012-06-04T17:56:00.443 に答える