2014-01-25 42 views
2

我將單例EJB暴露爲restful service;要求是通過Rest API啓動一個定時器。由於這將是網絡應用程序,我打包在戰爭文件ejb類。我成功地能夠部署這個bean並調用Web服務,但是因爲@Resource註解沒有在上述單例ejb中注入SessionContext(也嘗試了無狀態會話Bean),所以無法啓動計時器。調試時,我看到SessionContext對象爲null。有關如何使計時器服務在這種情況下工作的任何建議?以下是詳細信息:@Resource沒有在jboss 7中注入SessionContext

  • 的JBoss 7.1.1最終
  • RestEasy的2.3.7最終
  • 的Java 7

TimerSessionBean.java:

import javax.annotation.Resource; 
import javax.ejb.SessionContext; 
import javax.ejb.Singleton; 
import javax.ejb.Timer; 
import javax.ejb.Timeout; 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 

@Singleton 
@Path("/config") 
public class TimerSessionBean { 

    @Resource 
    private SessionContext context; 

    @GET 
    @Path("{id}") 
    public void createTimer(@PathParam("id") long duration) { 
     context.getTimerService().createTimer(duration, "Hello World!"); 
    } 

    @Timeout 
    public void timeOutHandler(Timer timer) { 
     System.out.println("timeoutHandler : " + timer.getInfo());  
    } 
} 

網絡。 xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 
    <listener> 
     <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> 
    </listener> 
    <filter> 
     <filter-name>ShiroFilter</filter-name> 
     <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>ShiroFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

AppConfig.java:

20:09:08,850 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named TimerSessionBean in deployment unit deployment "myapp-1.0.war" are as follows: 
    java:global/myapp-1.0/TimerSessionBean!app.ws.resources.TimerSessionBean 
java:app/myapp-1.0/TimerSessionBean!app.ws.resources.TimerSessionBean 
java:module/TimerSessionBean!app.ws.resources.TimerSessionBean 
java:global/myapp-1.0/TimerSessionBean 
java:app/myapp-1.0/TimerSessionBean 
java:module/TimerSessionBean 

回答

1

要打包war文件裏面你的EJB,這意味着你的使用EJB 3.1 Lite是的reduced set

import java.util.HashSet; 
import java.util.Set; 
import javax.ws.rs.ApplicationPath; 
import javax.ws.rs.core.Application; 
@ApplicationPath("/") 
public class AppConfig extends Application { 

    @Override 
    @SuppressWarnings("unchecked") 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> set = new HashSet<Class<?>>(); 
     set.add(TimerSessionBean.class); 
     return set; 
    } 
} 

從服務器日誌摘錄ejb功能。 我不確定爲什麼SessionContext實例沒有被注入, 但要記住TimerService在這個簡化版本的ejb規範中不可用。

相關問題