Payara 5 @JMSConnectionFactory 在使用@Stateless bean 时注入失败
Payara 5 @JMSConnectionFactory fails to inject when using @Stateless bean
我正在测试 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;
// ....
}
注释 @JMSConnectionFactory
必须与 @Inject
一起使用,否则它没有任何效果。它只是添加用于注入的元数据,但不会导致任何注入发生。
从 JMS 2.0 规范 PDF 中的示例可以清楚地看出:
@Inject
@JMSConnectionFactory("jms/connectionFactory")
private JMSContext context;
另一方面,@Resource
注解足以用于注入,因为它们由 EJB 容器处理,EJB 容器将它们作为注入点处理。因此,您应该使用单个 @Resource
注释或同时使用 @Inject
和 @JMSConnectionFactory
。
我正在测试 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;
// ....
}
注释 @JMSConnectionFactory
必须与 @Inject
一起使用,否则它没有任何效果。它只是添加用于注入的元数据,但不会导致任何注入发生。
从 JMS 2.0 规范 PDF 中的示例可以清楚地看出:
@Inject
@JMSConnectionFactory("jms/connectionFactory")
private JMSContext context;
另一方面,@Resource
注解足以用于注入,因为它们由 EJB 容器处理,EJB 容器将它们作为注入点处理。因此,您应该使用单个 @Resource
注释或同时使用 @Inject
和 @JMSConnectionFactory
。