【问题标题】:Injecting message driven beans注入消息驱动的bean
【发布时间】:2016-08-21 18:38:49
【问题描述】:

在企业应用程序中,我尝试使用 netBeans 8.1 将 MessageDriven bean 注入 Web 应用程序(到 REST 服务)。我在 IDE 中没有收到任何警告,但是,在部署时我收到以下错误:

严重:加载应用程序时出现异常:CDI 部署失败:WELD-001408:具有限定符 @Default 的 StatisticsBean 类型的依赖关系不满足 在注入点 [BackedAnnotatedField] @Inject private sv.mycompany.rest.RestService.statisticsBean

这是我尝试注入的一种豆子:

@MessageDriven(mappedName = "dzsobTopik")
public class StatisticsBean implements MessageListener{

private  Logger LOGGER = Logger.getLogger(StatisticsBean.class.getSimpleName());
private int scheduledJobs = 0;

@Inject
private JMSContext jmsContext;

private static Map<Integer, Boolean> results = new HashMap<>();

public StatisticsBean() {
}



public static Map<Integer, Boolean> getResults() {
    return results;
}

public void setResults(Map<Integer, Boolean> results) {
    StatisticsBean.results = results;
}



@Override
public void onMessage(Message message) {
    if(message instanceof JobScheduledMessage){
        scheduledJobs++;
    }
    else if(message instanceof JobCompletedMessage && scheduledJobs>0) {
        if(((JobCompletedMessage) message).getTimestamp()<5){
            LOGGER.log(Level.INFO, "Job successful!");
                results.put(((JobCompletedMessage) message).getJobnumber(), Boolean.TRUE);
                scheduledJobs--;
        }
        else {
                LOGGER.log(Level.INFO, "Job unsuccessful!");
                results.put(((JobCompletedMessage) message).getJobnumber(), Boolean.FALSE);
                scheduledJobs--;
            }
    }
}
}

这是我的 restService 类:

@Path("/start")
@Produces(MediaType.APPLICATION_JSON)
public class RestService {

@Inject
private JobScheduler jobScheduler;

@Inject
private StatisticsBean statisticsBean;

@Inject
private FastWorker fastWorker;

@Inject
private SlowWorker slowWorker;

@Inject
private NormalWorker normalWorker;

@GET
@Produces(MediaType.TEXT_PLAIN)
public String startSimulation() throws InterruptedException{
    jobScheduler.queueNewJobs();
     return "Started simulation";
}

@GET
@Path("/jobresult")
public Map<Integer,Boolean> getJobResults(){
    return StatisticsBean.getResults();
}

}

我在 ejb 和 web 模块中都有 beans.xml,在这两种情况下都将发现模式设置为“全部”。可能是什么问题?

【问题讨论】:

标签: jakarta-ee cdi message-driven-bean


【解决方案1】:

你为什么要首先注入它?这些不是会话 bean,也不用于注入。 JCA 资源适配器(如 JMS 实现)通过特殊的消息接口访问消息驱动的 bean。 MDB 可能是池化的,因此在其中保留任何状态都是没有意义的。在 Java EE 中,在没有事先了解的情况下使用技术总是会导致痛苦,因此,请考虑检查 EJB documentation 以了解这些 bean。

在您的特定情况下,如果您确实需要存储某些内容以供进一步处理,您应该考虑使用单例会话 bean 或应用程序范围的 CDI bean。它们能够维护有意义的状态,并且可以注入任何托管 bean,包括 MDB。

【讨论】:

  • 谢谢,原来我真的不需要注入它们。我是 Java EE 课程的初学者,这是我们的作业之一。不过现在我明白了,谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多