Subscribe To Our Newsletter
You will receive our latest post and tutorial.
Thank you for subscribing!

required
required


Springboot JMS

A production JMS server must be a stand alone server. What we have here is for demonstration purposes.

Add dependency

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-activemq</artifactId>
</dependency>

Add configuration class

@Configuration
@EnableJms
public class JmsConfig {

    @Bean
    public JmsListenerContainerFactory<?> jmsFactory(ConnectionFactory connectionFactory,DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        configurer.configure(factory, connectionFactory);
        return factory;
    }
    
    @Bean // Serialize message content to json using TextMessage
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }
}

Add a Sender

@Slf4j
@Component
public class Sender {

    @Autowired
    private JmsTemplate jmsTemplate;

    @Value("${queue.sender-receiver}")
    private String      queue;

    public void sendMail(Mail mail) {
        try {
            jmsTemplate.convertAndSend(queue, mail);
            log.info("Mail sent to queue, {}, at {}", queue, LocalDateTime.now());
        } catch (Exception e) {
            log.error("Mail not sent");
            log.error("Exception, msg: {}", e.getMessage());
        }

    }

}

Add a Receiver

@Slf4j
@Component
public class Receiver {

    @JmsListener(destination = "${queue.sender-receiver}", containerFactory = "jmsFactory")
    public void receiveMessage(Mail mail) {
        log.info("Received mail {}", LocalDateTime.now());
        try {
            log.info("mail={}", ObjectUtils.toJson(mail));
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }

    }

}

Source code on Github

August 6, 2019

Springboot Cache

 

An application without cache is typically slow. Even great code will crawl when handling heavy traffic without cache. Caching can be a fast and relatively cheap way to increase performance.

Caching is a performance boost strategy you must implement into your application. Caching is nothing more than a hash table.

For Redis, all Redis data resides in-memory, in contrast to databases that store data on disk or SSDs. By eliminating the need to access disks, in-memory data stores such as Redis avoid seek time delays and can access data in microseconds. Redis features versatile data structures, high availability, geospatial, Lua scripting, transactions, on-disk persistence, and cluster support making it simpler to build real-time internet-scale apps.

I am going to show you how to implement caching into your Spring Boot application.

1. Include the following dependencies in your pom file.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

In your application.properties file, set Redis configurations. Also set spring.cache.type=redis.

2. Create a configuration class

@Configuration
@EnableCaching
public class CachingConfig{
	
	
    @Bean("customKeyGenerator")
    public KeyGenerator keyGenerator() {
        return new CustomKeyGenerator();
    }
	
private class CustomKeyGenerator implements KeyGenerator {
		  
	    public Object generate(Object target, Method method, Object... params) {
	    	StringBuilder strParams = new StringBuilder(target.getClass().getSimpleName());
	    	strParams.append("_");
			strParams.append(method.getName());
	    	for(Object param: params) {
				strParams.append("_");
				strParams.append(param);
			}
	    	System.out.println("key="+strParams.toString());
	        return strParams.toString();
	    }
}

}

3. Use @Cacheable to retrieve data

@Cacheable(value="users", key = "#id")
public User getById(Long id) {
	// retrieve User from db
	...
	return user;
}

4. Use @CachePut to update cached data

@CachePut(value="users", key = "#user.id")
public User update(User user) {
        ....
	return user;
}

5. Use @CacheEvict to delete cached data

@CacheEvict(value="users", key = "#id")
public Boolean delete(Long id) {
	....
	return true;
}
August 6, 2019

Dealing with Failure

 

August 5, 2019

Relaxing

 

August 5, 2019

Excellent Reporting

 

August 5, 2019