Springboot2.X 集成 RocketMQ

RocketMq报错:the message is illegal, maybe msg body or properties length not matched RocketMq:org.apache.rocketmq.client.exception.MQBrokerException: CODE: 13 DESC: the message is illegal, maybe msg body or properties length not matched. msg body length limit 128k, msg properties length limit 32k. 阅读详情

废话少说,上才艺

1.首先导入maven依赖(请自行选择对应的版本)

<!--注意: 这里的版本,要和部署在服务器上的版本号一致--> 
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>4.7.1</version>
</dependency>

2.RocketMQ基本使用流程

消息发送

  • 创建生产者producer,并指定生产者组名
  • 指定NameServer(rockerMq 链接地址)
  • 启动producer
  • 创建消息对象,指定主题topic,tag和消息体
  • 发送消息
  • 关闭producer

消息消费

  • 创建消费者consumer,指定消费组名
  • 指定NameServer
  • 订阅主题topic和tag
  • 注册消息监听器,设置回调函数,处理消息
  • 启动消费者consumer

3.1 基础消息发送

package com.zqh.com.rocketmq.baseMsg;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.SendStatus;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * SEND_OK:消息发送成功
 * FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失
 * FLUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步到 Slave 时超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失
 * SLAVE_NOT_AVAILABLE:消息发送成功,但是此时 Slave 不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失
 */
public class BaseMsgProducer {

    final static String NAMESRV_ADDR = "192.168.0.30:9876";
    final static String PRODUCER_GROUP = "base_group";
    final static String TOPIC = "base_topic";
    final static String TAGS = "base_tags";

    public static void main(String[] args) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        sendSyncMsg();
//        sendASyncMsg();
//        sendOnewayMsg();
    }

    /**
     * 发送同步消息需要接到消息结果之后再发送下一个消息,这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。
     */
    public static void sendSyncMsg() throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        // 创建生产者producer,并指定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP + "_syncMsg");
        //指定NameServer(生产者需要把提供的消息注册到nameServer,方便消费端查找和订阅)
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();
        for (int i = 0; i < 1000; i++) {
            //创建消息对象,指定主题topic,tag和消息体
            Message message = new Message(TOPIC, TAGS, System.currentTimeMillis() + "" + i, ("hello rocketMq" + i).getBytes());
            //发送消息
            SendResult result = producer.send(message);
            //发送状态
            SendStatus sendStatus = result.getSendStatus();
            //消息ID
            String msgId = result.getMsgId();
            //消息队列ID
            int queueId = result.getMessageQueue().getQueueId();
            System.out.println("发送结果:" + result);
        }
        //6.- 关闭producer
        producer.shutdown();
    }


    /**
     * 异步消息不必等待返回结果,立即发送下一个消息,可以通过send(Message msg, SendCallback sendCallback)中的回调函数,对返回结果进行处理。异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。
     */
    public static void sendASyncMsg() throws InterruptedException, RemotingException, MQClientException {
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP + "_async");
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();
        final CountDownLatch countDownLatch = new CountDownLatch(10);
        for (int i = 0; i < 10; i++) {
            Message message = new Message(TOPIC, TAGS + "_async", System.currentTimeMillis() + "" + i, ("hello rocketMq" + i).getBytes());
            producer.send(message, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    countDownLatch.countDown();
                    System.out.println("发送结果:" + sendResult);
                }

                @Override
                public void onException(Throwable throwable) {
                    countDownLatch.countDown();
                    System.out.println("异常结果:" + throwable.getMessage());
                }
            });
        }

        countDownLatch.await(5, TimeUnit.SECONDS);
        // 避免提前关闭了,所以等发送完再关闭
        producer.shutdown();
    }

    /**
     * 单向消息通俗来说,就是发送消息不必等待返回结果,也无需执行回调函数。这种方式主要用在不特别关心发送结果的场景,例如日志发送。
     */
    public static void sendOnewayMsg() throws InterruptedException, RemotingException, MQClientException {
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP + "_oneway");
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();
        for (int i = 0; i < 10; i++) {
            Message message = new Message(TOPIC, TAGS + "_oneway", System.currentTimeMillis() + "" + i, ("hello rocketMq" + i).getBytes());
            producer.sendOneway(message);
            System.out.println("发送完成");
        }
        producer.shutdown();
    }
}

3.2 消费者

package com.zqh.com.rocketmq.baseMsg;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel;
import org.springframework.stereotype.Component;

@Component
public class BaseMsgConsumer {
    private DefaultMQPushConsumer consumer;
    private static final String CONSUMER_GROUP = "base_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "base_topic";
    private final static String TAGS = "base_tags_async || base_tags_oneway || base_tags";

    public BaseMsgConsumer() throws MQClientException {
        System.out.println("初始化成功");
        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr(NAMESRV_ADDR);
        consumer.subscribe(TOPIC, TAGS);
        // 分散消费 MessageModel.CLUSTERING 同一个 Consumer ID 所标识的所有 Consumer 分散消费消息。
        // 广播消费 MessageModel.BROADCASTING 同一个 Consumer ID 所标识的所有 Consumer 都会各自消费某条消息一次。
        consumer.setMessageModel(MessageModel.BROADCASTING);
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 并发消费模式 (MessageListenerConcurrently)
        consumer.registerMessageListener((MessageListenerConcurrently) (list, consumeConcurrentlyContext) -> {
            System.out.println(Thread.currentThread().getName()
                    + " Receive New Messages: " + list.size());
            list.forEach(msg -> {
                // 业务实现
                System.out.println(Thread.currentThread().getName() + "\t" + "组1消费" + msg.getKeys() + new String(msg.getBody()));
            });
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        consumer.start();
    }
}

4.1 批量信息

package com.zqh.com.rocketmq.batchMsg;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;

/**
 * 批量信息
 * 前面发送的消息都是一条一条发送,批量消息则是一次发送多条消息,这一批消息总大小(无论是单条消息还是消息总大小)不应该超过4MB(默认大小)
 * 批量消息一般有两种使用情况:
 * 达到一定消息数量之后发送
 * 一定时间发送(比如1分钟发送一次)
 */
public class BatchMsgProducer {

    private final static Logger logger = LoggerFactory.getLogger(BatchMsgProducer.class);
    private static final String PRODUCER_GROUP = "batch_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "batch_topic";
    private final static String TAGS = "batch_tags";

    public static void sendBatchMsg() throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();
        for (int i = 0; i < 10; i++) {
            // 创建消息集合
            List<Message> messageList = new ArrayList<>();
            // CODE: 13  DESC: the message body size over max value, MAX: 4194304
            byte[] bytes = new byte[1024 * 1024 * 3];
            messageList.add(new Message(TOPIC, TAGS, "bytes".getBytes()));
            messageList.add(new Message(TOPIC, TAGS, "bytes".getBytes()));
            messageList.add(new Message(TOPIC, TAGS, "bytes".getBytes()));
            SendResult sendResult = producer.send(messageList);
            System.out.println("发送结果:" + sendResult);
        }
        producer.shutdown();
    }

    public static void main(String[] args) throws Exception {
        sendBatchMsg();
    }
}

4.2 消费者

package com.zqh.com.rocketmq.batchMsg;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class BatchMsgConsumer {
    private final static Logger logger = LoggerFactory.getLogger(BatchMsgConsumer.class);
    private DefaultMQPushConsumer consumer;
    private static final String CONSUMER_GROUP = "batch_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "batch_topic";
    private final static String TAGS = "batch_tags";

    public BatchMsgConsumer() throws MQClientException {
        System.out.println("初始化成功");
        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr(NAMESRV_ADDR);
        consumer.subscribe(TOPIC, TAGS);
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 并发消费模式 (MessageListenerConcurrently)
        consumer.registerMessageListener((MessageListenerConcurrently) (list, consumeConcurrentlyContext) -> {
            System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + list.size());
            list.forEach(msg -> {
                // 业务实现
                System.out.println(Thread.currentThread().getName() + "\t" + "组1消费" + msg.getKeys() + new String(msg.getBody()));
            });
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        consumer.start();
    }
}

5.1 延时消费

package com.zqh.com.rocketmq.delayMsg;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 延时信息
 * 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h
 */
public class DelayMsgProducer {

    private final static Logger logger = LoggerFactory.getLogger(DelayMsgProducer.class);
    private static final String PRODUCER_GROUP = "delay_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "delay_topic";
    private final static String TAGS = "delay_tags";


    public static void sendDelayMsg() throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();
        for (int i = 0; i < 10; i++) {
            Message message = new Message(TOPIC, TAGS, System.currentTimeMillis() + "" + i, "rocketMq".getBytes());
            // 3对应的10s
            message.setDelayTimeLevel(3);
            // 发送消息
            SendResult sendResult = producer.send(message);
            System.out.println("发送结果:" + sendResult);
        }
        producer.shutdown();
    }

    public static void main(String[] args) throws Exception {
        sendDelayMsg();
    }
}

5.2 消费端

package com.zqh.com.rocketmq.delayMsg;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class DelayMsgConsumer {
    private final static Logger logger = LoggerFactory.getLogger(DelayMsgConsumer.class);
    private DefaultMQPushConsumer consumer;
    private static final String CONSUMER_GROUP = "delay_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "delay_topic";
    private final static String TAGS = "delay_tags";

    public DelayMsgConsumer() throws MQClientException {
        System.out.println("初始化成功");
        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr(NAMESRV_ADDR);
        consumer.subscribe(TOPIC, TAGS);
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 并发消费模式 (MessageListenerConcurrently)
        consumer.registerMessageListener((MessageListenerConcurrently) (list, consumeConcurrentlyContext) -> {
            System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + list.size());
            list.forEach(msg -> {
                // 业务实现
                System.out.println(Thread.currentThread().getName() + "\t" + "组1消费" + msg.getKeys() + new String(msg.getBody()));
            });
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        consumer.start();
    }
}

6.1 过滤消息

package com.zqh.com.rocketmq.filterMsg;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.remoting.exception.RemotingException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 过滤信息
 */
public class FilterMsgProducer {

    private final static Logger logger = LoggerFactory.getLogger(FilterMsgProducer.class);
    private static final String PRODUCER_GROUP = "filter_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "filter_topic";
    private final static String TAGS = "filter_tags";

    public static void sendFilterMsg() throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();
        for (int i = 0; i < 10; i++) {
            Message message = new Message(TOPIC, TAGS, System.currentTimeMillis() + "" + i, "bytes".getBytes());
            // 绑定自定义属性
            message.putUserProperty("i", i + "");

            SendResult sendResult = producer.send(message);
            System.out.println("发送结果:" + sendResult);
        }
        producer.shutdown();
    }

    public static void main(String[] args) throws Exception {
        sendFilterMsg();
    }
}

6.2 消费端

package com.zqh.com.rocketmq.filterMsg;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.MessageSelector;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class FileterMsgConsumer {
    private final static Logger logger = LoggerFactory.getLogger(FileterMsgConsumer.class);
    private DefaultMQPushConsumer consumer;
    private static final String CONSUMER_GROUP = "filter_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "filter_topic";
    // * 的话代表全部接收
    private final static String TAGS = "filter_tags";

    public FileterMsgConsumer() throws MQClientException {
        System.out.println("初始化成功");
        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr(NAMESRV_ADDR);
//        通过tag来过滤需要的
//        consumer.subscribe(TOPIC, TAGS);
        //通过sql过滤消息,只要i>=3的消息
        consumer.subscribe(TOPIC, MessageSelector.bySql("i>=3"));

        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 并发消费模式 (MessageListenerConcurrently)
        consumer.registerMessageListener((MessageListenerConcurrently) (list, consumeConcurrentlyContext) -> {
            System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + list.size());
            list.forEach(msg -> {
                // 业务实现
                System.out.println(Thread.currentThread().getName() + "\t" + "组1消费" + msg.getKeys() + new String(msg.getBody()));
            });
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        consumer.start();
    }
}

7.1 顺序消息

package com.zqh.com.rocketmq.orderMsg;

import org.apache.rocketmq.client.exception.MQBrokerException;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.client.producer.MessageQueueSelector;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageQueue;
import org.apache.rocketmq.remoting.exception.RemotingException;

import java.util.ArrayList;
import java.util.List;

/**
 * SEND_OK:消息发送成功
 * FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失
 * FLUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步到 Slave 时超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失
 * SLAVE_NOT_AVAILABLE:消息发送成功,但是此时 Slave 不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失
 * <p>
 * 保证消息的顺序性 全局顺序消息
 * 一般通过建立单队列的方式,消息全在一个队列里,保证消息的顺序性(FIFO)
 * 局部顺序消息
 * 不需要限定单个队列,将需要按序消费的消息,放入到同一个队列中即可。
 * 比如:顺序消息A1,B2,C3,D4,都放入到队列1中,就能保证消息的顺序性。
 */
public class OrderMsgProducer {

    final static String NAMESRV_ADDR = "192.168.0.30:9876";
    final static String PRODUCER_GROUP = "order_group";
    final static String TOPIC = "order_topic";
    final static String TAGS = "order_tags";

    public static void main(String[] args) throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        sendOrderMsg();
    }

    /**
     * 发送同步消息需要接到消息结果之后再发送下一个消息,这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。
     */
    public static void sendOrderMsg() throws InterruptedException, RemotingException, MQClientException, MQBrokerException {
        // 创建生产者producer,并指定生产者组名
        DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
        // 指定NameServer(生产者需要把提供的消息注册到nameServer,方便消费端查找和订阅)
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.start();

        List<OrderMsg> orderMsgList = OrderMsg.orderMsgList();

        int i = 0;
        for (OrderMsg orderMsg : orderMsgList) {
            Message message = new Message(TOPIC, TAGS, System.currentTimeMillis() + "" + i, ("hello rocketMq" + i++).getBytes());

            // 发送消息
            // 参数一:消息对象
            // 参数二:消息队列的选择器
            // 参数三:选择队列的业务标识(此处为订单ID)
            // 其实就是:使用业务标识,进行一定的规则,选出该标识对应存储的队列
            SendResult sendResult = producer.send(message, new MessageQueueSelector() {
                /**
                 * @param list    消息队列
                 * @param message 消息对象(即上面传递过来的message)
                 * @param o       业务标识的参数(即传递过来的orderId)
                 * @return: org.apache.rocketmq.common.message.MessageQueue
                 */
                @Override
                public MessageQueue select(List<MessageQueue> list, Message message, Object o) {
                    int index = Math.abs(o.hashCode()) % (list.size());
                    return list.get(index);
                }
            }, orderMsg.getId());
            // 上面的orderMsg.getId()这个orderid就是用来确认使用的队列,一般是业务订单id,如果是0的话,就是全局顺序
            System.out.println("发送结果:" + sendResult);
        }
        producer.shutdown();
    }
}

class OrderMsg {
    private String id;
    private String msg;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public OrderMsg(String id, String msg) {
        this.id = id;
        this.msg = msg;
    }

    public static List<OrderMsg> orderMsgList() {
        List<OrderMsg> objects = new ArrayList<>();
        for (int i = 0; i < 20; i++) {
            objects.add(new OrderMsg("12", i + ""));
        }
        return objects;
    }
}

7.2 消费端

package com.zqh.com.rocketmq.orderMsg;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
public class OrderMsgConsumer {
    private final static Logger logger = LoggerFactory.getLogger(OrderMsgConsumer.class);
    private DefaultMQPushConsumer consumer;
    private static final String CONSUMER_GROUP = "order_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "order_topic";
    private final static String TAGS = "order_tags";

    public OrderMsgConsumer() throws MQClientException {
        System.out.println("初始化成功");
        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr(NAMESRV_ADDR);
        consumer.subscribe(TOPIC, TAGS);
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);
        // 注册消息监听器
        // 顺序消息监听 - MessageListenerOrderly 使用该监听器时,只启用一个线程对一个队列进行消费
        // 即:一个队列只会被一个线程取到,第二个线程无法访问这个队列(对消费队列上锁,在消费消息之前,先去获取对应队列对应的锁,保证同一个队列不会被并发消费)
        consumer.registerMessageListener((MessageListenerOrderly) (list, consumeOrderlyContext) -> {
            System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + list.size());
            list.forEach(msg -> {
                        System.out.println(Thread.currentThread().getName() + "\t" + LocalDateTime.now() + "\t\t消费消息:" + new String(msg.getBody()));
                    }
            );
            return ConsumeOrderlyStatus.SUCCESS;
        });
        consumer.start();
    }
}

8.1 事务消息

package com.zqh.com.rocketmq.transactionMsg;

import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.client.producer.LocalTransactionState;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.client.producer.TransactionListener;
import org.apache.rocketmq.client.producer.TransactionMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageExt;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 事务信息
 */
public class TransactionMsgProducer {

    private final static Logger logger = LoggerFactory.getLogger(TransactionMsgProducer.class);
    private static final String PRODUCER_GROUP = "transaction_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "transaction_topic";
    private final static String TAGS = "transaction_tags";

    public static void sendTransactionMsg() throws MQClientException {
        TransactionMQProducer producer = new TransactionMQProducer(PRODUCER_GROUP);
        producer.setNamesrvAddr(NAMESRV_ADDR);
        producer.setTransactionListener(new TransactionListener() {
            /**
             * @Description 在该方法中执行本地事务
             * @param message   回传的消息,利用transactionId即可获取到该消息的唯一Id
             * @param o         调用send方法时传递的参数,当send时候若有额外的参数可以传递到send方法中,这里能获取到
             * @return: org.apache.rocketmq.client.producer.LocalTransactionState
             *          返回事务状态,COMMIT:提交  ROLLBACK:回滚  UNKNOW:回调
             */
            @Override
            public LocalTransactionState executeLocalTransaction(Message message, Object o) {
                //这边可以创建一个全局共享变量concurrentHashMap,用来存储transactionId以及对应的值(比如正常执行1,异常执行-1等),便于回查时进行判断,这里就不赘述了
                System.out.print("执行本地事务" + message.getTransactionId());
                int i = (int) o;
                if (i % 3 == 0) {
                    //提交消息
                    System.out.println("提交");
                    return LocalTransactionState.COMMIT_MESSAGE;
                } else if (i % 3 == 1) {
                    //回滚消息
                    System.out.println("回滚");
                    return LocalTransactionState.ROLLBACK_MESSAGE;
                }
                //消息回查
                System.out.println("回调");
                return LocalTransactionState.UNKNOW;
            }

            /**
             * @Description 事务消息状态回查
             * @param messageExt    通过获取transactionId来判断这条消息的本地事务执行状态
             * @return: org.apache.rocketmq.client.producer.LocalTransactionState
             *          返回事务状态,COMMIT:提交  ROLLBACK:回滚  UNKNOW:回调
             */
            @Override
            public LocalTransactionState checkLocalTransaction(MessageExt messageExt) {
                System.out.println("消息回查:" + messageExt.getTransactionId() + "\t" + new String(messageExt.getBody()));
                //可以根据消息体中的信息去数据库中查询该消息是否已经被执行
                //或者根据上方执行本地事务时concurrentHashMap中存储的transactionId对应的值进行判断,返回对应的操作值

                //这里演示就直接提交了
                return LocalTransactionState.COMMIT_MESSAGE;
            }
        });
        // 启动生产者
        producer.start();

        for (int i = 0; i < 10; i++) {
            Message message = new Message(TOPIC, TAGS, System.currentTimeMillis() + "" + i, ("rocketMq" + i).getBytes());
            // 发送事务消息
            // 参数一:消息对象
            // 参数二:附加参数,可用于事务监听器中执行本地事务时的获取参数
            SendResult sendResult = producer.sendMessageInTransaction(message, i);
            System.out.println("发送消息:" + sendResult);
        }
        // 由于MQ要回查生产者,所以不需要关闭生产者
//        producer.shutdown();
    }

    public static void main(String[] args) throws Exception {
        sendTransactionMsg();
    }
}

8.2 消费端

package com.zqh.com.rocketmq.transactionMsg;

import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.exception.MQClientException;
import org.apache.rocketmq.common.consumer.ConsumeFromWhere;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class TransactionMsgConsumer {
    private final static Logger logger = LoggerFactory.getLogger(TransactionMsgConsumer.class);
    private DefaultMQPushConsumer consumer;
    private static final String CONSUMER_GROUP = "transaction_group";
    private final static String NAMESRV_ADDR = "192.168.0.30:9876";
    private final static String TOPIC = "transaction_topic";
    private final static String TAGS = "transaction_tags";

    public TransactionMsgConsumer() throws MQClientException {
        System.out.println("初始化成功");
        consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
        consumer.setNamesrvAddr(NAMESRV_ADDR);
        consumer.subscribe(TOPIC, TAGS);
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 并发消费模式 (MessageListenerConcurrently)
        consumer.registerMessageListener((MessageListenerConcurrently) (list, consumeConcurrentlyContext) -> {
            System.out.println(Thread.currentThread().getName() + " Receive New Messages: " + list.size());
            list.forEach(msg -> {
                // 业务实现
                System.out.println(Thread.currentThread().getName() + "\t" + "组1消费" + msg.getKeys() + new String(msg.getBody()));
            });
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });
        consumer.start();
    }
}

题外话

1. 事务流程图

 

RocketMQ源码详解 | Producer篇 · 其二:消息组成、发送链路 概述 在上一节 RocketMQ源码详解 | Producer篇 · 其一:Start,然后 Send 一条消息 中,我们了解了 Producer 在发送消息的流程。这次我们再来具体下看消息的构成与其发送的链路 Message 在 RocketMQ 的使用中,Message 类是在发送消息时必须用到的,其中 body 即是消息的存放位置,还有的就是消息的 标识(flag) 和 属性(properties) public class Message { private String topic; p 阅读详情

相关推荐

Springboot2整合RocketMQ4.x

  Springboot2.x整合RocketMQ4.x实战,加入相关依赖,开发生产者代码          启动nameser和broker     微信支付架构图:    微信支付调用相应的API进行支付,支付完成后回调,把相应的支付信息封装成对象发给生产者。生产者把消息发送给消息队列  broker,通过NameServer获取相应的路由地址。消息订阅者从broker获取相应的消息,生...

peng_0129的博客 2368

记一次rocketMQ不能消费的问题

dubbo服务主机:service-01 rocketMQ所在主机:common-01 rocketMQ-console查到的异常信息:the consumer group[repay_info] not online org.apache.rocketmq.client.exception.MQBrokerException: CODE: 206 DESC: the consumer g...

燕少江湖 1万+

SpringBoot3整合RocketMQ踩坑实录:手把手教你解决AutoConfiguration.imports缺失问题

本文详细解析了SpringBoot3与RocketMQ整合时遇到的AutoConfiguration.imports缺失问题,提供了从诊断到解决的完整方案。通过对比SpringBoot2与SpringBoot3的自动装配机制差异,指导开发者如何手动创建配置文件并验证配置生效,同时分享版本兼容性分析和性能调优建议。

weixin_30664051的博客 45

sendthemessage报错_canal对接RocketMQ消息过大时报错:org.apache.rocketmq.client.exception.MQClientException: CODE...

environmentcanal version 1.1.3mysql version 5.7.20Issue Descriptioncanal上游监控数据库中新闻信息表,下游对接RocketMQ,消息过大时报错调整 canal.mq.canalBatchSize 参数为1 还是报错2019-03-21 11:41:34.581 [pool-8-thread-1] ERROR com.alibab...

weixin_40005454的博客 2196

Windows系统安装RocketMQ4.9.8

添加环境变量 ROCKETMQ_HOME=F:\RocketMQ\rocketmq-all-4.9.8-bin-release。消费消息,创建类MyRocketMQListener 实现RocketMQListener接口。application.yml文件中增加RocketMQ的配置项。此时在浏览器打开:localhost:8080即可。将上述rocketmq所在目录添加到环境变量中。2.报错:namesrvAddr=null。在dashboard启动命令后添加参数。注意所在分区空间剩余需要大于20%

wxy11111的博客 803

RocketMQ(06)——消息的批量发送和消费

消息的批量发送和消费 发送 生产者进行消息发送时可以一次发送多条消息,这对于体积比较小的消息而言会大大改善性能,可以想象原本发送10条消息需要传递10次,现在只需要传递一次。这可以通过调用send()时传递一个消息集合。比如下面这样。批量发送的消息必须拥有相同的Topic,且一次发送的消息的body的总体积不能超过4MB,否则会得到异常——org.apache.rocketmq.client.ex...

Elim的博客 7450

SpringBoot 2.x 简易集成 RocketMQ

文章目录1 摘要2 核心 Maven 依赖3 消息生产者-Producer3.1 application 配置文件3.2 消息主题定义3.3 生产者发送消息3.4 Controller 控制层与SpringBoot 启动类4 消费者-Consumer4.1 application 配置文件4.2 消息主题定义4.3 消费者接收消息4.4 SpringBoot 启动类5 消息推送测试6 推荐参考资料7 本次提交记录 1 摘要 RocketMQ 为阿里开源的高性能消息队列,基于Java实现,支持多种开发语言,能

Mrqiang9001 813

SpringBoot2.x系列教程(六十六)Spring Boot快速集成RocketMQ实战教程

前言 RocketMQ是目前主流的消息中间件之一,并且自身就支持分布式功能。最初由阿里巴巴团队开发,并且经历过双十一等海量消息场景的考验,后捐赠给Apache开源基金会,这也是为什么我们经常听说RocketMQ是阿里巴巴的消息中间件,项目却在Apache的顶级项目中。 网络上通过SpringBoot集成RocketMQ的教程很多,但大多数都无法做到快速、通用的进行集成。本篇文章带大家快速完成基于Spring Boot的集成使用,同时针对一些集成过程中的概念和使用方法以实例进行讲解。 RocketMQ的部署

程序新视界 1781

rocketmq 消息体包含中文_Springboot2.X 集成 RocketMQ

废话少说,上才艺springboot 版本:2.3.3.RELEASErocketmq-client版本:4.7.1docker 搭建 rockerMq 教程:https://blog.csdn.net/itjavaee/article/details/108280613码云链接:后面补上文章参考:https://blog.csdn.net/u010975270/article/details/1...

weixin_39637545的博客 121

MuMu模拟器过检测实战:从硬件伪装到API欺骗的完整避坑指南

本文详细介绍了MuMu模拟器过检测的实战技术,从硬件伪装到API欺骗的全方位解决方案。通过修改CPU/GPU信息、内存分布、系统属性和行为模拟等关键技术,帮助用户有效绕过现代应用的模拟器检测机制,提升模拟器的隐蔽性和稳定性。

xxx12的博客 1384

告别混乱!在Unity中为Best MQTT v3设计清晰的服务层:配置、连接、订阅发布模块拆分指南

本文详细介绍了如何在Unity中使用Best MQTT v3插件构建清晰的服务层架构,包括配置管理、连接服务、订阅管理和发布服务的模块化拆分。通过解耦设计、事件驱动和接口抽象,提升代码可维护性和可测试性,适用于物联网和实时通信开发场景。

weixin_30576827的博客 357

SpringBoot集成RocketMQ消费者@RocketMQMessageListener注解参数介绍(内含5.x新参数介绍-rocketmq-spring-boot-starter 2.2.3)

SpringBoot集成RocketMQ消费者@RocketMQMessageListener注解参数介绍内含5.x新参数介绍-rocketmq-spring-boot-starter 2.2.3

kerwin的博客 1万+

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具,而在Python中则使用PyQt这一工具包,它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Designer、PyUIC、PyRcc三个工具的设置。最后简单演示了PyQt5的调用方式及三个工具的使用方法。

Python966的博客 3万+

Spring boot 2.x 集成Rocketmq实现事物消息

1.引入相关Maven依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x...

a624575745856085的博客 377

RK3566开发板实战:YT8512C百兆网卡调试全记录(附DTS配置避坑指南)

本文详细记录了RK3566开发板上YT8512C百兆以太网卡的调试全过程,包括硬件信号检测、DTS配置优化及常见错误排查。特别针对DTS配置中的关键参数和避坑指南进行了深入解析,为开发者提供实用的调试技巧和经验分享。

weixin_29189381的博客 267

软考高级-系统架构设计师 论文范文参考(一)

系统架构设计师 论文参考

片言可决讼,半纸能缚龙 4338

SpringBoot2.x整合RocketMQ

SpringBoot2.x整合RockketMQ JMS介绍和使用场景及基础编程模型 1、JMS介绍和使用场景及基础编程模型 简介:讲解什么是小写队列,JMS的基础知识和使用场景 1、什么是JMS: Java消息服务(Java Message Service),Java平台中关于面向消息中间件的接口 2、JMS是一种与厂商无关的 API,用来访问消息收发系统消息,它类似于JDBC(Java Dat...

紫蝶侠的博客 4613

Android Input——输入系统介绍(一)

Input 系统对于提供流畅、灵敏和一致的用户交互体验至关重要,它需要在不同的设备、场景和应用中保证输入事件的正确性、及时性和安全性。Android 输入系统是一个复杂但高效的设计,旨在处理来自各种输入设备(如触摸屏、键盘等)的用户交互,并将这些交互转换为应用程序可以理解和响应的形式。EventHub:输入系统的最底层,直接与硬件通信,监听和读取输入设备的原始事件。:从 EventHub 获取原始输入事件,对其进行解析,转化为更高层次的事件,以便上层应用或服务能够理解。

小旭的专栏 1708

Springboot3.2.x启动报错NoClassDefFoundError: org/apache/rocketmq/common/protocol/heartbeat/MessageModel

在升级springboot和rocketmq版本之后,启动报错:NoClassDefFoundError: org/apache/rocketmq/common/protocol/heartbeat/MessageModel

一掬净土 1783

matlab 一维相位解缠

一维相位解缠算法的matlab代码实现。

点云侠的博客 372

【本地部署实战】LM Studio深度使用指南:从环境搭建到模型调优

LM Studio通过极简的操作流程和强大的生态兼容性,让本地部署大模型成为可能。随着M4芯片的发布和CUDA 12.0的优化,未来本地化AI开发将迎来新的爆发点。建议开发者关注官方Discord社区(https://discord.gg/lmstudio)获取最新模型支持信息。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 8749

【RocketMq 系列】springboot RocketMq 入门教程

Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的业务场景。

做一个有思想的技术人 2505

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

罗美琪和春波特的故事,Java这些高端技术只有你还不知道

93)][外链图片转存中…(img-qYQiZ0iA-1711189267093)]由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)[外链图片转存中…(img-dj20NvkQ-1711189267094)][外链图片转存中…(img-nRc3hkHJ-1711189267094)][外链图片转存中…(img-Keug6drt-1711189267095)]本文已被。

860

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RocketMQ从实战到源码:SpringBoot整合RocketMQ

本文介绍了SpringBoot与RocketMQ的整合实践,主要内容包括: 环境准备:详细说明了JDK、SpringBoot、RocketMQ及starter的版本兼容性要求,推荐使用稳定版本组合 依赖配置:引入rocketmq-spring-boot-starter依赖,简化整合过程 配置文件:提供了完整的RocketMQ配置示例,包含NameServer地址、生产者/消费者参数等 代码实现: 消息实体类定义 生产者实现三种消息发送方式(同步、异步、单向) 消费者通过注解自动监听消息 测试验证:构建测试类

qq_43843951的博客 582

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RocketMQ4.8(jdk11)部署+springboot2.x实战

springboot2.X整合RocketMQ4.X(jdk11) 一.简介 二.Centos7.x骨架搭建 1.安装jdk11.0.10 下载地址 导入linux进行安装配置 解压:tar -zxvf jdk-11.0.10_linux-x64_bin.tar.gz 重命名:mv xxx jdk11 vim /etc/profile 加入 export JAVA_HOME=/usr/local/software/jdk11 export PATH=$JAVA_HOME/bin:$PATH export C

frank_0807的博客 4653

Springboot2整合RocketMQ4.x实战消费消息

1、在线创建springboot工程 官网:https://start.spring.io/ 注意:不要选择SNAPSHOT 点击GENERATE,下载zip包。解压zip包,导入IDEA. 2、将项目导入IDEA 2.1配置maven仓库 打开Settings 选择你本地的maven仓库 配置好后,点击Apply,OK. 2.2配置JDK 点击Project Structure 点击Project,配置jdk 点击Modules, 点击SDKs 配置好后,点击Apply , OK. ID

婉君 1385
上一篇: docker 安装 rocketMq 就是这么简单?
下一篇: centos7 安装 jdk8 (复制粘贴系列)
97牛肉面
博客等级 码龄9年 54粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值