В этом посте перечислены ВСЕ новые API (интерфейсы / классы / аннотации и т. Д.), Представленные в JMS 2.0 (часть платформы Java EE 7 ). Они были классифицированы следующим образом
- Упрощение API
- Простота использования
- Обработка исключений
- Разнообразный
Вот краткое резюме вместе с некоторыми фрагментами кода
Упрощение API
JMSContext
Упрощенная абстракция поверх объектов Connection и Session, которая устраняет необходимость взаимодействия с этими классами / интерфейсами для отправки / получения сообщений.
|
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
30
|
@Path("email")@Statelesspublic class EmailService { //pulls in default Conn Factory as per Java EE 7 @Resource ConnectionFactory cf; //application managed JMSContext ctx; @Resource("jms/emailQ") Destination emailQ; @POST public void send(String email) { Session session; try { ctx = cf.createContext(); ctx.createProducer().send(emailQ, email); System.out.println("Message Sent to queue - " + ((Queue) emailQ).getQueueName()); } catch (JMSException ex) { Logger.getLogger(EmailService.class.getName()).log(Level.SEVERE, null, ex); throw new JMSRuntimeException(ex.getMessage(), ex.getMessage(), ex); } finally { //clean up after use. Can also be done as inside a @PreDestroy callback method ctx.close(); System.out.println("JMSContext closed"); } }} |
JMSConnectionFactory
Используется во время внедрения JMSContext для указания имени JNDI JMS ConnectionFactory
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Path("email")@Statelesspublic class TheBestEmailService { //container managed @Inject @JMSConnectionFactory("jms/myConnectionFactory") JMSContext ctx; @Resource("jms/emailQ") Destination emailQ; @POST public void send(String email) { Session session; try { ctx.createProducer().send(emailQ, email); System.out.println("Message Sent to queue - " + ((Queue) emailQ).getQueueName()); } catch (JMSException ex) { Logger.getLogger(TheBestEmailService.class.getName()).log(Level.SEVERE, null, ex); throw new JMSRuntimeException(ex.getMessage(), ex.getMessage(), ex); } }} |
JMSProducer и JMSConsumer
Как следует из названия, JMSProducer и JMSConsumer инкапсулируют процесс отправки сообщений JMS в и из пунктов назначения (тем и очередей) соответственно. Экземпляры для этих объектов можно получить из объекта JMSContext, и они важны с точки зрения простоты использования API. Вот «свободный» пример API
|
1
2
|
context.createProducer().send(queue,message);context.createConsumer(topic).receiveBody(Mail.class); |
XAJMSContext
Транзакционный эквивалент ванильного объекта JMSContext. Реализация этого интерфейса обеспечивает поддержку JTA в JMS
Простота использования
Эти аннотации позволяют меньше полагаться на ручную / административную настройку и обеспечивают автоматизированное развертывание приложений Java EE. Это прекрасные примеры «конфигурации как кода» и бесценные сценарии развертывания в облаке (PaaS).
JMSConnectionFactoryDefinition и JMSConnectionFactoryDefinitions
Укажите имя JNDI одного / нескольких объектов JMS ConnectionFactory. Этот ресурс будет автоматически подготовлен во время развертывания.
|
1
2
3
4
|
@JMSConnectionFactoryDefinition(name = "jndi/App1JMSConnFactory")@JMSConnectionFactoryDefinitions({@JMSConnectionFactoryDefinition(name = "jndi/App2JMSConnFactory"), @JMSConnectionFactoryDefinition(name = "jndi/App3JMSConnFactory")}) |
JMSDestinationDefinition и JMSDestinationDefinitions
Укажите имя JNDI одного / нескольких JMS-адресов (очередей / тем). Этот ресурс будет автоматически подготовлен во время развертывания.
|
1
2
3
4
|
@JMSDestinationDefinition(name = "jms/emailQueue", interfaceName = "javax.jms.Queue")@JMSDestinationDefinitions({@JMSDestinationDefinition(name = "portal/notificationQueue", interfaceName = "javax.jms.Queue"), @JMSDestinationDefinition(name = "app/stockPriceTopic", interfaceName = "javax.jms.Topic")}) |
Обработка исключений
JMS 1.1 и более ранние версии не имели понятия непроверенных исключений. Начиная с JMS 2.0, JMSRuntimeException была введена в качестве базы / родителя, из которой были расширены все другие непроверенные исключения. Вот список всех новых исключений, представленных в JMS 2.0 (в основном это непроверенные версии их проверенных аналогов)
- JMSRuntimeException
- IllegalStateRuntimeException
- InvalidClientIDRuntimeException
- InvalidDestinationRuntimeException
- InvalidSelectorRuntimeException
- JMSSecurityRuntimeException
- MessageFormatRuntimeException
- MessageNotWriteableRuntimeException
- ResourceAllocationRuntimeException
- TransactionInProgressRuntimeException
- TransactionRolledBackRuntimeException
Разнообразный
JMSPasswordCrdential
Используется для защиты доступа к провайдеру JMS перед попыткой каких-либо операций с использованием внедренного объекта JMSContext
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
Option 1---------@Inject@JMSConnectionFactory("jms/myConnectionFactory")@JMSPasswordCredential(password = "secret", userName = "admin")JMSContext ctx;----------------------------------------------------------------Option 2---------//inject javax.jms.ConnectionFactory@Resource("jndi/AppJMSConnFactory")ConnectionFactory cf;//use it to create the JMSContextJMSContext ctx = cf.createContext("admin","secret"); |
JMSSessionMode
Определяет режим сеанса, который будет использоваться во время внедрения JMSContext
|
1
2
3
4
5
|
@Inject@JMSConnectionFactory("jms/myConnectionFactory")//Accepts an integer. Other options are: JMSContext.SESSION_TRANSACTED, JMSContext.CLIENT_ACKNOWLEDGE and JMSContext.DUPS_OK_ACKNOWLEDGE@JMSSessionMode(JMSContext.AUTO_ACKNOWLEDGE)JMSContext ctx; |
Вот и все для нового материала в JMS 2.0 с точки зрения API.
Ура!
| Ссылка: | Новое в JMS 2.0 от нашего партнера JCG Абхишека Гупты в блоге Object Oriented . |