Динамическое внедрение ресурсов в EJB3? - PullRequest
0 голосов
/ 23 сентября 2011

Я знаю, как выполнить внедрение ресурсов, чтобы получить очередь JMS в EJB, как и в следующем примере, легко получить QUEUE1.Но если у меня много очередей, и я не хочу менять код при появлении новой очереди "QUEUE4".

Можно ли получить ресурс динамически или какие-либо предложения для него?

@Stateless
public class OrderBean implements Order {

@Resource(name = "A.QCF", mappedName = "A.QCF")
private ConnectionFactory connectionFactory;

@Resource(name = "QUEUE1")
private Queue QUEUE1;

@Resource(name = "QUEUE2")
private Queue QUEUE2;

@Resource(name = "QUEUE3")
private Queue QUEUE3;

    public String sendData(String abc) {
        // ...
    }
}

Обновление:

Спасибо за Гонсало и bkail, мое решение следующее:

Код EJB: "QueueName" - это параметр от клиента.

InitialContext initialContext = new InitialContext();
Queue dynamicQueue = (Queue)initialContext.lookup("java:comp/env/" + QueueName);

ejb-jar.xml:

<enterprise-beans>
    <session>
        <<resource-env-ref>>
            <resource-env-ref-name>Queue1</resource-env-ref-name>
            <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
        </<resource-env-ref>>
        <<resource-env-ref>>
            <resource-env-ref-name>Queue2</resource-env-ref-name>
            <resource-env-ref-type>javax.jms.Queue</resource-env-ref-type>
        </<resource-env-ref>>
    </session>
</enterprise-beans>

Когда у меня появится новая очередь, мне просто нужно изменить ejb-jar.xml и перезапустить сервер.

Ответы [ 3 ]

1 голос
/ 23 сентября 2011

Боюсь, вам придется выполнить явный поиск JNDI, чтобы вы могли динамически устанавливать ресурс, который вы хотите внедрить. Что-то вроде:

Queue dynamicQueue = (Queue)initialContext.lookup(dynamicQueueName);

где dynamicQueueName - переменная, которую вы устанавливаете в зависимости от того, какие критерии вы используете для определения имени очереди.

0 голосов
/ 23 сентября 2011

READERS, должен быть более элегантный ответ, чем мой.

Может быть выполнена статическая параметризованная инициализация, например, из файла комплекта ресурсов (.properties).См. Энди Гибсон . (Кстати, пакеты ресурсов кэшируются, но вы можете очистить кеш.)

Я думаю, вы могли бы иметь в виду, что один объект отправляется одному из динамического набора очередей.Лично я бы вводил свой собственный компонент Queue Provider, сам запрограммированный.Посмотрите на Переконфигурируйте ваше приложение во время выполнения с помощью перезагружаемых файлов свойств .

0 голосов
/ 23 сентября 2011

Если я правильно понимаю, вы хотите динамически объявить resource-env-ref для Queue (что в основном и делает @Resource). Это не имеет смысла:

Пристани: добавление программно

...