【问题标题】:Payara 5 @JMSConnectionFactory fails to inject when using @Stateless beanPayara 5 @JMSConnectionFactory 在使用@Stateless bean 时无法注入
【发布时间】:2018-09-06 03:54:30
【问题描述】:

我正在测试 Paraya 5 上的一些 JMS 工作。特别是 5.181。下面是我的简单无状态 bean 的代码。 @JMSConnectionFactory 失败! JMSContext context 变量始终为 null。然而@Resource(lookup = "jms/HelloWorldConnectionFactory") 成功了......关于为什么的任何想法?我更喜欢使用JMSContext

@Stateless
public class HelloWorldMessageSender {

    @JMSConnectionFactory("jms/HelloWorldConnectionFactory")
    protected JMSContext context;

    @Resource(lookup = "jms/HelloWorldConnectionFactory")
    protected ConnectionFactory connectionFactory;

    @Resource(lookup = "jms/HelloWorldQueue")
    protected Queue queue;

    public String send() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SS");
        String txt = String.format("Hello world message %s", sdf.format(new Date()));
        if (context != null) {
            System.out.printf("Use JMSContext to produce%n");
            context.createProducer().send(queue, txt);
        }
        if (connectionFactory != null) {
            System.out.printf("Use ConnectionFactory to produce%n");
            try (
                Connection connection = connectionFactory.createConnection();
                Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                MessageProducer producer = session.createProducer(queue);
            ) {
                TextMessage message = session.createTextMessage();
                message.setText(txt);
                producer.send(message);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
        return txt;
    }
}

请注意,@Stateless bean 正在 JSF @Named bean 内部使用。我正在使用简单的 CDI 注入来获取 @Stateless bean,如下所示:

@Named(value = "helloWorldMessageController")
@RequestScoped
public class HelloWorldMessageController {

    @Inject
    protected HelloWorldMessageSender sender;

    // ....
}

【问题讨论】:

    标签: java jms ejb cdi payara


    【解决方案1】:

    注解@JMSConnectionFactory 必须与@Inject 一起使用,否则没有任何作用。它只是为注入添加元数​​据,但不会导致任何注入发生。

    从 JMS 2.0 规范 PDF 中的示例中可以清楚地看出:

    @Inject @JMSConnectionFactory("jms/connectionFactory") private JMSContext context;

    另一方面,@Resource 注释足以用于注入,因为它们由 EJB 容器处理,EJB 容器将它们作为注入点处理。因此,您应该使用单个 @Resource 注释或同时使用 @Inject@JMSConnectionFactory

    【讨论】:

    • 啊!你说的太对了。我一直在看代码太久,我只是错过了@Inject。干杯!
    • 这个很简单,很高兴能帮上忙 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    相关资源
    最近更新 更多