From 666aaa759df1257298f5fdc05e14ec8b9f79869f Mon Sep 17 00:00:00 2001 From: fft <2386101282@qq.com> Date: Sun, 25 Sep 2022 19:41:09 +0800 Subject: [PATCH 1/3] feat: add Sequencer for spring boot --- .../pubsub/springboot/SequencerMethod.java | 18 ++++ .../springboot/LayottoAutoConfiguration.java | 4 + .../LayottoBeanPostProcessorSequencer.java | 90 +++++++++++++++++++ .../layotto/springboot/LayottoProperties.java | 19 ++++ 4 files changed, 131 insertions(+) create mode 100644 examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java create mode 100644 sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java diff --git a/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java b/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java new file mode 100644 index 0000000..c4c05ee --- /dev/null +++ b/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java @@ -0,0 +1,18 @@ +package io.mosn.layotto.examples.pubsub.springboot; + +import io.mosn.layotto.v1.Sequencer; +import org.springframework.stereotype.Component; +import spec.sdk.runtime.v1.domain.sequencer.GetNextIdRequest; +@Component +public class SequencerMethod { + @Sequencer(store_name="sequencer_demo", key = "examples", options ="STRONG" ) + public void method1(GetNextIdRequest request) { + System.out.println(new String(request.getStoreName())); + } + + @Sequencer(store_name="sequencer_demo", key = "examples", options ="WEAK" ) + public void method2(GetNextIdRequest request) { + System.out.println(new String(request.getStoreName())); + } + +} diff --git a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoAutoConfiguration.java b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoAutoConfiguration.java index 9950de9..cf316fe 100644 --- a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoAutoConfiguration.java +++ b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoAutoConfiguration.java @@ -40,4 +40,8 @@ public LayottoBeanPostProcessor layottoBeanPostProcessor(ConfigurableBeanFactory public LayottoSubscriberStarter LayottoSubscriberStarter() { return new LayottoSubscriberStarter(); } + + @Bean + @ConditionalOnMissingBean + public LayottoBeanPostProcessorSequencer LayottoBeanPostProcessorSequencer(ConfigurableBeanFactory beanFactory){return new LayottoBeanPostProcessorSequencer(beanFactory); } } diff --git a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java new file mode 100644 index 0000000..78d8e63 --- /dev/null +++ b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java @@ -0,0 +1,90 @@ +package io.mosn.layotto.springboot; + +import io.mosn.layotto.v1.RuntimeClientBuilder; +import io.mosn.layotto.v1.Sequencer; +import io.mosn.layotto.v1.callback.component.pubsub.DefaultSubscriber; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.beans.factory.config.EmbeddedValueResolver; +import spec.sdk.runtime.v1.client.RuntimeClient; +import spec.sdk.runtime.v1.domain.sequencer.GetNextIdRequest; +import spec.sdk.runtime.v1.domain.sequencer.SequencerOptions; + +import java.lang.reflect.Method; +import java.util.Map; + + +public class LayottoBeanPostProcessorSequencer implements BeanPostProcessor { + private static final Logger LOGGER = LoggerFactory.getLogger(LayottoBeanPostProcessorSequencer.class.getName()); + + private final EmbeddedValueResolver embeddedValueResolver; + @Autowired + private static LayottoProperties layottoConfig; + + + LayottoBeanPostProcessorSequencer(ConfigurableBeanFactory beanFactory) { + embeddedValueResolver = new EmbeddedValueResolver(beanFactory); + } + + /** + * {@inheritDoc} + */ + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + + sequencer(bean.getClass(), bean, embeddedValueResolver); + + return bean; + } + + + /** + * {@inheritDoc} + */ + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + + return bean; + } + + private static void sequencer(Class clazz, Object bean, EmbeddedValueResolver embeddedValueResolver) { + if (clazz == null) { + return; + } + + sequencer(clazz.getSuperclass(), bean, embeddedValueResolver); + for (Method method : clazz.getDeclaredMethods()) { + Sequencer getsequencer = method.getAnnotation(Sequencer.class); + if (getsequencer == null) { + continue; + } + String storeName = embeddedValueResolver.resolveStringValue(getsequencer.store_name()); + String key = embeddedValueResolver.resolveStringValue(getsequencer.key()); + String options = embeddedValueResolver.resolveStringValue(getsequencer.options()); + if (StringUtils.isNotEmpty(storeName) && StringUtils.isNotEmpty(key)&& StringUtils.isNotEmpty(options)) { + + RuntimeClient layottoRuntime = new RuntimeClientBuilder().withIp(layottoConfig.DEFAULT_IP). + withPort(layottoConfig.DEFAULT_PORT) + .build(); + GetNextIdRequest getNextIdRequest = new GetNextIdRequest(); + getNextIdRequest.setStoreName(storeName); + getNextIdRequest.setKey(key); + + SequencerOptions anoptions = new SequencerOptions(); + if(options.equals("STRONG") ) + anoptions.setOption(SequencerOptions.AutoIncrement.STRONG); + else if(options.equals("WEAK")) + anoptions.setOption(SequencerOptions.AutoIncrement.WEAK); + getNextIdRequest.setOptions(anoptions); + + long nextID = layottoRuntime.getNextId(getNextIdRequest).getNextId(); + LOGGER.info("NextID:{},options:{}", nextID,options); + } + } + } +} diff --git a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoProperties.java b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoProperties.java index 42492b2..3e5624c 100644 --- a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoProperties.java +++ b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoProperties.java @@ -24,8 +24,27 @@ public class LayottoProperties { public static final int DEFAULT_SUBSCRIBER_PORT = 9999; + public static final int DEFAULT_PORT = 34904; + + public static final String DEFAULT_IP = "127.0.0.1"; + + public Integer subscriberPort; + public Integer Port; + + public String Ip; + + public String getIp() { return Ip == null ? DEFAULT_IP : this.Ip;} + + public void setIp(String ip) { Ip = ip; } + + + public Integer getPort() { return Port == null ? DEFAULT_PORT : this.Port; } + + public void setPort(Integer port) { this.Port = port; } + + public void setSubscriberPort(Integer subscriberPort) { this.subscriberPort = subscriberPort; } From 81e7eafc0e5e410add9203eba330ad8f96fa1469 Mon Sep 17 00:00:00 2001 From: fft <2386101282@qq.com> Date: Tue, 27 Sep 2022 10:36:17 +0800 Subject: [PATCH 2/3] fix: invoke the method and add the sequencer file --- .../pubsub/springboot/SequencerMethod.java | 15 +++++------ .../LayottoBeanPostProcessorSequencer.java | 26 +++++++++++++------ .../java/io/mosn/layotto/v1/Sequencer.java | 14 ++++++++++ 3 files changed, 39 insertions(+), 16 deletions(-) create mode 100644 sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java diff --git a/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java b/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java index c4c05ee..285c55f 100644 --- a/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java +++ b/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java @@ -5,14 +5,13 @@ import spec.sdk.runtime.v1.domain.sequencer.GetNextIdRequest; @Component public class SequencerMethod { - @Sequencer(store_name="sequencer_demo", key = "examples", options ="STRONG" ) - public void method1(GetNextIdRequest request) { - System.out.println(new String(request.getStoreName())); - } - - @Sequencer(store_name="sequencer_demo", key = "examples", options ="WEAK" ) - public void method2(GetNextIdRequest request) { - System.out.println(new String(request.getStoreName())); + @Sequencer(store_name="sequencer_demo", key = "examples", options ="STRONG" ) + public void method1(long nextId) { + System.out.println("NextID: "+ nextId); } + @Sequencer(store_name="sequencer_demo", key = "examples", options ="WEAK" ) + public void method2(long nextId) { + System.out.println("NextID: "+ nextId); + } } diff --git a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java index 78d8e63..b3722f1 100644 --- a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java +++ b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java @@ -2,7 +2,6 @@ import io.mosn.layotto.v1.RuntimeClientBuilder; import io.mosn.layotto.v1.Sequencer; -import io.mosn.layotto.v1.callback.component.pubsub.DefaultSubscriber; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,8 +14,8 @@ import spec.sdk.runtime.v1.domain.sequencer.GetNextIdRequest; import spec.sdk.runtime.v1.domain.sequencer.SequencerOptions; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.Map; public class LayottoBeanPostProcessorSequencer implements BeanPostProcessor { @@ -24,7 +23,7 @@ public class LayottoBeanPostProcessorSequencer implements BeanPostProcessor { private final EmbeddedValueResolver embeddedValueResolver; @Autowired - private static LayottoProperties layottoConfig; + private static LayottoProperties layottoConfig; LayottoBeanPostProcessorSequencer(ConfigurableBeanFactory beanFactory) { @@ -37,7 +36,13 @@ public class LayottoBeanPostProcessorSequencer implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - sequencer(bean.getClass(), bean, embeddedValueResolver); + try { + sequencer(bean.getClass(), bean, embeddedValueResolver); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } return bean; } @@ -52,11 +57,10 @@ public Object postProcessAfterInitialization(Object bean, String beanName) throw return bean; } - private static void sequencer(Class clazz, Object bean, EmbeddedValueResolver embeddedValueResolver) { + private static void sequencer(Class clazz, Object bean, EmbeddedValueResolver embeddedValueResolver) throws InvocationTargetException, IllegalAccessException { if (clazz == null) { return; } - sequencer(clazz.getSuperclass(), bean, embeddedValueResolver); for (Method method : clazz.getDeclaredMethods()) { Sequencer getsequencer = method.getAnnotation(Sequencer.class); @@ -82,8 +86,14 @@ else if(options.equals("WEAK")) anoptions.setOption(SequencerOptions.AutoIncrement.WEAK); getNextIdRequest.setOptions(anoptions); - long nextID = layottoRuntime.getNextId(getNextIdRequest).getNextId(); - LOGGER.info("NextID:{},options:{}", nextID,options); + long nextId = layottoRuntime.getNextId(getNextIdRequest).getNextId(); + try { + method.invoke(bean, nextId); + } catch (Exception e) { + LOGGER.error("layotto sequencer method [{}] err:{ }", method.getName(), e.getMessage()); + throw e; + } + LOGGER.info("NextID:{},options:{}", nextId,options); } } } diff --git a/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java b/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java new file mode 100644 index 0000000..dc7e90a --- /dev/null +++ b/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java @@ -0,0 +1,14 @@ + +package io.mosn.layotto.v1; + +import java.lang.annotation.*; + +@Documented +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Sequencer { + + String store_name(); + String key(); + String options(); +} \ No newline at end of file From a5aee4d31ebb700dd9d33149a08ddd0384cd55d8 Mon Sep 17 00:00:00 2001 From: fft <2386101282@qq.com> Date: Tue, 27 Sep 2022 14:01:14 +0800 Subject: [PATCH 3/3] Rename --- .../layotto/examples/pubsub/springboot/SequencerMethod.java | 4 ++-- .../layotto/springboot/LayottoBeanPostProcessorSequencer.java | 2 +- sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java b/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java index 285c55f..deb9e50 100644 --- a/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java +++ b/examples/src/main/java/io/mosn/layotto/examples/pubsub/springboot/SequencerMethod.java @@ -5,12 +5,12 @@ import spec.sdk.runtime.v1.domain.sequencer.GetNextIdRequest; @Component public class SequencerMethod { - @Sequencer(store_name="sequencer_demo", key = "examples", options ="STRONG" ) + @Sequencer(storeName="sequencer_demo", key = "examples", options ="STRONG" ) public void method1(long nextId) { System.out.println("NextID: "+ nextId); } - @Sequencer(store_name="sequencer_demo", key = "examples", options ="WEAK" ) + @Sequencer(storeName="sequencer_demo", key = "examples", options ="WEAK" ) public void method2(long nextId) { System.out.println("NextID: "+ nextId); } diff --git a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java index b3722f1..e61c11b 100644 --- a/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java +++ b/sdk-springboot/src/main/java/io/mosn/layotto/springboot/LayottoBeanPostProcessorSequencer.java @@ -67,7 +67,7 @@ private static void sequencer(Class clazz, Object bean, EmbeddedValueResolver em if (getsequencer == null) { continue; } - String storeName = embeddedValueResolver.resolveStringValue(getsequencer.store_name()); + String storeName = embeddedValueResolver.resolveStringValue(getsequencer.storeName()); String key = embeddedValueResolver.resolveStringValue(getsequencer.key()); String options = embeddedValueResolver.resolveStringValue(getsequencer.options()); if (StringUtils.isNotEmpty(storeName) && StringUtils.isNotEmpty(key)&& StringUtils.isNotEmpty(options)) { diff --git a/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java b/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java index dc7e90a..f94c1c7 100644 --- a/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java +++ b/sdk/src/main/java/io/mosn/layotto/v1/Sequencer.java @@ -7,8 +7,9 @@ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Sequencer { + String storeName(); - String store_name(); String key(); + String options(); } \ No newline at end of file