注入消息驱动的bean
Injecting message driven beans
在企业应用程序中,我尝试使用 netBeans 8.1 将 MessageDriven bean 注入到 Web 应用程序(到 REST 服务)中。我在 IDE 中没有收到任何警告,但是,在部署时我收到以下错误:
严重:加载应用程序时出现异常:CDI 部署failure:WELD-001408:不满足类型 StatisticsBean 与限定符 @Default 的依赖关系
在注入点 [BackedAnnotatedField] @Inject private sv.mycompany.rest.RestService.statisticsBean
这是我要注入的 bean 之一:
@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 class:
@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,在这两种情况下发现模式都设置为 "all"。可能是什么问题?
你为什么要首先注入它?这些不是会话 bean,也不打算用于注入。 JCA 资源适配器(如 JMS 实现)通过特殊的消息传递接口访问消息驱动的 bean。 MDB 可能被合并,因此在其中保留任何状态是没有意义的。在 Java EE 中,在没有事先了解的情况下使用技术总是会带来痛苦,因此,请考虑检查 EJB documentation 那些 beans。
在你的特定情况下,如果你真的需要存储一些东西以供进一步处理,你应该考虑使用单例会话 bean 或应用程序范围的 CDI bean。它们能够维护有意义的状态,并且可以注入到任何托管 bean 中,包括 MDB。
在企业应用程序中,我尝试使用 netBeans 8.1 将 MessageDriven bean 注入到 Web 应用程序(到 REST 服务)中。我在 IDE 中没有收到任何警告,但是,在部署时我收到以下错误:
严重:加载应用程序时出现异常:CDI 部署failure:WELD-001408:不满足类型 StatisticsBean 与限定符 @Default 的依赖关系 在注入点 [BackedAnnotatedField] @Inject private sv.mycompany.rest.RestService.statisticsBean
这是我要注入的 bean 之一:
@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 class:
@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,在这两种情况下发现模式都设置为 "all"。可能是什么问题?
你为什么要首先注入它?这些不是会话 bean,也不打算用于注入。 JCA 资源适配器(如 JMS 实现)通过特殊的消息传递接口访问消息驱动的 bean。 MDB 可能被合并,因此在其中保留任何状态是没有意义的。在 Java EE 中,在没有事先了解的情况下使用技术总是会带来痛苦,因此,请考虑检查 EJB documentation 那些 beans。
在你的特定情况下,如果你真的需要存储一些东西以供进一步处理,你应该考虑使用单例会话 bean 或应用程序范围的 CDI bean。它们能够维护有意义的状态,并且可以注入到任何托管 bean 中,包括 MDB。