Payara 5 @JMSConnectionFactory не может внедрить при использовании @Stateless bean

Я тестирую некоторые работы 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;

    // ....
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
600
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Аннотацию @JMSConnectionFactory следует использовать с @Inject, иначе она не будет иметь никакого эффекта. Он просто добавляет метаданные для инъекции, но не вызывает никаких инъекций.

Это ясно из примера в PDF спецификации JMS 2.0:

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

С другой стороны, аннотации @Resource достаточно для внедрения, потому что они обрабатываются контейнером EJB, который обрабатывает их как точку внедрения. Таким образом, вы должны использовать либо одну аннотацию @Resource, либо оба @Inject и @JMSConnectionFactory вместе.

Аааа! Ты так прав. Я слишком долго смотрел код и просто пропустил @Inject. Ваше здоровье!

Michael Remijan 27.03.2018 19:28

Это было легко, рад, что помог :)

OndroMih 28.03.2018 10:34

Другие вопросы по теме