必要
RocketMQ
プロデューサーを構築します。- プロデューサはサービスの開始時に構築され、サービスのシャットダウン時に破棄されます。
コードテンプレート
抽象クラス
@Slf4j
public abstract class AbstractMqProducer {
/**
* 原生默认mq生产者
*/
protected DefaultMQProducer producer;
/**
* 启动时,构造
*
* @throws MQClientException
*/
@PostConstruct
public abstract void start() throws MQClientException;
/**
* 关闭时,销毁
*/
@PreDestroy
public void shutdown() {
log.info("AbstractMqProducer shutdown...");
producer.shutdown();
}
}
プロデューサー実装クラス
@Component
@Configuration
@Slf4j
@RequiredArgsConstructor
public class DemoRocketMqProducer extends AbstractMqProducer {
/**
* 参数配置
*/
@Value("${rocketmq.producer.group}")
private String producerGroup;
@Value("${rocketmq.name-server}")
private String nameServer;
@Value("${rocketmq.producer.send-message-timeout}")
private String sendMessageTimeout;
@Value("${rocketmq.producer.compress-message-body-threshold}")
private String compressMessageBodyThreshold;
@Value("${rocketmq.producer.max-message-size}")
private String maxMessageSize;
@Value("${rocketmq.producer.retry-times-when-send-failed}")
private String retryTimesWhenSendFailed;
@Value("${rocketmq.producer.retry-times-when-send-async-failed}")
private String retryTimesWhenSendAsyncFailed;
@Value("${rocketmq.producer.retry-next-server}")
private String retryNextServer;
/**
* 启动producer
*
* @throws MQClientException
*/
@Override
public void start() throws MQClientException {
//判空
if (ObjectUtil.isNull(producer)) {
log.info("init DemoRocketMqProducer begin... ...");
//构建producer
producer = new DefaultMQProducer(producerGroup);
//name server地址
producer.setNamesrvAddr(nameServer);
//客户端实例名称
producer.setInstanceName(UtilAll.getPid() + "#" + System.nanoTime());
//发送消息超时时间,单位毫秒,默认3000
producer.setSendMsgTimeout(sendMessageTimeout);
//body超过多大开始压缩,单位字节,默认4096B
producer.setCompressMsgBodyOverHowmuch(compressMessageBodyThreshold);
//客户端限制的消息大小,单位字节,默认4194304
producer.setMaxMessageSize(maxMessageSize);
//如果消息发送失败,最大重试次数,默认2
producer.setRetryTimesWhenSendFailed(retryTimesWhenSendFailed);
//如果消息异步发送失败,最大重试次数,默认2
producer.setRetryTimesWhenSendAsyncFailed(retryTimesWhenSendAsyncFailed);
//如果发送消息返回sendResult,但sendStatus != SEND_OK,是否重试其他broker发送,默认false
producer.setRetryAnotherBrokerWhenNotStoreOK(retryNextServer);
}
//启动producer
producer.start();
log.info("DemoRocketMqProducer is starting...");
}
/**
* 发送消息
*
* @param topic
* @param tag
* @param key
* @param dto
* @param <T>
* @return
*/
public <T> boolean send(String topic, String tag, String key, T dto, String hashKey) {
try {
//转换dto为String类型
String body = JSON.toJSONString(dto);
//构建message
Message message = new Message(topic, tag, key, body.getBytes("utf-8"));
//发送消息
SendResult sendResult = producer.send(message, new SelectMessageQueueByHash(), hashKey);
log.info("DemoRocketMqProducer 消息生产结果:{}", sendResult);
return true;
} catch (Exception e) {
//错误日志
log.error("DemoRocketMqProducer 消息生产失败,错误信息:{}", e);
//异常处理
throw new RuntimeException(e.getMessage());
}
}
/**
* 关闭producer
*/
@Override
@PreDestroy
public void shutdown() {
//关闭producer
producer.shutdown();
log.warn("DemoRocketMqProducer shutdown...");
}
}
ノート
@PostConstruct
導入
@PostConstruct
アノテーションは、非静的void()
メソッドを修飾するために使用されます。- アノテーションが付けられた
@PostConstruct
メソッドは、Servlet
サービスのロード時に実行され、一度だけ実行されます。 @PostConstruct
アノテーションはinit()
メソッドの前とコンストラクターの後に実行されます。- コンテキストの起動シーケンス:
服务加载Servlet->Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注解修饰的方法)->init()方法
使用するシーン
オブジェクトの生成時にいくつかの初期化操作を完了したい場合、これらの初期化は現時点では依存関係の注入に依存する必要がありますが、コンストラクターで実装することはできません。@PostConstruct
この時点で、アノテーションを使用してメソッドを変更して初期化を完了することができ@PostConstruct
、依存関係の注入が完了すると、アノテーションによって変更されたメソッドが自動的に呼び出されます。
ソースコード
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}
@preDestroy
導入
@PreDestroy
アノテーションは、非静的void()
メソッドを修飾するために使用されます。- アノテーションが付けられた
@PreDestroy
メソッドは、Servlet
サービスがアンインストールされるときに実行され、一度だけ実行されます。 @PreDestroy
アノテーションは、Servlet
アンロードの前とdestroy()
メソッドの後に実行されます。- コンテキスト停止順序:
destroy()方法 -> @PreDestroy(注解修饰的方法)-> bean销毁->服务卸载Servlet
ソースコード
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PreDestroy {
}
設定ファイルの詳細
# rocketmq消息队列
rocketmq:
# 指定 nameServer
name-server: 127.0.0.1:9876;127.0.0.1:9877
# Producer 生产者
producer:
# 生产组
group: my-group
# 发送消息超时时间,单位毫秒,默认3000
send-message-timeout: 3000
# body超过多大开始压缩,单位字节,默认4096B
compress-message-body-threshold: 4096
# 客户端限制的消息大小,单位字节,默认4194304
max-message-size: 4194304
# 如果消息发送失败,最大重试次数,默认2
retry-times-when-send-failed: 2
# 如果消息异步发送失败,最大重试次数,默认2
retry-times-when-send-async-failed: 2
# 如果发送消息返回sendResult,但sendStatus != SEND_OK,是否重试其他broker发送,默认false
retry-next-server: false