Статьи

Новое в JMS 2.0

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