- 事务消息
spring.cloud.stream.bindings.outputTX.destination=TransactionTopic
spring.cloud.stream.bindings.outputTX.content-type=text/plain
spring.cloud.stream.rocketmq.bindings.outputTX.producer.group=myTXProducerGroup
#默认事务是关闭的
spring.cloud.stream.rocketmq.bindings.outputTX.producer.transactional=true
spring.cloud.stream.bindings.inputTX.destination=TransactionTopic
spring.cloud.stream.bindings.inputTX.content-type=text/plain
spring.cloud.stream.bindings.inputTX.group=transaction-group
spring.cloud.stream.rocketmq.bindings.inputTX.consumer.broadcasting=false
创建自定义Source,Sink(省略代码)
事务监听
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;
//myTXProducerGroup和properties中的配置producer.group的值一样
@RocketMQTransactionListener(txProducerGroup = "myTXProducerGroup",corePoolSize = 5,maximumPoolSize = 10)
public class TransactionListenerImpl implements RocketMQLocalTransactionListener {
@Override
public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
Object num = msg.getHeaders().get("test");
if ("1".equals(num)){
System.out.println("executer:"+new String((byte[]) msg.getPayload())+"unknown");
return RocketMQLocalTransactionState.UNKNOWN;
}else if("2".equals(num)){
System.out.println("executer:"+new String((byte[]) msg.getPayload())+"rollback");
return RocketMQLocalTransactionState.ROLLBACK;
}
System.out.println("executer:"+new String((byte[]) msg.getPayload())+"commit");
return RocketMQLocalTransactionState.COMMIT;
}
@Override
public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
System.out.println("check:"+new String((byte[]) msg.getPayload()));
return RocketMQLocalTransactionState.COMMIT;
}
}
生产者
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeTypeUtils;
@Service
public class SenderService {
@Autowired
private MySource mySource;
public <T> void sendTransactionalMsg(T msg,int num){
MessageBuilder builder = MessageBuilder.withPayload(msg)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
.setHeader("test", String.valueOf(num));
Message message=builder.build();
mySource.outputTX().send(message);
}
}
消费者
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.stereotype.Service;
@Service
public class ReceiveService {
@StreamListener(value = MySink.INPUTTX)
public void receiveMessageTX(String message){
System.out.println("接收的消息inputTX==>"+message);
}
}
测试
@Autowired
private SenderService senderService;
@GetMapping(value = "/inputTX")
public String inputTX(String msg) throws Exception {
senderService.sendTransactionalMsg(msg+"1",1);
senderService.sendTransactionalMsg(msg+"2",2);
senderService.sendTransactionalMsg(msg+"3",3);
senderService.sendTransactionalMsg(msg+"4",4);
return "ok";
}
结果
- 发送标签消息
生产者
import org.apache.rocketmq.common.message.MessageConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Service;
import org.springframework.util.MimeTypeUtils;
@Service
public class SenderService {
@Autowired
private MySource mySource;
public <T> void sendObject(T msg,String tag) throws Exception{
Message message=MessageBuilder.withPayload(msg)
.setHeader(MessageConst.PROPERTY_TAGS, tag)
.setHeader(MessageHeaders.CONTENT_TYPE, MimeTypeUtils.APPLICATION_JSON)
.build();
boolean flag = mySource.output2().send(message);
System.out.println("sendObject==>"+flag );
}
}
测试
@GetMapping(value = "/sendObject")
public String sendObject() throws Exception {
JSONObject ss = new JSONObject();
ss.put("name", "name");
senderService.sendObject(ss,"myTag");
return "ok";
}
配置
那么此消费者信道就只能监听tag为myTag的消息