diff --git a/spring-cloud-alibaba-dependencies/pom.xml b/spring-cloud-alibaba-dependencies/pom.xml
index 428906b7..356418ff 100644
--- a/spring-cloud-alibaba-dependencies/pom.xml
+++ b/spring-cloud-alibaba-dependencies/pom.xml
@@ -25,7 +25,6 @@
1.0.0
2.16.0
4.3.1
- 3.2.6
@@ -221,13 +220,6 @@
${project.version}
-
-
- io.dropwizard.metrics
- metrics-core
- ${metrics.core}
-
-
diff --git a/spring-cloud-alibaba-examples/rocketmq-example/pom.xml b/spring-cloud-alibaba-examples/rocketmq-example/pom.xml
index e8800187..9e33978a 100644
--- a/spring-cloud-alibaba-examples/rocketmq-example/pom.xml
+++ b/spring-cloud-alibaba-examples/rocketmq-example/pom.xml
@@ -28,6 +28,10 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ io.dropwizard.metrics
+ metrics-core
+
diff --git a/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md b/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md
index b00bfbc3..1156b81f 100644
--- a/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md
+++ b/spring-cloud-alibaba-examples/rocketmq-example/readme-zh.md
@@ -6,13 +6,21 @@
[RocketMQ](https://rocketmq.apache.org/) 是一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。
-在说明RocketMQ的示例之前,我们先了解一下 Spring Cloud Stream 中的Binder和Binding概念。
+在说明RocketMQ的示例之前,我们先了解一下 Spring Cloud Stream。
-Binder: 跟外部消息中间件集成的组件,用来创建Binding,各消息中间件都有自己的Binder实现。
+这是官方对Spring Cloud Stream的一段介绍:
+
+Spring Cloud Stream是一个用于构建基于消息的微服务应用框架。它基于SpringBoot来创建具有生产级别的单机Spring应用,并且使用 `Spring Integration` 与Broker进行连接。
+
+Spring Cloud Stream提供了消息中间件配置的统一抽象,推出了 publish-subscribe、consumer groups、partition 这些统一的概念。
+
+Spring Cloud Stream 内部有2个概念:Binder 和 Binding。
+
+* Binder: 跟外部消息中间件集成的组件,用来创建Binding,各消息中间件都有自己的Binder实现。
比如 `Kafka` 的实现 `KafkaMessageChannelBinder` ,`RabbitMQ` 的实现 `RabbitMessageChannelBinder` 以及 `RocketMQ` 的实现 `RocketMQMessageChannelBinder` 。
-Binding: 包括Input Binding和Output Binding。
+* Binding: 包括Input Binding和Output Binding。
Binding在消息中间件与应用程序提供的Provider和Consumer之间提供了一个桥梁,实现了开发者只需使用应用程序的Provider或Consumer生产或消费数据即可,屏蔽了开发者与底层消息中间件的接触。
@@ -110,8 +118,9 @@ server.port=28081
使用2个input binding订阅数据。
-input1: 订阅topic为test-topic的消息,顺序消费所有消息(顺序消费的前提是所有消息都在一个MessageQueue中)
-input2: 订阅topic为test-topic的消息,异步消费tags为tagStr的消息,Consumer端线程池个数为20
+* input1:订阅topic为test-topic的消息,顺序消费所有消息(顺序消费的前提是所有消息都在一个MessageQueue中)
+
+* input2:订阅topic为test-topic的消息,异步消费tags为tagStr的消息,Consumer端线程池个数为20
配置信息如下:
@@ -249,6 +258,14 @@ Spring Boot 1.x 可以通过访问 http://127.0.0.1:28081/rocketmq_binder 来查
}
```
+注意:要想查看统计数据需要在pom里加上 [metrics-core依赖](https://mvnrepository.com/artifact/io.dropwizard.metrics/metrics-core) 。如若不加,endpoint将会显示warning信息而不会显示统计信息:
+
+```json
+{
+ "warning": "please add metrics-core dependency, we use it for metrics"
+}
+```
+
## More
RocketMQ 是一款功能强大的分布式消息系统,广泛应用于多个领域,包括异步通信解耦、企业解决方案、金融支付、电信、电子商务、快递物流、广告营销、社交、即时通信、移动应用、手游、视频、物联网、车联网等。
diff --git a/spring-cloud-alibaba-examples/rocketmq-example/src/main/resources/application.properties b/spring-cloud-alibaba-examples/rocketmq-example/src/main/resources/application.properties
index 80ea2d99..0ba6a54e 100644
--- a/spring-cloud-alibaba-examples/rocketmq-example/src/main/resources/application.properties
+++ b/spring-cloud-alibaba-examples/rocketmq-example/src/main/resources/application.properties
@@ -27,5 +27,4 @@ spring.cloud.stream.bindings.input3.consumer.concurrency=20
spring.cloud.stream.bindings.input3.consumer.maxAttempts=1
server.port=28081
-
-management.endpoints.web.exposure.include=*
\ No newline at end of file
+management.security.enabled=false
\ No newline at end of file
diff --git a/spring-cloud-stream-binder-rocketmq/pom.xml b/spring-cloud-stream-binder-rocketmq/pom.xml
index 4b534d4b..7bf086c4 100644
--- a/spring-cloud-stream-binder-rocketmq/pom.xml
+++ b/spring-cloud-stream-binder-rocketmq/pom.xml
@@ -21,13 +21,15 @@
- io.dropwizard.metrics
- metrics-core
+ org.apache.rocketmq
+ rocketmq-client
- org.apache.rocketmq
- rocketmq-client
+ io.dropwizard.metrics
+ metrics-core
+ provided
+ true
diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java b/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java
index cb35b5a6..9c8b5221 100644
--- a/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java
+++ b/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQBinderConstants.java
@@ -21,6 +21,8 @@ package org.springframework.cloud.stream.binder.rocketmq;
*/
public interface RocketMQBinderConstants {
+ String ENDPOINT_ID = "rocketmq_binder";
+
/**
* Header key
*/
@@ -33,10 +35,27 @@ public interface RocketMQBinderConstants {
String ACKNOWLEDGEMENT_KEY = "ACKNOWLEDGEMENT";
/**
- * Instrumentation key
+ * Instrumentation
*/
String LASTSEND_TIMESTAMP = "lastSend.timestamp";
- String ENDPOINT_ID = "rocketmq_binder";
+ interface Metrics {
+ interface Producer {
+ String PREFIX = "scs-rocketmq.producer.";
+ String TOTAL_SENT = "totalSent";
+ String TOTAL_SENT_FAILURES = "totalSentFailures";
+ String SENT_PER_SECOND = "sentPerSecond";
+ String SENT_FAILURES_PER_SECOND = "sentFailuresPerSecond";
+ }
+
+ interface Consumer {
+ String GROUP_PREFIX = "scs-rocketmq.consumerGroup.";
+ String PREFIX = "scs-rocketmq.consumer.";
+ String TOTAL_CONSUMED = "totalConsumed";
+ String CONSUMED_PER_SECOND = "consumedPerSecond";
+ String TOTAL_CONSUMED_FAILURES = "totalConsumedFailures";
+ String CONSUMED_FAILURES_PER_SECOND = "consumedFailuresPerSecond";
+ }
+ }
}
diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java b/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java
index 4bed86af..03009b43 100644
--- a/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java
+++ b/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/RocketMQMessageChannelBinder.java
@@ -42,76 +42,82 @@ import org.springframework.messaging.MessageHandler;
* @author Jim
*/
public class RocketMQMessageChannelBinder extends
- AbstractMessageChannelBinder,
- ExtendedProducerProperties, RocketMQTopicProvisioner>
- implements ExtendedPropertiesBinder {
+ AbstractMessageChannelBinder, ExtendedProducerProperties, RocketMQTopicProvisioner>
+ implements
+ ExtendedPropertiesBinder {
- private static final Logger logger = LoggerFactory.getLogger(RocketMQMessageChannelBinder.class);
+ private static final Logger logger = LoggerFactory
+ .getLogger(RocketMQMessageChannelBinder.class);
- private final RocketMQExtendedBindingProperties extendedBindingProperties;
- private final RocketMQTopicProvisioner rocketTopicProvisioner;
- private final RocketMQBinderConfigurationProperties rocketBinderConfigurationProperties;
- private final InstrumentationManager instrumentationManager;
- private final ConsumersManager consumersManager;
+ private final RocketMQExtendedBindingProperties extendedBindingProperties;
+ private final RocketMQBinderConfigurationProperties rocketBinderConfigurationProperties;
+ private final InstrumentationManager instrumentationManager;
+ private final ConsumersManager consumersManager;
- public RocketMQMessageChannelBinder(ConsumersManager consumersManager,
- RocketMQExtendedBindingProperties extendedBindingProperties,
- RocketMQTopicProvisioner provisioningProvider,
- RocketMQBinderConfigurationProperties rocketBinderConfigurationProperties,
- InstrumentationManager instrumentationManager) {
- super(true, null, provisioningProvider);
- this.consumersManager = consumersManager;
- this.extendedBindingProperties = extendedBindingProperties;
- this.rocketTopicProvisioner = provisioningProvider;
- this.rocketBinderConfigurationProperties = rocketBinderConfigurationProperties;
- this.instrumentationManager = instrumentationManager;
- }
+ public RocketMQMessageChannelBinder(ConsumersManager consumersManager,
+ RocketMQExtendedBindingProperties extendedBindingProperties,
+ RocketMQTopicProvisioner provisioningProvider,
+ RocketMQBinderConfigurationProperties rocketBinderConfigurationProperties,
+ InstrumentationManager instrumentationManager) {
+ super(true, null, provisioningProvider);
+ this.consumersManager = consumersManager;
+ this.extendedBindingProperties = extendedBindingProperties;
+ this.rocketBinderConfigurationProperties = rocketBinderConfigurationProperties;
+ this.instrumentationManager = instrumentationManager;
+ }
- @Override
- protected MessageHandler createProducerMessageHandler(ProducerDestination destination,
- ExtendedProducerProperties
- producerProperties,
- MessageChannel errorChannel) throws Exception {
- if (producerProperties.getExtension().getEnabled()) {
- return new RocketMQMessageHandler(destination.getName(), producerProperties.getExtension(),
- rocketBinderConfigurationProperties, instrumentationManager);
- } else {
- throw new RuntimeException(
- "Binding for channel " + destination.getName() + "has been disabled, message can't be delivered");
- }
- }
+ @Override
+ protected MessageHandler createProducerMessageHandler(ProducerDestination destination,
+ ExtendedProducerProperties producerProperties,
+ MessageChannel errorChannel) throws Exception {
+ if (producerProperties.getExtension().getEnabled()) {
+ return new RocketMQMessageHandler(destination.getName(),
+ producerProperties.getExtension(),
+ rocketBinderConfigurationProperties, instrumentationManager);
+ }
+ else {
+ throw new RuntimeException("Binding for channel " + destination.getName()
+ + " has been disabled, message can't be delivered");
+ }
+ }
- @Override
- protected MessageProducer createConsumerEndpoint(ConsumerDestination destination, String group,
- ExtendedConsumerProperties
- consumerProperties)
- throws Exception {
- if (group == null || "".equals(group)) {
- throw new RuntimeException("'group' must be configured for channel + " + destination.getName());
- }
+ @Override
+ protected MessageProducer createConsumerEndpoint(ConsumerDestination destination,
+ String group,
+ ExtendedConsumerProperties consumerProperties)
+ throws Exception {
+ if (group == null || "".equals(group)) {
+ throw new RuntimeException(
+ "'group' must be configured for channel + " + destination.getName());
+ }
- RocketMQInboundChannelAdapter rocketInboundChannelAdapter = new RocketMQInboundChannelAdapter(consumersManager,
- consumerProperties, destination.getName(), group, instrumentationManager);
+ RocketMQInboundChannelAdapter rocketInboundChannelAdapter = new RocketMQInboundChannelAdapter(
+ consumersManager, consumerProperties, destination.getName(), group,
+ instrumentationManager);
- ErrorInfrastructure errorInfrastructure = registerErrorInfrastructure(destination, group,
- consumerProperties);
- if (consumerProperties.getMaxAttempts() > 1) {
- rocketInboundChannelAdapter.setRetryTemplate(buildRetryTemplate(consumerProperties));
- rocketInboundChannelAdapter.setRecoveryCallback(errorInfrastructure.getRecoverer());
- } else {
- rocketInboundChannelAdapter.setErrorChannel(errorInfrastructure.getErrorChannel());
- }
+ ErrorInfrastructure errorInfrastructure = registerErrorInfrastructure(destination,
+ group, consumerProperties);
+ if (consumerProperties.getMaxAttempts() > 1) {
+ rocketInboundChannelAdapter
+ .setRetryTemplate(buildRetryTemplate(consumerProperties));
+ rocketInboundChannelAdapter
+ .setRecoveryCallback(errorInfrastructure.getRecoverer());
+ }
+ else {
+ rocketInboundChannelAdapter
+ .setErrorChannel(errorInfrastructure.getErrorChannel());
+ }
- return rocketInboundChannelAdapter;
- }
+ return rocketInboundChannelAdapter;
+ }
- @Override
- public RocketMQConsumerProperties getExtendedConsumerProperties(String channelName) {
- return extendedBindingProperties.getExtendedConsumerProperties(channelName);
- }
+ @Override
+ public RocketMQConsumerProperties getExtendedConsumerProperties(String channelName) {
+ return extendedBindingProperties.getExtendedConsumerProperties(channelName);
+ }
- @Override
- public RocketMQProducerProperties getExtendedProducerProperties(String channelName) {
- return extendedBindingProperties.getExtendedProducerProperties(channelName);
- }
+ @Override
+ public RocketMQProducerProperties getExtendedProducerProperties(String channelName) {
+ return extendedBindingProperties.getExtendedProducerProperties(channelName);
+ }
}
diff --git a/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/actuator/RocketMQBinderEndpoint.java b/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/actuator/RocketMQBinderEndpoint.java
index 756924be..baf8e700 100644
--- a/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/actuator/RocketMQBinderEndpoint.java
+++ b/spring-cloud-stream-binder-rocketmq/src/main/java/org/springframework/cloud/stream/binder/rocketmq/actuator/RocketMQBinderEndpoint.java
@@ -20,11 +20,10 @@ import static org.springframework.cloud.stream.binder.rocketmq.RocketMQBinderCon
import java.util.HashMap;
import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.AbstractEndpoint;
-
-import com.codahale.metrics.MetricRegistry;
+import org.springframework.cloud.stream.binder.rocketmq.metrics.InstrumentationManager;
/**
* @author Timur Valiev
@@ -32,8 +31,8 @@ import com.codahale.metrics.MetricRegistry;
*/
public class RocketMQBinderEndpoint extends AbstractEndpoint