首页 文章 精选 留言 我的

精选列表

搜索[后台会话],共10006篇文章
优秀的个人博客,低调大师

Java后台怎么学习架构方面的知识?

架构是通过学习和实践总结出来的,建议你先看看架构方面的经典书籍,弄清楚什么是架构,以及架构师的职责是什么,这样你才能有的放矢的去学习。架构有细分了很多领域: 数据架构 业务架构 系统集成架构 IT基础架构等 等等 看你专注于那方面的架构。从你的问题描述来看,使用ssm,平常主要都是业务代码,建议你看看下面的一些书籍: 1. 大型网站技术架构:核心原理与案例分析 国内李智慧大师的一本书,如果你想从事架构,这本书强烈推荐,一语道破了架构大型Web系统的常规策略。 2. 淘宝技术这10年 这本书描述了淘宝的技术架构的演化,因为我们知道,架构是设计出来的,更是演化出来的。 3.Clean Code,代码简洁之道 教父级的马丁大叔的经典之作,如果你的代码写的很啰嗦,如果你想重构你的代码,请看这本书。作为架构师,review被人的代码是常事,所以这本书很重要。 4. 重构,改善既有代码的设计 世界知名软件开发大师Martin Fowler的不朽经典 生动阐述重构原理和具体做法 普通程序员进阶到编程高手的修炼秘笈。 当然上面推荐的书只是冰山一角。 此外,你还得多注意一些广度,有机会多参加一些技术沙龙或者架构大会,拓宽你的视野。 另外,作为一名架构师,沟通和管理技巧也不可少。如果金钱和精力允许的话,可以考一个PMP的认证。 最后,说说英语,一定要提高自己的英语水平,至少是阅读英语的水平,因为软件行业技术变化的太快,而架构师有的时候需要全面了解最新的技术动态,而这些技术动态不一定有中文文档,所以,英语好肯定是必不可少的,可以让你少走很多弯路。 另外以下是些架构资料获取方式 以上技术方向我们有自己的高清思维方向导图以及架构师有自己讲解的架构视频分享(包括高可用,高并发,spring源码,mybatis源码,JVM,大数据,Netty等多个技术知识的架构视频资料和各种电子书籍阅读)进群享学-Java架构师:766529531获取

优秀的个人博客,低调大师

如何使用WorkManager执行后台任务(下)

0x00 WorkManager的高级用法 在上一文中已经了解到 WorkManager的基本用法之后,今天来看看它的一些高级用法: 链式任务调用 唯一任务序列 传递参数和获取返回值 0x01 链式任务(Chained tasks) WorkManager在执行多个工作任务的时候,可以指定执行顺序。假设一个应用程序中有3个 OneTimeWorkRequest对象: workA、 workB、 workC。这几个任务需要按照顺序执行,那么可以使用 WorkManager.beginWith()方法加入 workA,这时候会返回一个 WorkContinuation对象,它定义了工作任务的执行序列。然后通过它再调用 WorkContinuation.then()把 workB和 workC加入到执行队列中,最后执行 WorkManager.enqueue()方法。 WorkManager.getInstance() .beginWith(workA) // Note: WorkManager.beginWith() returns a // WorkContinuation object; the following calls are // to WorkContinuation methods .then(workB) // FYI, then() returns a new WorkContinuation instance .then(workC) .enqueue() WorkManager会按照指定的顺序来执行 workA、 workB、 workC。如果其中有一个工作任务执行的时候返回 Worker.Result.FAILURE,那么整个执行序列就会停止。 WorkManager.beginWith()方法可以传递多个 Worker对象,表示可以并行执行的任务组,然后再调用 then()方法。当这并行任务组都执行完之后才会执行接下来 then中的工作任务。 WorkManager.getInstance() // 首先,并行执行workA1,workA2,workA3这三个任务 .beginWith(workA1, workA2, workA3) // 当三个任务都完成之后, 开始执行workB: .then(workB) // 最后再并行执行 workC1,workC2 .then(workC1, workC2) .enqueue() 还可以通过 WorkContinuation.combine()方法创建更加复杂的链接任务调用序列。它可以将两个 WorkContinuation对象合并,假设要调用如下的任务序列: val chain1 = WorkManager.getInstance() .beginWith(workA) .then(workB) val chain2 = WorkManager.getInstance() .beginWith(workC) .then(workD) val chain3 = WorkContinuation .combine(chain1, chain2) .then(workE) chain3.enqueue() 这个链式执行顺序是:子链 A->B 与子链 C->D 并行执行的, workA执行后再执行 workB,以及 workC执行后执行 workD ;然后等待 workB以及 workD都执行完,最后执行 workE。 需要注意的是, WorkManager无法保证两个子链的执行顺序,有可能 chain1比 chain2快,也有可能是 chain1比 chain2慢。 0x02 唯一任务序列(Unique work sequences) 在应用程序开发中,可能会多次把同一个链式任务添加到 WorkManager中,但希望只有一个链式任务在执行,这时候可以使用唯一任务序列对链式任务指定处理规则。假设,做一个下载文件操作,对一个文件下载链接,我们不需要重复下载,只需要添加一次,后面再添加这个任务,就忽略掉,因为我们不希望重复多次下载同一个文件。所以当添加两个同样名称为"download"操作任务时,对于唯一任务序列来说,可以通过 ExistingWorkPolicy中的 REPLACE, KEEP 和 APPEND,来指定添加的策略。 REPLACE:新任务将替换旧的 KEEP:新任务会被丢弃,旧的任务会被保持 APPEND:追加,旧任务执行之后再执行新的任务。 使用 beginUniqueWork()方法可以创建任务序列,并且可以指定唯一的一个名称(name)。然后再 ExistingWorkPolicy指定任务的替换策略 WorkContinuation continuation = mWorkManager .beginUniqueWork("download", ExistingWorkPolicy.KEEP, OneTimeWorkRequest.from(CleanupWorker)) 0x03 传递参数和获取返回值 任务执行可以传递参数以及获取到任务执行的结果。使用 WorkRequst.Builder.setInputData()方法传递一个 Data对象,它是key-value形式的对象,使用 Data.Builder来创建。在 Worker类中可以使用 Worker.getInputData()获取到参数。 同样地,在 Worker中可以使用 Worker.setOutputData()设置一个 Data对象的返回值。要获取到这个返回值就通过 LiveData<WorkStatus>。 举个栗子: 有一个下载任务,在 Worker中获取传递过来的参数url,然后执行下载,最后设置下载结果。 // the result key: const val KEY_RESULT = "result" class DownloadWorker(context : Context, params : WorkerParameters) : Worker(context, params) { override fun doWork(): Result { // 获取参数 val url = getInputData("url") // 执行下载 val result = download(url); // 设置下载结果 val output: Data = mapOf(KEY_RESULT to result).toWorkData() setOutputData(output) // 任务执行成功 return Result.SUCCESS } } 然后,通过 WorkRequest传递参数 // 构造下载链接参数 val urlData: Data = mapOf("url" to "https://developer.android.com/images/topic/libraries/architecture/workmanager-chain.svg") .toWorkData() // 构造WorkRequest并传递下载参数 val downloadWork = OneTimeWorkRequest.Builder<DownloadWorker>() .setInputData(urlData) .build() // 交给WorkManager执行任务 WorkManager.getInstance().enqueue(downloadWork) 最后,通过 WorkStatus获取返回值 WorkManager.getInstance().getStatusById(downloadWork.id) .observe(this, Observer { status -> if (status != null && status.state.isFinished) { val myResult = status.outputData.getString(KEY_RESULT, myDefaultValue) // ... do something with the result ... } }) 0x04 引用 https://developer.android.com/topic/libraries/architecture/workmanager/advanced https://developer.android.com/reference/androidx/work/ExistingWorkPolicy http://clmirror.storage.googleapis.com/codelabs/android-workmanager/index.html?index=..%2F..%2Findex#0

优秀的个人博客,低调大师

使用python实现后台系统的JWT认证

今天的文章介绍一种适用于restful+json的API认证方法,这个方法是基于jwt,并且加入了一些从oauth2.0借鉴的改良。 1. 常见的几种实现认证的方法 首先要明白,认证和鉴权是不同的。认证是判定用户的合法性,鉴权是判定用户的权限级别是否可执行后续操作。这里所讲的仅含认证。认证有几种方法: 1.1 basic auth 这是http协议中所带带基本认证,是一种简单为上的认证方式。原理是在每个请求的header中添加用户名和密码的字符串(格式为“username:password”,用base64编码)。 这种方式相当于将“用户名:密码”绑定为一个开放式证书,这会有几个问题:①每次请求都需要用户名密码,如果此连接未使用SSL/TLS,或加密被破解,用户名密码基本就暴露了;②无法注销用户的登录状态;③证书不会过期,除非修改密码。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册