Я тестирую некоторые работы JMS на Paraya 5. В частности, 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 используется внутри компонента JSF @Named. Я использую простую инъекцию CDI, чтобы получить bean-компонент @Stateless, например:
@Named(value = "helloWorldMessageController")
@RequestScoped
public class HelloWorldMessageController {
@Inject
protected HelloWorldMessageSender sender;
// ....
}




Аннотацию @JMSConnectionFactory следует использовать с @Inject, иначе она не будет иметь никакого эффекта. Он просто добавляет метаданные для инъекции, но не вызывает никаких инъекций.
Это ясно из примера в PDF спецификации JMS 2.0:
@Inject
@JMSConnectionFactory("jms/connectionFactory")
private JMSContext context;
С другой стороны, аннотации @Resource достаточно для внедрения, потому что они обрабатываются контейнером EJB, который обрабатывает их как точку внедрения. Таким образом, вы должны использовать либо одну аннотацию @Resource, либо оба @Inject и @JMSConnectionFactory вместе.
Это было легко, рад, что помог :)
Аааа! Ты так прав. Я слишком долго смотрел код и просто пропустил
@Inject. Ваше здоровье!