動作中のメッセージを送信する
注:ネーマーとブローカーを開始することを忘れないでください
-
SpringBootプロジェクトをすばやく作成する https://start.spring.io/
-
関連する依存関係を追加します。ここのバージョンはサーバーのバージョンと一致している必要があることに注意してください。そうしないと、起動後にトピックが自動的に作成されません。覚えてね!
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.3.0</version> </dependency>
-
メッセージオブジェクト
- トピック:トピック名
- tag:タグ、フィルタリングに使用
- キー:メッセージの一意の識別子。ビジネスフィールドの組み合わせにすることができます
- 本文:メッセージ本文、バイト配列
-
ブローカーにメッセージを送信するときは、ブローカーを開始するトピックがあるかどうかを判別する必要があることに注意してください。
ローカル環境ではトピックの自動作成をオンにし、本番環境ではトピックの自動作成をオフにすることをお勧めします。
最初にトピックを手動で作成することをお勧めします。プログラムによって自動的に作成され、その後メッセージが配信されると、遅延が発生します
-
概念モデル:トピックは複数のキューに対応しており、注文トピックなどのトピックを作成するときに指定できます。
-
ビジュアル管理のバックグラウンドでメッセージを表示する
ここで、メッセージプロバイダーを記述します。
@Component
public class PayProducer {
private String producerGroup = "pay_group";
private String nameServerAddr = "39.96.192.171:9876"; //多节点逗号分隔
private DefaultMQProducer producer;
public PayProducer(){
producer = new DefaultMQProducer(producerGroup);
producer.setNamesrvAddr(nameServerAddr);
start();
}
public DefaultMQProducer getProducer(){
return this.producer;
}
/**
* 对象在用之前必须要调用一次,只能初始化一次
*/
public void start(){
try {
this.producer.start();
} catch (MQClientException e) {
e.printStackTrace();
}
}
/**
* 一般在应用上下文,使用上下文监听器,进行关闭
*/
public void shutdown(){
this.producer.shutdown();
}
}
@RestController
public class PayController {
@Autowired
private PayProducer payProducer;
private static final String topic = "pay_topic";
@RequestMapping("/api/v1/pay_cb")
public Object callback(String text) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
Message message = new Message(topic, "taga", ("hello rocketmq!" + text).getBytes());
SendResult sendResult = payProducer.getProducer().send(message);
System.out.println(sendResult);
return null;
}
}
サービスを開始してパスにアクセスします。次の500エラーが報告されます。コンソールを確認してください:
理由:ブローカーがトピックの自動作成を禁止し、ユーザーが手動でトピックを作成しないか、ブローカーとネームサーバーネットワークが通信できません。
沿って
sh bin / mqbroker -m構成autoCreateTopicEnable = trueを表示すると、トピックが自動的に作成されます
Centos7はファイアウォールを閉じますsystemctl stop firewalld
その後、再度訪問すると、タイムアウトエラーが報告されます。
理由:Alibaba Cloudには複数のネットワークカードがあります。Rocketmqは現在のネットワークカードに基づいてIPを選択します。マシンに複数のネットワークカードがある場合、問題が発生する可能性があります。たとえば、私が遭遇した問題は、マシンに2つのIPがあり、1つはパブリックIPで、もう1つはプライベートIPであるため、broker.confを構成して現在のパブリックIPを指定し、ブローカーを再起動する必要があります。新しい構成:conf / broker .conf(プロパティ名brokerIP1 =ブローカーが配置されているパブリックネットワークIPアドレス)次の構成を追加します:brokerIP1 = 120.76.62.13開始コマンド:nohup sh bin / mqbroker -n localhost:9876 -c ./conf/broker.conf&
コンソールはデータを表示できず、接続10909エラーの理由が表示されます:RocketはデフォルトでVIPチャネルを有効にし、VIPチャネルポートは10911-2 = 10909です
解決策:Alibaba Cloud Security Groupはポート10909を追加する必要があります
もう一度お越しください!アイデアコンソールからメッセージが送信されました。
rocketmqコンソールを確認します
送信したメッセージをご覧いただけます!次に、メッセージを消費するコンシューマーを作成します。