Route all traffic for specific ip over specific network interface in Linux
ip route add 192.168.72.20/32 dev eth3
Do not forget via <gateway_ip>
if the target IP is not directly reachable.
ip route add 44.5.134.90/32 via 192.168.1.1 dev eth3
ip route add 192.168.72.20/32 dev eth3
Do not forget via <gateway_ip>
if the target IP is not directly reachable.
ip route add 44.5.134.90/32 via 192.168.1.1 dev eth3
To ensure that updates to variables propagate predictably to other threads, we should apply the volatile modifier to those variables:
public class TaskRunner { private volatile static int number; private volatile static boolean ready; // same as before }
This way, we communicate with runtime and processor to not reorder any instruction involving the volatile variable. Also, processors understand that they should flush any updates to these variables right away.
References
https://www.baeldung.com/java-volatile
https://www.baeldung.com/java-stack-heap
Get Method using JavaScript Promise
fetch('http://example.com/movies.json') .then(response => response.json()) .then(data => console.log(data));
Supplying request options
// Example POST method implementation: async function postData(url = '', data = {}) { // Default options are marked with * const response = await fetch(url, { method: 'POST', // *GET, POST, PUT, DELETE, etc. mode: 'cors', // no-cors, *cors, same-origin cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached credentials: 'same-origin', // include, *same-origin, omit headers: { 'Content-Type': 'application/json' // 'Content-Type': 'application/x-www-form-urlencoded', }, redirect: 'follow', // manual, *follow, error referrerPolicy: 'no-referrer', // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url body: JSON.stringify(data) // body data type must match "Content-Type" header }); return response.json(); // parses JSON response into native JavaScript objects } postData('https://example.com/answer', { answer: 42 }) .then(data => { console.log(data); // JSON data parsed by `data.json()` call });
Checking that the fetch was successful
fetch('flowers.jpg') .then(response => { if (!response.ok) { throw new Error('Network response was not OK'); } return response.blob(); }) .then(myBlob => { myImage.src = URL.createObjectURL(myBlob); }) .catch(error => { console.error('There has been a problem with your fetch operation:', error); });
Supplying your own request object
const myHeaders = new Headers(); const myRequest = new Request('flowers.jpg', { method: 'GET', headers: myHeaders, mode: 'cors', cache: 'default', }); fetch(myRequest) .then(response => response.blob()) .then(myBlob => { myImage.src = URL.createObjectURL(myBlob); });
Headers
const content = 'Hello World'; const myHeaders = new Headers(); myHeaders.append('Content-Type', 'text/plain'); myHeaders.append('Content-Length', content.length.toString()); myHeaders.append('X-Custom-Header', 'ProcessThisImmediately');
const myHeaders = new Headers({ 'Content-Type': 'text/plain', 'Content-Length': content.length.toString(), 'X-Custom-Header': 'ProcessThisImmediately' });
console.log(myHeaders.has('Content-Type')); // true console.log(myHeaders.has('Set-Cookie')); // false myHeaders.set('Content-Type', 'text/html'); myHeaders.append('X-Custom-Header', 'AnotherValue'); console.log(myHeaders.get('Content-Length')); // 11 console.log(myHeaders.get('X-Custom-Header')); // ['ProcessThisImmediately', 'AnotherValue'] myHeaders.delete('X-Custom-Header'); console.log(myHeaders.get('X-Custom-Header')); // null
fetch(myRequest) .then(response => { const contentType = response.headers.get('content-type'); if (!contentType || !contentType.includes('application/json')) { throw new TypeError("Oops, we haven't got JSON!"); } return response.json(); }) .then(data => { /* process your data further */ }) .catch(error => console.error(error));
References
https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch
Well, WebMvcConfigurerAdapter
is deprecated. As of Spring 5.0 do this:
@SpringBootApplication(exclude = {JacksonAutoConfiguration.class}) public class Spring01Application { public static void main(String[] args) { SpringApplication.run(Spring01Application.class, args); } }
@Configuration public class WebConfig implements WebMvcConfigurer { @Bean public Gson gson() { GsonBuilder b = new GsonBuilder(); b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY); b.registerTypeAdapterFactory(DateTypeAdapter.FACTORY); b.registerTypeAdapterFactory(TimestampTypeAdapter.FACTORY); b.registerTypeAdapterFactory(LocalDateTypeAdapter.FACTORY); b.registerTypeAdapterFactory(LocalDateTimeTypeAdapter.FACTORY); return b.create(); } @Override public void configureMessageConverters( List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter stringConverter = new StringHttpMessageConverter(); stringConverter.setWriteAcceptCharset(false); stringConverter.setSupportedMediaTypes(Collections .singletonList(MediaType.TEXT_PLAIN)); converters.add(stringConverter); converters.add(new ByteArrayHttpMessageConverter()); converters.add(new SourceHttpMessageConverter<>()); GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(); gsonHttpMessageConverter.setGson(gson()); gsonHttpMessageConverter.setSupportedMediaTypes(Arrays .asList(MediaType.APPLICATION_JSON)); converters.add(gsonHttpMessageConverter); } }
References
https://stackoverflow.com/questions/40786366/force-spring-boot-to-use-gson-instead-of-jackson
List<Integer> listOfNumbers = Arrays.asList(1, 2, 3, 4); listOfNumbers.parallelStream().forEach(number -> System.out.println(number + " " + Thread.currentThread().getName()) );
Custom Thread Pool
List<Integer> listOfNumbers = Arrays.asList(1, 2, 3, 4); ForkJoinPool customThreadPool = new ForkJoinPool(4); int sum = customThreadPool.submit( () -> listOfNumbers.parallelStream().reduce(0, Integer::sum)).get(); customThreadPool.shutdown(); assertThat(sum).isEqualTo(10);
References
https://www.baeldung.com/java-when-to-use-parallel-stream
QuartzConfig.java
@Configuration public class QuartzConfig { @Bean public JobDetailFactoryBean jobDetail() { JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); jobDetailFactory.setJobClass(GarbageCollectorJob.class); jobDetailFactory.setDescription("Invoke Sample Job service..."); jobDetailFactory.setDurability(true); return jobDetailFactory; } @Bean public SimpleTriggerFactoryBean trigger(JobDetail job) { SimpleTriggerFactoryBean trigger = new SimpleTriggerFactoryBean(); trigger.setJobDetail(job); // every one hour trigger.setRepeatInterval(60 * 60 * 1000); trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); return trigger; } @Bean public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail job, JobFactory springBeanJobFactory) { SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties")); schedulerFactory.setJobFactory(springBeanJobFactory); schedulerFactory.setJobDetails(job); schedulerFactory.setTriggers(trigger); return schedulerFactory; } @Bean public SpringBeanJobFactory springBeanJobFactory(ApplicationContext applicationContext) { AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); return jobFactory; } }
AutoWiringSpringBeanJobFactory.java
public final class AutoWiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { private transient AutowireCapableBeanFactory beanFactory; public void setApplicationContext( final ApplicationContext context) { beanFactory = context.getAutowireCapableBeanFactory(); } @Override protected Object createJobInstance( final TriggerFiredBundle bundle) throws Exception { final Object job = super.createJobInstance(bundle); beanFactory.autowireBean(job); return job; } }
quartz.properties
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=10 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
References
https://www.baeldung.com/spring-quartz-schedule
http://www.btmatthews.com/blog/2011/inject-application-context+dependencies-in-quartz-job-beans.html
https://www.candidjava.com/spring-boot/quartz-example/
@EnableJpaRepositories(basePackages = {"com.ecommerce.core.repository.jpa"}) @EnableElasticsearchRepositories(basePackages= {"com.ecommerce.core.repository.elastic"}) @EnableRedisRepositories(basePackages = {"org.springframework.data.redis.connection.jedis"})
Since we are explicitly enabling the repositories on specific packages we can include this in the application.properties to avoid these errors:
spring.data.redis.repositories.enabled=false
We can do the same for the other repositories as well. If you encounter similar errors:
spring.data.elasticsearch.repositories.enabled=false spring.data.jpa.repositories.enabled=false
The container
class sets the max-width
of an element to match the min-width
of the current breakpoint. This is useful if you’d prefer to design for a fixed set of screen sizes instead of trying to accommodate a fully fluid viewport.
Note that unlike containers you might have used in other frameworks, Tailwind’s container does not center itself automatically and does not have any built-in horizontal padding.
<div class="container mx-auto px-4"> <!-- ... --> </div>
References
https://tailwindcss.com/docs/container
register a TypeAdapter
with GSON
to wrap the use of a Joda preconfigured Formatters :
public static Gson gsonDateTime() { Gson gson = new GsonBuilder() .registerTypeAdapter(DateTime.class, new JsonSerializer<DateTime>() { @Override public JsonElement serialize(DateTime json, Type typeOfSrc, JsonSerializationContext context) { return new JsonPrimitive(ISODateTimeFormat.dateTime().print(json)); } }) .registerTypeAdapter(DateTime.class, new JsonDeserializer<DateTime>() { @Override public DateTime deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { DateTime dt = ISODateTimeFormat.dateTime().parseDateTime(json.getAsString()); return dt; } }) .create(); return gson; }
MongoDB Configuration
@Configuration @EnableMongoRepositories(basePackages = "com.baeldung.repository") public class MongoConfig extends AbstractMongoClientConfiguration{ @Bean MongoTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { return new MongoTransactionManager(dbFactory); } @Override protected String getDatabaseName() { return "test"; } @Override public MongoClient mongoClient() { final ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/test"); final MongoClientSettings mongoClientSettings = MongoClientSettings.builder() .applyConnectionString(connectionString) .build(); return MongoClients.create(mongoClientSettings); } }
Synchronous Transactions
@Test @Transactional public void whenPerformMongoTransaction_thenSuccess() { userRepository.save(new User("John", 30)); userRepository.save(new User("Ringo", 35)); Query query = new Query().addCriteria(Criteria.where("name").is("John")); List<User> users = mongoTemplate.find(query, User.class); assertThat(users.size(), is(1)); }
Note that we can’t use listCollections
command inside a multi-document transaction – for example:
References
https://www.baeldung.com/spring-data-mongodb-transactions