В этом посте перечислены ВСЕ новые 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" ) @Stateless public 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" ) @Stateless public 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 JMSContext JMSContext 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 . |