当使用@Stateless bean时,Payara 5 @JMSConnectionFactory无法注入

Mic*_*jan 2 java ejb jms cdi payara

我正在测试一些关于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;
    }
}
Run Code Online (Sandbox Code Playgroud)

就像一个注释,@Statelessbean正在JSF @Namedbean中使用.我正在使用简单的CDI注入来获取@Statelessbean,如下所示:

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

    @Inject
    protected HelloWorldMessageSender sender;

    // ....
}
Run Code Online (Sandbox Code Playgroud)

Ond*_*Mih 5

@JMSConnectionFactory必须使用注释,@Inject否则它没有任何效果.它只是添加了用于注入的元数据,但不会导致任何注入发生.

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

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

另一方面,@Resource注释足以进行注入,因为它们由EJB容器处理,EJB容器将它们作为注入点处理.所以,你应该要么使用一个单一的@Resource注释或两者@Inject@JMSConnectionFactory在一起.