DotNetCore CAP

环境:

net core 5

DotNetCore.CAP 6.0.1

RabbitMQ 3.8.5

Github 

Cap官方文档 

配置Cap

startup.cs:

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();//配置WebAPI服务

            services.AddTransient<ICapSubscribeService, CapSubscribeService>();
services.AddCap((option) =>
            {
                option.UseInMemoryStorage(); // 使用内存存储消息(消息发送失败处理)

                // 使用EntityFramework进行存储操作
                //option.UseEntityFramework<DatabaseContext>();
                // 使用sqlserver进行事务处理,防止推送MQ失败,会在指定数据库中自动生成以"cap."开头的表
                //option.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));


                //CAP支持 RabbitMQ、Kafka、AzureServiceBus 等作为MQ,进行事件中心处理,根据使用选择配置:
                //option.UseRabbitMQ("MQConnectionStrings");
                //option.UseInMemoryStorage();//使用内存持久化消息
                option.UseRabbitMQ(rb =>
                {
                    rb.HostName = "localhost";
                    rb.UserName = "guest";
                    rb.Password = "guest";
                    rb.Port = 5672;
                    rb.VirtualHost = "/";
                });

                //option.UseKafka("MQConnectionStrings");


                // 添加cap后台监控页面(人工处理);页面地址为“/cap”;如:http://localhost:5000/cap
                option.UseDashboard();


                //配置定时器重试策略
                option.FailedRetryInterval = 60; //重试间隔时间(秒),默认60s,使用默认的就可以,可不用配置
                option.FailedRetryCount = 5; //重试次数,默认值:50

                //设置处理成功的数据在数据库中保存的时间(秒),为保证系统新能,数据会定期清理。
                option.SucceedMessageExpiredAfter = 24 * 3600;

                //option.DefaultGroupName = "default-group-name";//指定默认消费者组名称

                //失败时的回调通知函数
                option.FailedThresholdCallback = (failedInfo) =>
                {
                    Console.WriteLine($"失败回调:messageType:{failedInfo.MessageType};message:{failedInfo.Message}");
                };

            })
            ;

}

控制器 CapPublishController:

发布:

[Route("api/[controller]")]
    [ApiController]
    public class CapPublishController : ControllerBase
    {
        public readonly ICapPublisher _capPub;
        public CapPublishController(ICapPublisher capPub)
        {
            _capPub = capPub;
        }


        [HttpPost]
        public ActionResult AddUser()
        {
            User user = new User
            {
                Age = 26,
                FirstName = "陈",
                LastName = "兆杰",
            };

            //简单发布:
            {
                _capPub.Publish("test.mq.adduser2", user);
                _capPub.Publish("test.mq.header", user);
                var header = new Dictionary<string, string>()
                {
                    ["my.header.first"] = "first",
                    ["my.header.second"] = "second"
                };
                _capPub.Publish("test.show.time", DateTime.Now, header);
            }
            //发布:订阅 + 回调
            {
                //发布+回调 ,test.mq.adduser1 订阅者消费成功后,会将消费函数的返回值作为,回调函数的入参
                _capPub.Publish("test.mq.adduser1", user, "CallBack1");
                _capPub.Publish("test.mq.adduser", user, "CallBack");
            }

            return base.Ok("添加成功");
        }

        [HttpPost]
        [Route("~/ef/AddUser")]
        public IActionResult AddUser(User user)
        {
            DatabaseContext dbContext = null;
            using (var trans = dbContext.Database.BeginTransaction(_capPub, autoCommit: true))
            {
                //业务代码

                _capPub.Publish("test.mq.adduser", DateTime.Now);//调用订阅 test.mq.adduser 的实现
            }
            return Ok();
        }

        [NonAction]
        [CapSubscribe("test.mq.header", Group = "group.test2")]
        public void Subscriber(User user, [FromCap] CapHeader header)
        {
            var id = header[Headers.MessageId];

            Console.WriteLine($@"{DateTime.Now} Subscriber invoked, Info: {user}");
        }


}

 订阅:

public interface ICapSubscribeService
    {
        /// <summary>
        /// 无需返回值,void或Task即可
        /// </summary>
        /// <param name="user"></param>
        User Show(User user);

        string Show1(User user);

        void Show2(User user);

        void CallBack1(string message);

        void CallBack(User user);
    }


/// <summary>
    /// 如果你的订阅方法没有位于 Controller 中,则你订阅的类需要继承 ICapSubscribe 
    /// 
    /// 分组Group:
    /// CAP启动的时候,她将创建一个默认的消费者组,如果多个相同消费者组的消费者消费同一个Topic消息的时候,只会有一个消费者被执行。相反,如果消费者都位于不同的消费者组,则所有的消费者都会被执行
    /// </summary>
    public class CapSubscribeService : ICapSubscribeService, ICapSubscribe
    {

        //[CapSubscribe("test.mq.*")] // 一对多匹配
        [CapSubscribe("test.mq.adduser")] // 一对一匹配
        public User Show(User user)
        {
            Console.WriteLine($"姓名:{user.FirstName + user.LastName} 年龄:{user.Age}");
            return user;
        }

        [CapSubscribe("test.mq.adduser1", Group = "group1")]
        public string Show1(User user)
        {
            string message = $"姓名:{user.FirstName + user.LastName} 年龄:{user.Age}";
            Console.WriteLine(message);
            return message;
        }

        [CapSubscribe("test.mq.adduser2", Group = "group2")]
        public void Show2(User user)
        {
            string message = $"姓名:{user.FirstName + user.LastName} 年龄:{user.Age}";
            Console.WriteLine(message);
            throw new NotImplementedException();
        }

        /// <summary>
        /// 回调:
        /// 可以用来判断订阅者是否处理成功,来处理发布的业务的回滚等等。。。
        /// message入参为发布函数的返回值,如:Show1 的返回值 
        /// 服务端处理来自客户端的订阅,即订阅回调topic: CallBack
        /// </summary>
        /// <param name="message"></param>
        [CapSubscribe("CallBack1", Group = "CallbackServer")]
        public void CallBack1(string message)
        {
            Console.WriteLine($"接收到回调:{message}");
        }

        [CapSubscribe("CallBack", Group = "CallbackServer")]
        public void CallBack(User user)
        {
            Console.WriteLine($"接收到回调:{user}");
        }
    }

Cap.DashBoard:

http://ip:port/cap  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值