yuzd / Hangfire.HttpJob

httpjob for Hangfire,restful api for Hangfire,job调度与业务分离
https://github.com/yuzd/Hangfire.HttpJob/wiki
MIT License
630 stars 186 forks source link

使用agent.job 想先登陆获取用户token,再带token去访问agent.job,无法实现 #202

Closed wanglei8888 closed 9 months ago

wanglei8888 commented 10 months ago

image

image 配置信息: { "Success": { "Url": "http://localhost:5566/jobagent", "Method": "Post", "Data": "", "ContentType": "application/json", "Timeout": 20000, "QueueName": "recurring", "AgentClass": "SRM.Application.Job.PerformanceAppraisalJob,SRM.Application", "Headers": { "Authorization": "#{#parent.data}" }, "BasicUserName": "admin", "BasicPassword": "test" }, "RecurringJobIdentifier": "绩效考核定时任务", "Url": "http://localhost:5566/login", "Method": "Post", "Data": "{\"userName\":\"test-admin\",\"password\":\"123456\"}", "ContentType": "application/json", "Timeout": 20000, "DelayFromMinutes": 15, "Cron": "0 0 31 2 *", "JobName": "绩效考核定时任务", "QueueName": "recurring", "AgentTimeout": 0, "SendSuccess": false, "SendFail": false, "Mail": "", "EnableRetry": false, "RetryTimes": 0, "BasicUserName": "admin", "BasicPassword": "test", "Headers": {} } 日志: image

yuzd commented 10 months ago

image

wanglei8888 commented 10 months ago

请问可以再job.agent里面打印表头这种操作吗?或者带入的参数

wanglei8888 commented 10 months ago

image 这个里面

yuzd commented 10 months ago

你是希望拿什么信息呢? 有试过从jobContext里面拿param吗

wanglei8888 commented 10 months ago

我是希望拿从父接口传入的信息,检测是否传正确得值例如: ![Uploading image.png…]()

wanglei8888 commented 10 months ago

image

yuzd commented 10 months ago

jobContext对象里面有个Headers 你试试

wanglei8888 commented 10 months ago

image 获取没问题了 再冒昧的请教一个问题,我查询数据添加了sqlsugar的过滤器,会为所有表格添加一个过滤条件,但是这个过滤条件是从jwt鉴权的信息里面获取,但是我看job.agent 带上头部也不会获取到鉴权信息,job.agent是不是不是不是通过http方式实现的?事通过什么方式实现的? 请问我这个问题,有方法解决吗?

wanglei8888 commented 10 months ago

image

yuzd commented 10 months ago

hangfire是通过http方式请求调度agent的

如果你在agent上加过滤器的话 可能你需要把你的过滤器middlerware的顺序放在hangfireagent的middlerware的前面才会生效把。 https://github.com/yuzd/Hangfire.HttpJob/blob/master/Agent/Hangfire.HttpJob.Agent/JobAgentMiddleware.cs

wanglei8888 commented 10 months ago

image 你如果有时间的话,https://github.com/wanglei8888/HuanTian 这里有demo(HuanTian.Store项目),里面有我的注册顺序

wanglei8888 commented 10 months ago

即使放最后注册中间件也无法获取,请问有合适的解决方案推荐吗?

yuzd commented 10 months ago

建议啦代码调试下 理论上控制middreware的顺序应该是可行的额

yuzd commented 10 months ago

agent的请求接收是封装在一个middreware的 如果你的filter 能作用在这一层之前拿到请求进行处理 应该是可行的

wanglei8888 commented 10 months ago

1702014396212 1702014396218 因为有默认的Authorization,替换成其他的就可以了。 1702014398125 1702014396224 明明依赖注入的时候有值,但是进入方法之后,IHttpContextAccessor 值又为null了,不知道为什么

yuzd commented 10 months ago

原来被替换了

依赖注入没有,感觉像是HttpContextAccessor的使用方式有点问题 你参考下 https://stackoverflow.com/questions/52927463/access-httpcontextaccessor-from-startup-cs-in-net-core-webapi

wanglei8888 commented 10 months ago

我看了下源码,开了一个线程去执行这个任务,但是依赖注入被替换了. 这应该算是程序BUG把? 你提供的方法,解决不了,因为IHttpContextAccessor 为null,如何调用也是null

wanglei8888 commented 10 months ago

demo,我发你qq邮箱了

yuzd commented 9 months ago

好的 我看下

yuzd commented 9 months ago

agent的job收到了server的调度的时候,会开启一个新的线程去执行,只有这样才能执行长时间运行的任务,是这么设计的 至于为啥IHttpContextAccessor 对象的HttpContext为啥为null 在Construct构造方法的时候你看是有值的。 但是由于是异步执行job的OnStart方法, 执行构造方法的http请求线程已经处理完了,导致HttpContext变成null

不建议在Onstart方法里面去读取IHttpContextAccessor.HttpContext 你需要用到header信息应该直接从JobContext上下文中去拿

wanglei8888 commented 9 months ago

多谢了,作者大大! 我用的sqlSugar租户过滤器,每次查询都需要获取当前登陆用户的租户、 那看来使用httpjob更好一些,能完全契合框架,jobAgent不太适合我这种

yuzd commented 9 months ago

好的

wanglei8888 commented 9 months ago

我还发现一个问题、回调函数执行的方法里打印无法生效 image image image