Статьи

Автоматическая подготовка ресурсов JMS в Java EE 7

JMS 2.0 (часть платформы Java EE 7) представила множество приятных функций . Одним из них была возможность объявлять ресурсы JMS для автоматического развертывания.

Pre Java EE 7

  • Внедрить фабрику соединений с помощью @Resource
  • Поиск назначения (очередь / тема) с использованием @Resource
  • Вытащите объект Session и используйте его для создания Message, Message Producer и отправьте сообщение

Самое главное, вы должны были убедиться, что ресурсы, т. Е. Фабрика соединений и физические места назначения, были заранее настроены на сервере приложений

В эпоху Java EE 7…

Вы можете использовать вкусности JMS 2.0

  • Используйте внедренный JMS-контекст (в большинстве случаев), чтобы упростить процесс отправки с меньшим количеством стандартного кода
  • Самое главное, что вы можете декларативно настроить автоматическое предоставление ресурсов JMS с помощью аннотаций или дескрипторов развертывания.

Давайте посмотрим на новые аннотации JMS 2.0 в действии. Вы также можете выбрать этот проект Maven на Github и развернуть его в своей любимой среде IDE.

@JMSConnectionFactoryDefinition, @JMSConnectionFactoryDefinitions

Используется для объявления одной или нескольких фабрик соединений

@JMSDestinationDefinition, @JMSDestinationDefinitions

Используется для объявления одного или нескольких физических назначений (очередей или тем)

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@Stateless
@JMSConnectionFactoryDefinition(name = "java:comp/env/AutoDeloyedJMSConf")
@JMSDestinationDefinition(interfaceName = "javax.jms.Queue", name  = "java:comp/env/AutoDeloyedJMSQueue")
public class Service {
    //usage omitted...
}
 
@JMSConnectionFactoryDefinitions({
    @JMSConnectionFactoryDefinition(
       name="java:comp/env/AutoDeloyedJMSConf1"
    ),
    @JMSConnectionFactoryDefinition(
       name="java:comp/env/AutoDeloyedJMSConf2"
    )
})
@JMSDestinationDefinitions({
    @JMSDestinationDefinition(
       name="java:comp/env/AutoDeloyedJMSQueue1",
       interfaceName = "javax.jms.Queue",
    ),
    @JMSDestinationDefinition(
       name="java:comp/env/AutoDeloyedJMSQueue2",
       interfaceName = "javax.jms.Queue",
    )
})
@Stateless
public class AnotherService {
    //usage omitted...
}

Ох, и вы также можете использовать XML

01
02
03
04
05
06
07
08
09
10
//snippet only..
 
<jms-connection-factory>
   <name>java:comp/env/AutoDeloyedJMSConf3</name>
</jms-connection-factory>
 
<jms-destination>
   <name>java:comp/env/AutoDeloyedJMSQueue3</name>
   <interfaceName>javax.jms.Queue</interfaceName>
</jms-destination>

Они могут быть частью дескриптора веб-развертывания (web.xml) или дескриптора развертывания EJB (ejb-jar.xml)

Возможные варианты

Есть несколько способов использовать эту функцию

  • Объявите свои JMS-ресурсы, используя @Singleton EJB на основе @Startup
  • Вы также можете объявить об этом в Servlet или любом управляемом компоненте CDI.
01
02
03
04
05
06
07
08
09
10
@Singleton
@Startup
@JMSDestinationDefinition(interfaceName = "javax.jms.Queue", name  = "java:comp/env/EmailQueue")
public class EmailQueueAutoProvisionService {
     
    @PostConstruct
    public void confirm(){
        System.out.println("Email Queue configured");
    }
}

Какой смысл всего этого?

Сервер приложений контейнера / Java EE обеспечивает доступность артефактов JMS для вашей логики приложения по требованию

  • Это ценно в PaaS, микросервисах, dockerized и любых других средах, которые активно используют автоматизированное развертывание
  • Хорошо для автоматического тестирования
  • Это еще один элемент для размышления и настройки!

Дополнительные ресурсы

Ура!