1
0
mirror of https://gitee.com/mirrors/Spring-Cloud-Alibaba.git synced 2021-06-26 13:25:11 +08:00

Code refactoring and some new feature support - delete some invalid files.

This commit is contained in:
zkzlx 2021-03-22 11:05:31 +08:00
parent 09841f6616
commit 6d7c47a366
9 changed files with 61 additions and 55 deletions

View File

@ -3,20 +3,20 @@ spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876
spring.cloud.stream.bindings.input1.destination=test-topic spring.cloud.stream.bindings.input1.destination=test-topic
spring.cloud.stream.bindings.input1.content-type=text/plain spring.cloud.stream.bindings.input1.content-type=text/plain
spring.cloud.stream.bindings.input1.group=test-group1 spring.cloud.stream.bindings.input1.group=test-group1
spring.cloud.stream.rocketmq.bindings.input1.consumer.orderly=true spring.cloud.stream.rocketmq.bindings.input1.consumer.push.orderly=true
spring.cloud.stream.bindings.input2.destination=test-topic spring.cloud.stream.bindings.input2.destination=test-topic
spring.cloud.stream.bindings.input2.content-type=text/plain spring.cloud.stream.bindings.input2.content-type=text/plain
spring.cloud.stream.bindings.input2.group=test-group2 spring.cloud.stream.bindings.input2.group=test-group2
spring.cloud.stream.rocketmq.bindings.input2.consumer.orderly=false spring.cloud.stream.rocketmq.bindings.input2.consumer.push.orderly=false
spring.cloud.stream.rocketmq.bindings.input2.consumer.tags=tagStr spring.cloud.stream.rocketmq.bindings.input2.consumer.subscription=tagStr
spring.cloud.stream.bindings.input2.consumer.concurrency=20 spring.cloud.stream.bindings.input2.consumer.concurrency=20
spring.cloud.stream.bindings.input2.consumer.maxAttempts=1 spring.cloud.stream.bindings.input2.consumer.maxAttempts=1
spring.cloud.stream.bindings.input3.destination=test-topic spring.cloud.stream.bindings.input3.destination=test-topic
spring.cloud.stream.bindings.input3.content-type=application/json spring.cloud.stream.bindings.input3.content-type=application/json
spring.cloud.stream.bindings.input3.group=test-group3 spring.cloud.stream.bindings.input3.group=test-group3
spring.cloud.stream.rocketmq.bindings.input3.consumer.tags=tagObj spring.cloud.stream.rocketmq.bindings.input3.consumer.subscription=tagObj
spring.cloud.stream.bindings.input3.consumer.concurrency=20 spring.cloud.stream.bindings.input3.consumer.concurrency=20
spring.cloud.stream.bindings.input4.destination=TransactionTopic spring.cloud.stream.bindings.input4.destination=TransactionTopic

View File

@ -20,8 +20,8 @@ import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import com.alibaba.cloud.examples.RocketMQProduceApplication.MySource; import com.alibaba.cloud.examples.RocketMQProduceApplication.MySource;
import com.alibaba.cloud.stream.binder.rocketmq.contants.RocketMQConst;
import org.apache.rocketmq.common.message.MessageConst; import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.spring.support.RocketMQHeaders;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message; import org.springframework.messaging.Message;
@ -62,7 +62,7 @@ public class SenderService {
MessageBuilder builder = MessageBuilder.withPayload(msg) MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON); .setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON);
builder.setHeader("test", String.valueOf(num)); builder.setHeader("test", String.valueOf(num));
builder.setHeader(RocketMQHeaders.TAGS, "binder"); builder.setHeader(RocketMQConst.USER_TRANSACTIONAL_ARGS, "binder");
Message message = builder.build(); Message message = builder.build();
source.output2().send(message); source.output2().send(message);
} }

View File

@ -16,43 +16,43 @@
package com.alibaba.cloud.examples; package com.alibaba.cloud.examples;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message; import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Component;
/** /**
* @author <a href="mailto:fangjian0423@gmail.com">Jim</a> * @author <a href="mailto:fangjian0423@gmail.com">Jim</a>
*/ */
@RocketMQTransactionListener(txProducerGroup = "myTxProducerGroup", corePoolSize = 5, @Component("myTransactionListener")
maximumPoolSize = 10) public class TransactionListenerImpl implements TransactionListener {
public class TransactionListenerImpl implements RocketMQLocalTransactionListener {
@Override @Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, public LocalTransactionState executeLocalTransaction(Message msg,
Object arg) { Object arg) {
Object num = msg.getHeaders().get("test"); Object num = msg.getProperty("test");
if ("1".equals(num)) { if ("1".equals(num)) {
System.out.println( System.out.println(
"executer: " + new String((byte[]) msg.getPayload()) + " unknown"); "executer: " + new String(msg.getBody()) + " unknown");
return RocketMQLocalTransactionState.UNKNOWN; return LocalTransactionState.UNKNOW;
} }
else if ("2".equals(num)) { else if ("2".equals(num)) {
System.out.println( System.out.println(
"executer: " + new String((byte[]) msg.getPayload()) + " rollback"); "executer: " + new String(msg.getBody()) + " rollback");
return RocketMQLocalTransactionState.ROLLBACK; return LocalTransactionState.ROLLBACK_MESSAGE;
} }
System.out.println( System.out.println(
"executer: " + new String((byte[]) msg.getPayload()) + " commit"); "executer: " + new String(msg.getBody()) + " commit");
return RocketMQLocalTransactionState.COMMIT; return LocalTransactionState.COMMIT_MESSAGE;
} }
@Override @Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) { public LocalTransactionState checkLocalTransaction(MessageExt msg) {
System.out.println("check: " + new String((byte[]) msg.getPayload())); System.out.println("check: " + new String(msg.getBody()));
return RocketMQLocalTransactionState.COMMIT; return LocalTransactionState.COMMIT_MESSAGE;
} }
} }

View File

@ -11,6 +11,7 @@ spring.cloud.stream.bindings.output2.destination=TransactionTopic
spring.cloud.stream.bindings.output2.content-type=application/json spring.cloud.stream.bindings.output2.content-type=application/json
spring.cloud.stream.rocketmq.bindings.output2.producer.transactional=true spring.cloud.stream.rocketmq.bindings.output2.producer.transactional=true
spring.cloud.stream.rocketmq.bindings.output2.producer.group=myTxProducerGroup spring.cloud.stream.rocketmq.bindings.output2.producer.group=myTxProducerGroup
spring.cloud.stream.rocketmq.bindings.output2.producer.transactionListener=myTransactionListener
spring.cloud.stream.bindings.output3.destination=pull-topic spring.cloud.stream.bindings.output3.destination=pull-topic
spring.cloud.stream.bindings.output3.content-type=text/plain spring.cloud.stream.bindings.output3.content-type=text/plain

View File

@ -18,18 +18,11 @@ package com.alibaba.cloud.stream.binder.rocketmq.contants;
import org.apache.rocketmq.common.message.MessageConst; import org.apache.rocketmq.common.message.MessageConst;
import static org.apache.rocketmq.spring.support.RocketMQHeaders.PREFIX;
/** /**
* @author zkzlx * @author zkzlx
*/ */
public class RocketMQConst extends MessageConst { public class RocketMQConst extends MessageConst {
/**
* Header key for RocketMQ Transactional Args.
*/
public static final String ROCKET_TRANSACTIONAL_ARG = "TRANSACTIONAL_ARG";
/** /**
* Default NameServer value. * Default NameServer value.
*/ */
@ -38,12 +31,8 @@ public class RocketMQConst extends MessageConst {
/** /**
* Default group for SCS RocketMQ Binder. * Default group for SCS RocketMQ Binder.
*/ */
public static final String DEFAULT_GROUP = PREFIX + "binder_default_group_name"; public static final String DEFAULT_GROUP = "binder_default_group_name";
/**
* RocketMQ re-consume times.
*/
public static final String ROCKETMQ_RECONSUME_TIMES = PREFIX + "RECONSUME_TIMES";
public static final String USER_TRANSACTIONAL_ARGS = "TRANSACTIONAL_ARGS"; public static final String USER_TRANSACTIONAL_ARGS = "TRANSACTIONAL_ARGS";

View File

@ -17,6 +17,7 @@
package com.alibaba.cloud.stream.binder.rocketmq.integration.inbound.pull; package com.alibaba.cloud.stream.binder.rocketmq.integration.inbound.pull;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List; import java.util.List;
import com.alibaba.cloud.stream.binder.rocketmq.integration.inbound.RocketMQConsumerFactory; import com.alibaba.cloud.stream.binder.rocketmq.integration.inbound.RocketMQConsumerFactory;
@ -62,6 +63,8 @@ public class RocketMQMessageSource extends AbstractMessageSource<Object>
private final MessageSelector messageSelector; private final MessageSelector messageSelector;
private final ExtendedConsumerProperties<RocketMQConsumerProperties> extendedConsumerProperties; private final ExtendedConsumerProperties<RocketMQConsumerProperties> extendedConsumerProperties;
private volatile Iterator<MessageExt> messageExtIterator=null;
public RocketMQMessageSource(String name, public RocketMQMessageSource(String name,
ExtendedConsumerProperties<RocketMQConsumerProperties> extendedConsumerProperties) { ExtendedConsumerProperties<RocketMQConsumerProperties> extendedConsumerProperties) {
this.topic = name; this.topic = name;
@ -82,7 +85,7 @@ public class RocketMQMessageSource extends AbstractMessageSource<Object>
this.consumer = RocketMQConsumerFactory this.consumer = RocketMQConsumerFactory
.initPullConsumer(extendedConsumerProperties); .initPullConsumer(extendedConsumerProperties);
// This parameter must be 1, otherwise doReceive cannot be handled singly. // This parameter must be 1, otherwise doReceive cannot be handled singly.
this.consumer.setPullBatchSize(1); // this.consumer.setPullBatchSize(1);
this.consumer.subscribe(topic, messageSelector); this.consumer.subscribe(topic, messageSelector);
this.consumer.setAutoCommit(false); this.consumer.setAutoCommit(false);
this.assignedMessageQueue = acquireAssignedMessageQueue(this.consumer); this.assignedMessageQueue = acquireAssignedMessageQueue(this.consumer);
@ -132,11 +135,20 @@ public class RocketMQMessageSource extends AbstractMessageSource<Object>
@Override @Override
protected synchronized Object doReceive() { protected synchronized Object doReceive() {
if(messageExtIterator == null){
List<MessageExt> messageExtList = consumer.poll(); List<MessageExt> messageExtList = consumer.poll();
if (CollectionUtils.isEmpty(messageExtList) || messageExtList.size() > 1) { if (CollectionUtils.isEmpty(messageExtList) || messageExtList.size() > 1) {
return null; return null;
} }
MessageExt messageExt = messageExtList.get(0); messageExtIterator = messageExtList.iterator();
}
MessageExt messageExt=messageExtIterator.next();
if(!messageExtIterator.hasNext()){
messageExtIterator = null;
}
if(null == messageExt){
return null;
}
MessageQueue messageQueue = null; MessageQueue messageQueue = null;
for (MessageQueue queue : assignedMessageQueue.getAssignedMessageQueues()) { for (MessageQueue queue : assignedMessageQueue.getAssignedMessageQueues()) {
if (queue.getQueueId() == messageExt.getQueueId()) { if (queue.getQueueId() == messageExt.getQueueId()) {
@ -144,8 +156,11 @@ public class RocketMQMessageSource extends AbstractMessageSource<Object>
break; break;
} }
} }
if(messageQueue == null){
throw new IllegalArgumentException("The message queue is not in assigned list");
}
Message message = RocketMQMessageConverterSupport Message message = RocketMQMessageConverterSupport
.convertMessage2Spring(messageExtList.get(0)); .convertMessage2Spring(messageExt);
return MessageBuilder.fromMessage(message) return MessageBuilder.fromMessage(message)
.setHeader(IntegrationMessageHeaderAccessor.ACKNOWLEDGMENT_CALLBACK, .setHeader(IntegrationMessageHeaderAccessor.ACKNOWLEDGMENT_CALLBACK,
new RocketMQAckCallback(this.consumer, assignedMessageQueue, new RocketMQAckCallback(this.consumer, assignedMessageQueue,

View File

@ -160,7 +160,7 @@ public class RocketMQProducerMessageHandler extends AbstractMessageHandler
TransactionListener.class); TransactionListener.class);
if (transactionListener == null) { if (transactionListener == null) {
throw new MessagingException( throw new MessagingException(
"TransactionMQProducer must have a TransactionMQProducer !!! "); "TransactionMQProducer must have a TransactionListener !!! ");
} }
((TransactionMQProducer) defaultMQProducer) ((TransactionMQProducer) defaultMQProducer)
.setTransactionListener(transactionListener); .setTransactionListener(transactionListener);

View File

@ -16,6 +16,7 @@
package com.alibaba.cloud.stream.binder.rocketmq.utils; package com.alibaba.cloud.stream.binder.rocketmq.utils;
import com.alibaba.cloud.stream.binder.rocketmq.contants.RocketMQConst;
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties;
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQCommonProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQCommonProperties;
import org.apache.rocketmq.acl.common.AclClientRPCHook; import org.apache.rocketmq.acl.common.AclClientRPCHook;
@ -81,7 +82,7 @@ public class RocketMQUtils {
public static String getNameServerStr(String nameServer) { public static String getNameServerStr(String nameServer) {
if (StringUtils.isEmpty(nameServer)) { if (StringUtils.isEmpty(nameServer)) {
return null; return RocketMQConst.DEFAULT_NAME_SERVER;
} }
return nameServer.replaceAll(",", ";"); return nameServer.replaceAll(",", ";");
} }

View File

@ -18,7 +18,7 @@ package com.alibaba.cloud.stream.binder.rocketmq;
import java.util.Arrays; import java.util.Arrays;
import com.alibaba.cloud.stream.binder.rocketmq.config.RocketMQBinderAutoConfiguration; import com.alibaba.cloud.stream.binder.rocketmq.autoconfigurate.RocketMQBinderAutoConfiguration;
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQBinderConfigurationProperties;
import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQExtendedBindingProperties; import com.alibaba.cloud.stream.binder.rocketmq.properties.RocketMQExtendedBindingProperties;
import org.junit.Test; import org.junit.Test;
@ -37,20 +37,20 @@ public class RocketMQAutoConfigurationTests {
.withConfiguration( .withConfiguration(
AutoConfigurations.of(RocketMQBinderAutoConfiguration.class)) AutoConfigurations.of(RocketMQBinderAutoConfiguration.class))
.withPropertyValues( .withPropertyValues(
"spring.cloud.stream.rocketmq.binder.name-server[0]=127.0.0.1:9876", "spring.cloud.stream.rocketmq.binder.name-server=127.0.0.1:9876,127.0.0.1:9877",
"spring.cloud.stream.rocketmq.binder.name-server[1]=127.0.0.1:9877",
"spring.cloud.stream.bindings.output.destination=TopicOrderTest", "spring.cloud.stream.bindings.output.destination=TopicOrderTest",
"spring.cloud.stream.bindings.output.content-type=application/json", "spring.cloud.stream.bindings.output.content-type=application/json",
"spring.cloud.stream.bindings.input1.destination=TopicOrderTest", "spring.cloud.stream.bindings.input1.destination=TopicOrderTest",
"spring.cloud.stream.bindings.input1.content-type=application/json", "spring.cloud.stream.bindings.input1.content-type=application/json",
"spring.cloud.stream.bindings.input1.group=test-group1", "spring.cloud.stream.bindings.input1.group=test-group1",
"spring.cloud.stream.rocketmq.bindings.input1.consumer.orderly=true", "spring.cloud.stream.rocketmq.bindings.input1.consumer.push.orderly=true",
"spring.cloud.stream.bindings.input1.consumer.maxAttempts=1", "spring.cloud.stream.bindings.input1.consumer.maxAttempts=1",
"spring.cloud.stream.bindings.input2.destination=TopicOrderTest", "spring.cloud.stream.bindings.input2.destination=TopicOrderTest",
"spring.cloud.stream.bindings.input2.content-type=application/json", "spring.cloud.stream.bindings.input2.content-type=application/json",
"spring.cloud.stream.bindings.input2.group=test-group2", "spring.cloud.stream.bindings.input2.group=test-group2",
"spring.cloud.stream.rocketmq.bindings.input2.consumer.orderly=false", "spring.cloud.stream.rocketmq.bindings.input2.consumer.push.orderly=false",
"spring.cloud.stream.rocketmq.bindings.input2.consumer.tags=tag1"); "spring.cloud.stream.rocketmq.bindings.input2.consumer.subscription=tag1");
@Test @Test
public void testProperties() { public void testProperties() {
@ -58,16 +58,16 @@ public class RocketMQAutoConfigurationTests {
RocketMQBinderConfigurationProperties binderConfigurationProperties = context RocketMQBinderConfigurationProperties binderConfigurationProperties = context
.getBean(RocketMQBinderConfigurationProperties.class); .getBean(RocketMQBinderConfigurationProperties.class);
assertThat(binderConfigurationProperties.getNameServer()) assertThat(binderConfigurationProperties.getNameServer())
.isEqualTo(Arrays.asList("127.0.0.1:9876", "127.0.0.1:9877")); .isEqualTo("127.0.0.1:9876,127.0.0.1:9877");
RocketMQExtendedBindingProperties bindingProperties = context RocketMQExtendedBindingProperties bindingProperties = context
.getBean(RocketMQExtendedBindingProperties.class); .getBean(RocketMQExtendedBindingProperties.class);
assertThat( assertThat(
bindingProperties.getExtendedConsumerProperties("input2").getTags()) bindingProperties.getExtendedConsumerProperties("input2").getSubscription())
.isEqualTo("tag1"); .isEqualTo("tag1");
assertThat(bindingProperties.getExtendedConsumerProperties("input2") assertThat(bindingProperties.getExtendedConsumerProperties("input2").getPush().getOrderly()
.getOrderly()).isFalse(); ).isFalse();
assertThat(bindingProperties.getExtendedConsumerProperties("input1") assertThat(bindingProperties.getExtendedConsumerProperties("input1")
.getOrderly()).isTrue(); .getPush().getOrderly()).isTrue();
}); });
} }