15 Mayıs 2018 Salı

SpringJMS @JmsListener Anotasyonu

Giriş
Eğer kodla JMS listener tanımlamak istersek JmsListenerConfigurer arayüzünü gerçekleştirmek gerekir. Eğer anotasyonlaJMS listener tanımlamak istersek @JmsListener kullanırız.

Şöyle yaparız
spring.jms.listener.acknowledge-mode=auto
spring.jms.listener.auto-startup=true
spring.jms.listener.concurrency=5
spring.jms.listener.max-concurrency=10
spring.jms.pub-sub-domain=false
spring.jms.template.priority=100
spring.jms.template.qos-enabled=true
spring.jms.template.delivery-mode=persistent
concurrenycy Alanı
Elimizde şöyle bir kod olsun
@Bean
public JmsListenerContainerFactory<?> fact(ConnectionFactory connFact) {
  DefaultJmsListenerContainerFactory fact = new DefaultJmsListenerContainerFactory();
  fact.setConnectionFactory(connFact);
  fact.setSessionTransacted(true);
  fact.setRecoveryInterval(10000L);
  return fact;
}
Şöyle yaparız.
@JmsListener(concurrency = "1-50", containerFactory = "fact", destination = "dest")
public void receiveMessage(Message message, Session session) {
    // ...
}
containerFactory Alanı
JmsListenerContainerFactory tipinden bir arayüz bekler. Bu arayüzü gerçekleştiren sınıf genellikle DefaultJmsListenerContainerFactory nesnesidir.
Örnek
Elimizde şöyle bir kod olsun.
@Bean
public JmsListenerContainerFactory<?> topicListenerFactory(
  ConnectionFactory connectionFactory,
  DefaultJmsListenerContainerFactoryConfigurer configurer) {

  DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
  ...
  return factory;
}
Şöyle yaparız.
@JmsListener(destination = "MYTOPIC",containerFactory = "topicListenerFactory")
public void receiveMessageFromQueue(String message) {
  System.out.println("Message recv from queue ->" + message);
}
Örnek
Elimizde şöyle bir kod olsun.
@Bean
DataSource dataSource() throws SQLException {
  OracleDataSource dataSource = new OracleDataSource();
  dataSource.setUser("yourusername");
  dataSource.setPassword("yourpassword");
  dataSource.setURL("jdbc:oracle:thin:@yourserver:1521:xe");
  dataSource.setImplicitCachingEnabled(true);
  dataSource.setFastConnectionFailoverEnabled(true);
  return dataSource;
}    

@Bean
public QueueConnectionFactory connectionFactory() throws Exception {
  return AQjmsFactory.getQueueConnectionFactory(dataSource());
}
Elimizde şöyle bir kod olsun.
@Bean
public MessageConverter jacksonJmsMessageConverter() {
  MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
  converter.setTargetType(MessageType.TEXT);
  converter.setTypeIdPropertyName("_type");
  return converter;
}
Elimizde şöyle bir kod olsun.
@Bean
public JmsListenerContainerFactory<?> myJMSListenerFactory(
  QueueConnectionFactory connectionFactory,
  DefaultJmsListenerContainerFactoryConfigurer configurer) {
  DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
  //  factory.setConcurrency("15-20");
  factory.setMessageConverter(jacksonJmsMessageConverter());
  configurer.configure(factory, connectionFactory);
  return factory;
}
Şöyle yaparız.
@Component
public class Receiver {
  @JmsListener(destination = "YourQueueName", containerFactory = "myJMSListenerFactory")
  public void receiveEmail(Email email) {
    System.out.println("Received <" + email + ">");
  }
}
destination Alanı
Okunacak kuyruk ismidir.
Örnek
Şöyle yaparız.
@JmsListener(destination = "MYQUEUE")
public void receiveMessageFromQueue(String message) {
  System.out.println("Message recv from queue ->" + message);
}
Örnek
Şöyle yaparız.
@JmsListener(destination = "myQueue", containerFactory = "myFactory"){
selector Alanı
Örnek
Şöyle yaparız
@Slf4j
@RequiredArgsConstructor
@Component
public class ConsumerTopico {

  private final PersonRepository personRepository;

  @JmsListener( destination = "${activemq.topic-name}", subscription = "assinatura",
selector = "test=false OR test is null")
  public void listen(String mensagem) {
    
    Person person = new Person();
    try {
      Gson gson = new Gson();
      person = gson.fromJson(mensagem, Person.class);
      personRepository.save(person);
    } catch(Exception e){
      ...
    }
  }
}

Hiç yorum yok:

Yorum Gönder