当前位置: 首页 > 知识库问答 >
问题:

错误EJB计时器服务不可用。不会删除应用程序的计时器

丌官昊天
2023-03-14

我创建了无状态bean,它具有带有@schedule注释的方法。我在servlet中创建bean实例。bean的代码:

 @Stateless
 public class StockServerBean {
 private String price=null;
 private ArrayList<String> nasdaqSymbols = new ArrayList<String>();
 private String chooseSymb;
 public String getChooseSymb() {
  return chooseSymb;
}

public void setChooseSymb(String chooseSymb) {
  this.chooseSymb = chooseSymb;
}

public StockServerBean(){
// Define some hard-coded NASDAQ symbols
nasdaqSymbols.add("AAPL");
nasdaqSymbols.add("MSFT");
nasdaqSymbols.add("YHOO");
nasdaqSymbols.add("AMZN");
nasdaqSymbols.add("MOT");
}

@Schedule(second="*",minute="*",hour="18,00-22,00", dayOfWeek="Mon-Sun")
public void getQuote(){
if(nasdaqSymbols.indexOf(chooseSymb.toUpperCase()) != -1) {
// Generate a random price for valid symbols
price = (new Double(Math.random()*100)).toString();
}
Session session = null;
Connection conn = null;
ConnectionFactory factory = null;
try{
    Context jndiC = new InitialContext();
    factory = (ConnectionFactory)jndiC.lookup("MyTestConnectionFactory");
    Queue queue = (Queue)jndiC.lookup("MyJMSTestQueue");

    conn = factory.createConnection();
    conn.start();

    session = conn.createSession(false,Session.AUTO_ACKNOWLEDGE);

    MessageProducer sender = session.createProducer(queue); 
    TextMessage outM = session.createTextMessage(chooseSymb + " : " + price);
    sender.send(outM);
    sender.close();
    System.out.println("Succesfully placed a price of  "  + chooseSymb + " :"+ price);

}catch(JMSException je){
    System.out.println("Error: " + je.getMessage());
}catch(NamingException ne){
    System.out.println("Error: " + ne.getMessage());
    ne.printStackTrace();
}finally{
    try{
        session.close();
        conn.close();

    }catch(Exception e){
        System.out.println("Can't close session/connection :" + e.getMessage());
    }

}
}

我的servlet代码:

  @WebServlet("/ExecutionServlet")
  public class ExecutionServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;

 /**
  * @see HttpServlet#HttpServlet()
 */
public ExecutionServlet() {
 super();
// TODO Auto-generated constructor stub
 }

 /**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse        response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse    response) throws ServletException, IOException {
// TODO Auto-generated method stub
StockServerBean bean = new StockServerBean();
bean.setChooseSymb("AAPL");
bean.getQuote();
PrintWriter out = response.getWriter();
out.println("Sending price to the queue");

}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse  response)
 */
    protected void doPost(HttpServletRequest request, HttpServletResponse       response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);

错误代码:

[2015-10-29T21:53:23.581+0200][glassfish 4.1][严重][NCLS-CORE-00026][javax.Enterprise.System.Core][TID:_Threadid=47_ThreadName=Admin-Listener(4)][TimeMillis:1446148403581][LevelValue:1000][[生命周期处理期间的异常java.lang.RuntimeException:EJB计时器服务不可用

我添加了property,http://docs.oracle.com/cd/e18930_01/html/821-2434/ggrvi.html#glhnl,但没有任何改变。

共有1个答案

邓子濯
2023-03-14

真奇怪。由于您的EJB似乎是正确的,并且glassfish尝试启动您的计时器方法,但抛出了一个更一般的异常,我认为,glassfish没有正确配置。

 类似资料:
  • 我有一个应用程序,有两个定时器开始他们的按钮点击。 当它们开始时,计时器倒计时显示在文本视图中,因此用户可以看到倒计时(10,9,8,7等) 一个计数器是45秒计时器,另一个是30秒计时器。我注意到,当计时器启动时,它们会以两种方式之一运行:计时器倒计时显示从正确的时间开始的秒数(然后跳过一个)45、43、42、41等,或者其他时间不显示开始值,直接跳到(44、43、42、41等),并且不会跳过任

  • 问题内容: 我用@ Singleton,@ Schedule和@Timeout注释创建了一个简单的示例,以尝试它们是否可以解决我的问题。 场景是这样的:EJB每5秒调用一次“检查”功能,并且如果满足某些条件,EJB将创建单个动作计时器,该计时器将以异步方式调用一些长时间运行的进程。(这是某种队列实现类型的东西)。然后它继续检查,但是尽管运行了很长时间,但不会启动另一个过程。 下面是我想出的代码,但

  • 我试图显示一个计时器,它在点击开始按钮后计数并在标签中显示秒数,但我没有得到想要的输出。这是我的控制器代码和FXML文件。。。 这是我的FXML代码...

  • 问题内容: 我正在用这个 但是这个: 给我这个错误: 而且我真的不明白怎么了 问题答案: 可能是因为您误解了工作原理。 正确的代码段为: 但: 我强烈建议您不要使用,而是使用!它是JavaFX API的一部分,您不必执行这些调用。这只是很快就被黑了,但是您知道了:

  • 我正在尝试更改其中一个Azure应用服务的Azure应用服务计划,以下是我得到的。它无法搜索我刚刚创建的应用服务计划。 Azure应用服务的当前应用服务计划和我想要更改为存在于同一位置和同一资源组中的计划。这两个计划的唯一区别是定价层。现有计划恰好在“标准:2小”中,我刚刚创建的计划在“标准:1小”中。对于这两个计划,我都选择定价层为“标准1”,因此不确定这是如何在定价层名称中添加数字1和2的。

  • 我正在尝试删除与我之前创建的移动应用后端相关的所有内容,并且我能够删除除应用服务计划之外的所有内容。 这表明应用程序服务计划没有连接的应用程序和定价层,但我仍然无法删除它: 当我尝试单击计划以查看其详细信息时,门户将进入无限加载状态,而不会发生任何其他情况: 有人能帮我解决这个问题吗?