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

注入消息驱动Bean

戚奇略
2023-03-14

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

严重:加载应用程序时出现异常:CDI部署失败:Weld-001408:未满足类型StatisticsBean的依赖关系,其限定符@Default在注入点[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,发现模式在这两种情况下都设置为“all”。会有什么问题?

共有1个答案

鄢修德
2023-03-14

你一开始为什么要注射它?这些不是会话bean,也不是用于注入的。消息驱动bean由JCA资源适配器(像JMS实现)通过特殊的消息传递接口访问。MDB可能是池式的,因此在它们内部保持任何状态都是没有意义的。在Java EE中,在没有事先了解的情况下使用技术总是会带来痛苦,因此,请考虑检查有关这些bean的EJB文档。

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

 类似资料:
  • 是否可以在MDB(消息驱动Bean)中为“目的地”动态分配运行时值? 我还尝试了ejb-jar.xml方法,但是“activation-config-property-name”=“destination”的值被理解为队列的文字物理名称。因此我无法对资源进行JNDI查找。 从属性读取和分配目标或使用-d参数传递值的正确方法是什么?

  • 早上好在我的时区。 事先表示感谢并致以最良好的问候

  • 消息驱动Bean是一种企业bean,当EJB容器从队列或主题接收消息时由EJB容器调用。 消息驱动的bean是一个无状态bean,用于异步执行任务。 为了演示消息驱动bean的使用,我们将使用EJB-persistence章节,我们需要执行以下任务 - Step 1 - 在数据库中创建表(请参阅EJB-Persistence章节)。 Step 2 - 创建与表对应的实体类(请参阅EJB-Persi

  • 我的问题是,如果编写一个简单的REST API,就像文章描述的那样,执行由MongoDB支持的CRUD操作,并使用spring-boot-starter-data-mongodb-reactive,我可以调用消息驱动的API服务吗?我还可以添加一个Webclient来与一些下游服务进行对话。 在REST API上下文中驱动消息有意义吗?

  • 同事, 你能帮我解决以下问题吗? 我有JavaEE应用程序。它包含一些具有业务逻辑的消息驱动Bean和一些负责整个应用程序配置的不同方面的管理Bean。我想设置bean启动和初始化的顺序。这意味着在管理Bean完成应用程序的初始化之前,容器不应该调用消息驱动Bean。应用程序的初始化包括读取和解析一些配置文件,这需要一些时间。 有WebSphere配置选项吗? 或者它应该只以编程方式完成技巧?

  • 在一个无状态bean中,我正在查找队列,这是正确的,并且发送没有抛出异常: 但不调用消息驱动bean的onMessage方法。 我错过了什么? 我的消息驱动bean有以下代码: