精华内容
下载资源
问答
  • 分布式消息中间件MQ开发教程

    千次阅读 2017-10-12 13:52:20
    服务于整个阿里巴巴集团已超过8年,经过阿里巴巴交易核心链路反复打磨与历年双十一严苛考验,是一个真正具备低延迟、高并发、高可用、高可靠,可支撑万亿级数据洪峰的分布式消息中间件。 消息队列提供 MQ-MQTT 移动...

    课程介绍

    阿里云消息队列MQ(Message Queue)是企业级互联网架构的核心产品,服务于整个阿里巴巴集团已超过8年,经过阿里巴巴交易核心链路反复打磨与历年双十一严苛考验,是一个真正具备低延迟、高并发、高可用、高可靠,可支撑万亿级数据洪峰的分布式消息中间件。

    消息队列提供 MQ-MQTT 移动物联套件,连接端(如移动设备、智能家电、汽车、机器人等)和云,实现双向通信,可支撑亿级设备连接与百万消息并发。

    消息队列秉持开放、共享的原则拥抱开源生态,无技术绑定,2016年阿里巴巴正式宣布将 MQ 内核引擎 RocketMQ 捐赠给 Apache 软件基金会;与此同时,全面融合 kafka 生态,做到无缝迁移,打造更安全、更可靠、更易运维的 kafka 企业级消息服务。

    课时列表

    开始学习http://click.aliyun.com/m/27930/
    展开全文
  • 关于分布式消息中间件MQ的详细介绍:【分布式架构】分布式消息中间件MQ开发教程 (阿里云消息队列MQ(Message Queue)是企业级互联网架构的核心产品,服务于整个阿里巴巴集团已超过8年,经过阿里巴巴交易核心链路...

    关于分布式消息中间件MQ的详细介绍:
    【分布式架构】分布式消息中间件MQ开发教程

    (阿里云消息队列MQ(Message Queue)是企业级互联网架构的核心产品,服务于整个阿里巴巴集团已超过8年,经过阿里巴巴交易核心链路反复打磨与历年双十一严苛考验,是一个真正具备低延迟、高并发、高可用、高可靠,可支撑万亿级数据洪峰的分布式消息中间件。)
    MQ传递主干,在世界屡获殊荣。 它帮您搭建企业服务总线(ESB)的基础传输层。IBM WebSphere MQ为SOA提供可靠的消息传递。它为经过验证的消息传递主干, 全方位、 多用途的数据传输, 并帮助您搭建企业服务总线的传输基础设施。
    消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。
    IBM WebSphere MQ 支持两种不同的应用程序编程接口:Java 消息服务(JMS)和消息队列接口(MQI)。在 IBM WebSphere MQ 服务器上,JMS 绑定方式被映射到 MQI。应用程序直接与其本地队列管理器通过使用 MQI 进行对话,MQI 是一组要求队列管理器提供服务的调用。MQI 的引人之处是它只提供 13 次调用。这意味着对于应用程序编程员它是一种非常易于使用的接口,因为大部分艰苦工作都将透明完成的。
    IBM WebSphere MQ 产品支持应用程序通过不同组件如处理器、子系统、操作系统以及通信协议的网络彼此进行通信。

    功能

    · 跨任何商业IT系统连接应用程序和Web服务, 提供完整的JMS(Java消息服务)支持 , 包括发布-订阅。

    · 对Web服务的整合化支持。

    · 基于Eclipse的新工具—MQ Explorer, 适用于Windows和Intel(x86), 支持整个消息传递主干的远程和安全配置。

    · WebSphere MQ V6.0.2增强了JMS和安全性, 构建在WebSphere MQ V6.0中引入的新配置工具之上, 该工具以新Eclipse插件的形式提供, 可增强您的MQ Explorer控制台。

    · 与WebSphere Application Server的消息传递服务无缝互操作。

    · 支持行业标准安全套接字层(Secure Sockets Layer, SSL)安全性, 并提供扩展安全版本来获得高级安全特性。

    · 支持推进现有FTP基础设施, 确保通过WebSphere MQ进行可靠、 安全的文件传输。

    · 支持的操作系统: AIX、 HP Unix、 i5/OS、 Linux、 Sun Solaris、 Windows、 z/OS。

    内容介绍:

    课时1:MQ 快速入门 

    课时2:MQ 介绍

    课时3:MQ 资源报表使用指南 

    课时4:MQ 消息查询 

    更多精品课程:

    阿里云云计算专业

    阿里云大数据专业

    阿里云云安全专业

    展开全文
  • tuxedo中间件培训教程

    2008-11-13 16:39:33
    bea tuxedo 广泛用银行业和保险业,是中间件产品中最为成功的产品之一。并切tuxedo中间件和许多开发语言兼容。
  • SOA中间件基础教程

    2011-06-05 17:54:37
    中间件是处于应用软件和系统软件之间的一类软件,是独立于硬件或数据库厂商(处于其产品的中间,实现其互连)的一类软件,是客户方与服务方之间的连接件,是需要进行二次开发的中间产品。
  • 服务于整个阿里巴巴集团已超过8年,经过阿里巴巴交易核心链路反复打磨与历年双十一严苛考验,是一个真正具备低延迟、高并发、高可用、高可靠,可支撑万亿级数据洪峰的分布式消息中间件。 消息队列提供 MQ-MQTT 移动...

    课程介绍

    阿里云消息队列MQ(Message Queue)是企业级互联网架构的核心产品,服务于整个阿里巴巴集团已超过8年,经过阿里巴巴交易核心链路反复打磨与历年双十一严苛考验,是一个真正具备低延迟、高并发、高可用、高可靠,可支撑万亿级数据洪峰的分布式消息中间件。

    消息队列提供 MQ-MQTT 移动物联套件,连接端(如移动设备、智能家电、汽车、机器人等)和云,实现双向通信,可支撑亿级设备连接与百万消息并发。

    消息队列秉持开放、共享的原则拥抱开源生态,无技术绑定,2016年阿里巴巴正式宣布将 MQ 内核引擎 RocketMQ 捐赠给 Apache 软件基金会;与此同时,全面融合 kafka 生态,做到无缝迁移,打造更安全、更可靠、更易运维的 kafka 企业级消息服务。

    课时列表

    展开全文
  • Tuxedo 中间件 实用手册,经典教程
  • 本文档主要介绍基于数字天堂Mkey中间件平台,如何进行手机端应用开发,里面有详细的安装和教程指南。
  • 作为消息中间件的MQ在java开发中起着举足轻重的地位,无论是ActiveMQ、RabbitMQ、还是RokcetMQ至少要会一个,否则别说自己是java程序员。Java自学网整理了目前行业最常用的消息中间件视频供大家学习。
  • 分布式任务DcsSchedule中间件,Github地址:https://github.com/fuzhengwei/schedule-spring-boot-starter 分布式任务DcsSchedule控制台,Github地址:https://github.com/fuzhengwei/itstack-mid...

    微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,让自己和他人都能有所收获!
    分布式任务DcsSchedule中间件,Github地址:https://github.com/fuzhengwei/schedule-spring-boot-starter
    分布式任务DcsSchedule控制台,Github地址:https://github.com/fuzhengwei/itstack-middleware-control
    欢迎⭐Star和使用,你用剑🗡、我用刀🔪,好的代码都很骚😏,望你不吝出招💨!

    演示视频

    开发基于SpringBoot的分布式任务中间件DcsSchedule(为开源贡献力量)

    前言


    @SpringBootApplication
    @EnableScheduling
    public class Application{
        public static void mian(String[] args){
            SpringApplication.run(Application.class,args);
        }
    	
    	@Scheduled(cron = "0/3 * * * * *")
    	public void demoTask() {
    		//...
    	}
    }
    

    咔咔,上面这段代码很熟悉吧,他就是SpringBoot的Schedule定时任务,简单易用。在我们开发中如果需要做一些定时或指定时刻循环执行逻辑时候,基本都会使用到Schedule。

    但是,如果我们的任务是比较大型的,比如;定时跑批T+1结算、商品秒杀前状态变更、刷新数据预热到缓存等等,这些定时任务都相同的特点;作业量大实时性强可用率高。而这时候如果只是单纯使用Schedule就显得不足以控制。

    那么,我们产品需求就出来了,分布式DcsSchedule任务;

    1. 多机器部署任务
    2. 统一控制中心启停
    3. 宕机灾备,自动启动执行
    4. 实时检测任务执行信息:部署数量、任务总量、成功次数、失败次数、执行耗时等

    嗯?有人憋半天了想说可以用Quertz,嗯可以的,但这不是本篇文章的重点。难道你不想看看一个自言开源中间件是怎么诞生的吗,怎么推到中心Maven仓的吗?比如下图;真香不!

    首页监控
    微信公众号:bugstack虫洞栈 & 首页监控

    任务列表
    微信公众号:bugstack虫洞栈 & 任务列表

    😀好了,接下来开始介绍这个中间件如何使用和怎么开发的了!

    中间件使用


    1. 版本记录

    版本 发布日期 备注
    1 1.0.0-RELEASE 2019-12-07 基本功能实现;任务接入、分布式启停
    2 1.0.1-RELEASE 2019-12-07 上传测试版本

    2. 环境准备

    1. jdk1.8

    2. StringBoot 2.x

    3. 配置中心zookeeper 3.4.14 {准备好zookeeper服务,如果windows调试可以从这里下载:https://www-eu.apache.org/dist/zookeeper}

    4. 下载后解压,在bin同级路径创建文件夹data、logs

    5. 修改conf/zoo.cfg,修改配置如下;

      dataDir=D:\\Program Files\\apache-zookeeper-3.4.14\\data
      dataLogDir=D:\\Program Files\\apache-zookeeper-3.4.14\\logs
      
    6. 打包部署控制平台

    7. 下载地址:https://github.com/fuzhengwei/itstack-middleware-control.git

    8. 部署访问:http://localhost:7397

    3. 配置POM

    <dependency>
        <groupId>org.itstack.middleware</groupId>
        <artifactId>schedule-spring-boot-starter</artifactId>
        <version>1.0.0-RELEASE</version>
    </dependency>
    

    4. 引入分布式任务DcsSchedule @EnableDcsScheduling

    1. 与SpringBoot的Sceduling非常像,他的注解是;@EnableScheduling,尽可能降低使用难度
    2. 这个注解主要方便给我们自己的中间件一个入口,也是😏扒拉源码发现的可以这么干{我一直说好的代码都很骚气}
    @SpringBootApplication
    @EnableDcsScheduling
    public class HelloWorldApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HelloWorldApplication.class, args);
        }
    
    }
    

    5. 在任务方法上添加注解

    1. 这个注解也和SpringBoot的Schedule很像,但是多了desc描述和启停初始化控制
    2. cron:执行计划
    3. desc:任务描述
    4. autoStartup:默认启动状态
    5. 如果你的任务需要参数可以通过引入service去调用获取等方式都可以
    @Component("demoTaskThree")
    public class DemoTaskThree {
    	
        @DcsScheduled(cron = "0 0 9,13 * * *", desc = "03定时任务执行测试:taskMethod01", autoStartup = false)
        public void taskMethod01() {
            System.out.println("03定时任务执行测试:taskMethod01");
        }
    
        @DcsScheduled(cron = "0 0/30 8-10 * * *", desc = "03定时任务执行测试:taskMethod02", autoStartup = false)
        public void taskMethod02() {
            System.out.println("03定时任务执行测试:taskMethod02");
        }
    
    }
    

    6. 启动验证

    1. 启动SpringBoot工程即可,autoStartup = true的会自动启动任务(任务是多线程并行执行的)
    2. 启动控制平台:itstack-middleware-control,访问:http://localhost:7397/ 成功界面如下;可以开启/关闭验证了!{功能还在完善}
      微信公众号:bugstack虫洞栈 & 任务列表

    中间件开发


    以SpringBoot为基础开发一款中间件我也是第一次,因为接触SpringBoot也刚刚1个月左右。虽然SpringBoot已经出来挺久的了,但由于我们项目开发并不使用SpringBoot的一套东西,所以一直依赖没有接触。直到上个月开始考虑领域驱动设计才接触,嗯!真的不错,那么就开始了夯实技能、学习思想用到项目里。

    按照我的产品需求,开发这么一款分布式任务的中间件,我脑袋中的模型已经存在了。另外就是需要开发过程中去探索我需要的知识工具,简单包括;

    1. 读取Yml自定义配置
    2. 使用zookeeper作为配置中心,这样如果有机器宕机了就可以通过临时节点监听知道
    3. 通过Spring类;ApplicationContextAware, BeanPostProcessor, ApplicationListener,执行服务启动、注解扫描、节点挂在
    4. 分布式任务统一控制台,来管理任务

    1. 工程模型

    schedule-spring-boot-starter
    └── src
        ├── main
        │   ├── java
        │   │   └── org.itstack.middleware.schedule
        │   │       ├── annotation
        │   │       │	├── DcsScheduled.java	
        │   │       │	└── EnableDcsScheduling.java
        │   │       ├── annotation	
        │   │       │	└── InstructStatus.java	
        │   │       ├── config
        │   │       │	├── DcsSchedulingConfiguration.java	
        │   │       │	├── StarterAutoConfig.java	
        │   │       │	└── StarterServiceProperties.java	
        │   │       ├── domain
        │   │       │	├── DataCollect.java	
        │   │       │	├── DcsScheduleInfo.java	
        │   │       │	├── DcsServerNode.java	
        │   │       │	├── ExecOrder.java	
        │   │       │	└── Instruct.java
        │   │       ├── export	
        │   │       │	└── DcsScheduleResource.java
        │   │       ├── service
        │   │       │	├── HeartbeatService.java	
        │   │       │	└── ZkCuratorServer.java
        │   │       ├── task
        │   │       │	├── TaskScheduler.java	
        │   │       │	├── ScheduledTask.java	
        │   │       │	├── SchedulingConfig.java	
        │   │       │	└── SchedulingRunnable.java	
        │   │       ├── util
        │   │       │	└── StrUtil.java	
        │   │       └── DoJoinPoint.java
        │   └── resources	
        │       └── META_INF
        │           └── spring.factories	
        └── test
            └── java
                └── org.itstack.demo.test
                    └── ApiTest.java
    

    2. 代码讲解

    1. 篇幅较长,只讲解部分重点代码块,如果你愿意参与到开源编写,可以和我申请
    2. 我说过好的代码都很骚气,那么就从这部分入手吧

    2.1 自定义注解

    annotation/EnableDcsScheduling.java & 自定义注解

    这个注解一堆的圈A,这些配置都是为了开始启动执行我们的中间件;

    • Target 标识需要放到类上执行
    • Retention 注释将由编译器记录在类文件中,并且在运行时由VM保留,因此可以反射地读取它们
    • Import 引入入口资源,在程序启动时会执行到自己定义的类中,以方便我们;初始化配置/服务、启动任务、挂在节点
    • ComponentScan 告诉程序扫描位置
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Import({DcsSchedulingConfiguration.class})
    @ImportAutoConfiguration({SchedulingConfig.class, CronTaskRegister.class, DoJoinPoint.class})
    @ComponentScan("org.itstack.middleware.*")
    public @interface EnableDcsScheduling {
    }
    

    2.2 扫描自定义注解、初始化配置/服务、启动任务、挂在节点

    config/DcsSchedulingConfiguration.java & 初始化配置/服务、启动任务、挂在节点

    • 写到这的时候,我们的自定义注解有了,已经写到方法上了,那么我们怎么拿到呢?
    • 需要通过实现BeanPostProcessor.postProcessAfterInitialization,在每个bean实例化的时候进行扫描
    • 这里遇到一个有趣的问题,一个方法会得到两次,因为有一个CGLIB给代理的,像真假美猴王一样,几乎一毛一样。😏扒了源码才看到,生命注解批注没有。好那就可以判断了!method.getDeclaredAnnotations()
    • 我们将扫描下来的任务信息汇总到Map中,当Spring初始化完成后,在执行我们中间件内容。{太早执行有点喧宾夺主了!主要人家也不让呀,给你抛异常😭。}
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    	Class<?> targetClass = AopProxyUtils.ultimateTargetClass(bean);
    	if (this.nonAnnotatedClasses.contains(targetClass)) return bean;
    	Method[] methods = ReflectionUtils.getAllDeclaredMethods(bean.getClass());
    	if (methods == null) return bean;
    	for (Method method : methods) {
    		DcsScheduled dcsScheduled = AnnotationUtils.findAnnotation(method, DcsScheduled.class);
    		if (null == dcsScheduled || 0 == method.getDeclaredAnnotations().length) continue;
    		List<ExecOrder> execOrderList = Constants.execOrderMap.computeIfAbsent(beanName, k -> new ArrayList<>());
    		ExecOrder execOrder = new ExecOrder();
    		execOrder.setBean(bean);
    		execOrder.setBeanName(beanName);
    		execOrder.setMethodName(method.getName());
    		execOrder.setDesc(dcsScheduled.desc());
    		execOrder.setCron(dcsScheduled.cron());
    		execOrder.setAutoStartup(dcsScheduled.autoStartup());
    		execOrderList.add(execOrder);
    		this.nonAnnotatedClasses.add(targetClass);
    	}
    	return bean;
    }
    
    • 初始化服务连接zookeeper配置中心
    • 连接后将创建我们的节点以及添加监听,这个监听主要负责分布式消息通知,收到通知负责控制任务启停
    • 这里包括了循环创建节点以及批量节点删除,似乎!面试题会问😏
    private void init_server(ApplicationContext applicationContext) {
        try {
            //获取zk连接
            CuratorFramework client = ZkCuratorServer.getClient(Constants.Global.zkAddress);
            //节点组装
            path_root_server = StrUtil.joinStr(path_root, LINE, "server", LINE, schedulerServerId);
            path_root_server_ip = StrUtil.joinStr(path_root_server, LINE, "ip", LINE, Constants.Global.ip);
            //创建节点&递归删除本服务IP下的旧内容
            ZkCuratorServer.deletingChildrenIfNeeded(client, path_root_server_ip);
            ZkCuratorServer.createNode(client, path_root_server_ip);
            ZkCuratorServer.setData(client, path_root_server, schedulerServerName);
            //添加节点&监听
            ZkCuratorServer.createNodeSimple(client, Constants.Global.path_root_exec);
            ZkCuratorServer.addTreeCacheListener(applicationContext, client, Constants.Global.path_root_exec);
        } catch (Exception e) {
            logger.error("itstack middleware schedule init server error!", e);
            throw new RuntimeException(e);
        }
    }
    
    • 启动标记了True的Schedule任务
    • Scheduled默认是单线程执行的,这里扩展为多线程并行执行
    private void init_task(ApplicationContext applicationContext) {
        CronTaskRegister cronTaskRegistrar = applicationContext.getBean("itstack-middlware-schedule-cronTaskRegister", CronTaskRegister.class);
        Set<String> beanNames = Constants.execOrderMap.keySet();
        for (String beanName : beanNames) {
            List<ExecOrder> execOrderList = Constants.execOrderMap.get(beanName);
            for (ExecOrder execOrder : execOrderList) {
                if (!execOrder.getAutoStartup()) continue;
                SchedulingRunnable task = new SchedulingRunnable(execOrder.getBean(), execOrder.getBeanName(), execOrder.getMethodName());
                cronTaskRegistrar.addCronTask(task, execOrder.getCron());
            }
        }
    }
    
    • 挂在任务节点到zookeeper挂在
    • 按照不同的场景,有些内容是挂在到虚拟机节点。{😏又来个面试题,虚拟节点数据怎么挂在,创建的是永久节点,那么虚拟值怎么加?}
    • path_root_server_ip_clazz_method;这个结构是:根目录、服务、IP、类、方法
    private void init_node() throws Exception {
    	Set<String> beanNames = Constants.execOrderMap.keySet();
    	for (String beanName : beanNames) {
    		List<ExecOrder> execOrderList = Constants.execOrderMap.get(beanName);
    		for (ExecOrder execOrder : execOrderList) {
    			String path_root_server_ip_clazz = StrUtil.joinStr(path_root_server_ip, LINE, "clazz", LINE, execOrder.getBeanName());
    			String path_root_server_ip_clazz_method = StrUtil.joinStr(path_root_server_ip_clazz, LINE, "method", LINE, execOrder.getMethodName());
    			String path_root_server_ip_clazz_method_status = StrUtil.joinStr(path_root_server_ip_clazz, LINE, "method", LINE, execOrder.getMethodName(), "/status");
    			//添加节点
    			ZkCuratorServer.createNodeSimple(client, path_root_server_ip_clazz);
    			ZkCuratorServer.createNodeSimple(client, path_root_server_ip_clazz_method);
    			ZkCuratorServer.createNodeSimple(client, path_root_server_ip_clazz_method_status);
    			//添加节点数据[临时]
    			ZkCuratorServer.appendPersistentData(client, path_root_server_ip_clazz_method + "/value", JSON.toJSONString(execOrder));
    			//添加节点数据[永久]
    			ZkCuratorServer.setData(client, path_root_server_ip_clazz_method_status, execOrder.getAutoStartup() ? "1" : "0");
    		}
    	}
    }
    

    2.3 zookeeper控制服务

    service/ZkCuratorServer.java & zk服务

    • 这里提供一个zk的方法集合,其中比较重要的方法添加监听
    • zookeeper有一个特性是对这个监听后,当节点内容发生变化时会收到通知,当然宕机也是收得到的,这个也就是我们后面开发灾备的核心触发点
    public static void addTreeCacheListener(final ApplicationContext applicationContext, final CuratorFramework client, String path) throws Exception {
    	TreeCache treeCache = new TreeCache(client, path);
    	treeCache.start();
    	treeCache.getListenable().addListener((curatorFramework, event) -> {
    		//...
    		switch (event.getType()) {
    			case NODE_ADDED:
    			case NODE_UPDATED:
    				if (Constants.Global.ip.equals(instruct.getIp()) && Constants.Global.schedulerServerId.equals(instruct.getSchedulerServerId())) {
    					//执行命令
    					Integer status = instruct.getStatus();
    					switch (status) {
    						case 0: //停止任务
    							cronTaskRegistrar.removeCronTask(instruct.getBeanName() + "_" + instruct.getMethodName());
    							setData(client, path_root_server_ip_clazz_method_status, "0");
    							logger.info("itstack middleware schedule task stop {} {}", instruct.getBeanName(), instruct.getMethodName());
    							break;
    						case 1: //启动任务
    							cronTaskRegistrar.addCronTask(new SchedulingRunnable(scheduleBean, instruct.getBeanName(), instruct.getMethodName()), instruct.getCron());
    							setData(client, path_root_server_ip_clazz_method_status, "1");
    							logger.info("itstack middleware schedule task start {} {}", instruct.getBeanName(), instruct.getMethodName());
    							break;
    						case 2: //刷新任务
    							cronTaskRegistrar.removeCronTask(instruct.getBeanName() + "_" + instruct.getMethodName());
    							cronTaskRegistrar.addCronTask(new SchedulingRunnable(scheduleBean, instruct.getBeanName(), instruct.getMethodName()), instruct.getCron());
    							setData(client, path_root_server_ip_clazz_method_status, "1");
    							logger.info("itstack middleware schedule task refresh {} {}", instruct.getBeanName(), instruct.getMethodName());
    							break;
    					}
    				}
    				break;
    			case NODE_REMOVED:
    				break;
    			default:
    				break;
    		}
    	});
    }
    

    2.4 并行任务注册

    • 由于默认的SpringBoot是单线程的,所以这里改造了下,可以支持多线程并行执行
    • 包括了添加任务和删除任务,也就是执行取消future.cancel(true)
    public void addCronTask(SchedulingRunnable task, String cronExpression) {
        if (null != Constants.scheduledTasks.get(task.taskId())) {
            removeCronTask(task.taskId());
        }
        CronTask cronTask = new CronTask(task, cronExpression);
        Constants.scheduledTasks.put(task.taskId(), scheduleCronTask(cronTask));
    }
    public void removeCronTask(String taskId) {
        ScheduledTask scheduledTask = Constants.scheduledTasks.remove(taskId);
        if (scheduledTask == null) return;
        scheduledTask.cancel();
    }
    

    2.5 待扩展的自定义AOP

    • 我们最开始配置的扫描@ComponentScan(“org.itstack.middleware.*”),主要用到这里的自定义注解,否则是扫描不到的,也就是你自定义切面失效的效果
    • 目前这里的功能并没有扩展,基本只是打印执行耗时,后续完善的任务执行耗时监听等,就需要这里来完善
    @Pointcut("@annotation(org.itstack.middleware.schedule.annotation.DcsScheduled)")
    public void aopPoint() {
    }
    
    @Around("aopPoint()")
    public Object doRouter(ProceedingJoinPoint jp) throws Throwable {
    	long begin = System.currentTimeMillis();
    	Method method = getMethod(jp);
    	try {
    		return jp.proceed();
    	} finally {
    		long end = System.currentTimeMillis();
    		logger.info("\nitstack middleware schedule method:{}.{} take time(m):{}", jp.getTarget().getClass().getSimpleName(), method.getName(), (end - begin));
    	}
    }
    

    3. Jar包发布

    开发完成后还是需要将Jar包发布到manven中心仓库的,这个过程较长单独写了博客;发布Jar包到Maven中央仓库(为开发开源中间件做准备)

    综上总结


    1. 要开发要实现的还很多,一个周末也干不完所有的!而且需要有想法的小猿/媛伴一起加入!🙂 😀 😏
    2. 这里没有讲解分布式任务中间件控制平台itstack-middleware-control,因为比较简单只是使用了中间件的zk功能接口做展示和操作。
    3. 中间件开发是一件非常有意思的事情,不同于业务它更像易筋经,寺庙老僧,剑走偏锋,驰骋纵横,骚招满屏。

    微信公众号:bugstack虫洞栈,欢迎关注&获取源码

    展开全文
  • RabbitMQ 与 ActiveMQ 一样, rabbitmq 也是一种 消息中间件的实现。与之的区别在于, rabbitmq 更专业,更灵活,大企业,大型高要求的应用,普遍会采用 rabbitmq 来支持。 RabbitMQ 是基于 Erlang 语言开发的,就...
  • 通俗易懂的数据库中间件Mycat教程(含资料) 张长志技术全才、擅长领域:区...
  • ESB系列之中间件技术入门教程

    万次阅读 2017-04-24 13:55:39
    前言 中间件 中间件概念 中间件分类 ESB JMS前言本博客介绍Java中间件的一些知识,仅仅是一些知识储备。...若是以新一代的中间件系列产品来组合应用,同时配合以可复用的商务对象构件,则应用开发费用可节省至8
  • 通俗易懂的消息中间件ActiveMQ教程(含配套资料) 张长志技术全才、擅长...
  • c#开源消息队列中间件EQueue 教程

    千次阅读 2014-08-13 12:28:38
    EQueue是一个参照RocketMQ实现的开源消息队列中间件,兼容Mono,具体可以参看作者的文章《分享一个 c# 写的开源分布式消息队列equeue》。项目开源地址:https://github.com/tangxuehua/equeue,项目中包含了队列的...
  • 中间件的设计为开发者提供了一种无侵入式的开发方式,增强了Django框架的健壮性。 我们可以使用中间件,在Django处理视图的不同阶段对输入或输出进行干预。 中间件的原理其实就是定义了一个装饰器,但是这个装饰器...
  • 对机顶盒软件中间件各模块进行详细分析和设计,给出设计原理和设计过程,同时给出测试方案。是对相关领域的软件工程师很好的教程
  • Sybase EAServer 4.1高级程序员教程,讲解了如何采用该中间件进行程序开发
  • J2EE开发教程,PPT版,内容详细,开发技术学习的好帮手。
  • 搭建fisco-bcos和webase中间件开发环境依赖安装node环境搭建webase中间件依赖配置JavaMySQL-pythonmysqlmysql安装mysql配置test用户(不建议给root用户授权远程访问)搭建单群组4节点联盟链4节点联盟链搭建检查工作...
  • 移动端开发教程

    2011-10-09 09:32:24
    介绍基于手机中间件的移动终开发,可以跨终端跨平台,一次开发处处运行
  • 每个中间件是一个定义了handle方法的类或是一个匿名函数,一般所有中间件放在同一个文件夹middleware中,方便管理public function handle($request, Closure $next)中间件有什么用 一: 路由前中间件(也叫全局中间件)...
  • Android开发教程

    2013-08-01 10:56:26
    Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta 版 的Android SDK 提供了在Android 平台上使用JaVa 语言进行Android 应用开发必须的工具和API 接口。
  • 年纪轻轻,为什么要搞中间件开发? 五年前,香河大厂村,开张大吉。我和弟兄们雄心壮志,坐公交车去面试,谁知道求职不到半个月,每天平均1.3个人挂在八股文造火箭,一年内6个兄弟去了外包。 佛祖保佑!算命的说我...
  • 《Tuxedo中间件开发与配置》pdf书

    热门讨论 2009-08-28 16:13:57
    本书 的主要内容如下: TUXEDO的安装、配置 TUXEDO应用系统的管理维护 TUXEDO的缓冲区介绍 TUXEDO的服务端编程 TUXEDO的客户端编程 TUXEDO的通讯方式 TUXEDO的数据库编程 TUXEDO的可靠消息队列/Q ...
  • java的HTTP API文档生成中间件Swagger使用教程.zip 用JAVA开发动静分离的网站,后端要编写API文档简直太容易不过了,用上SWAGGER基本就是全自动生成API DOC了.
  • 中间件

    2018-09-20 15:07:31
    1 中间件 https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BB%B6/452240?fr=aladdin 2 中间件技术 https://baike.baidu.com/item/%E4%B8%AD%E9%97%B4%E4%BB%B6%E6%8A%80%E6%9C%AF/10430164 3 什么是中间件...
  • MyCat 是目前流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议 的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生协议与多个 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,159
精华内容 8,463
关键字:

中间件开发教程