NutzCN Logo
问答 关于@Async 的一个疑问
发布于 1396天前 作者 LjieJJJJJJJ 1600 次浏览 复制 上一个帖子 下一个帖子
标签:
@IocBean(args = {"appid String"})
public class SendTemplateMessageService {
  private String appid;


  public SendTemplateMessageService (String appid){
    this.appid = appid;
  }


@Inject(":hiTest")
  SendTemplateMessageService wxtpservice;

在有参构造器的类中,方法上加@Async 是否就不会异步执行了

18 回复

我去掉有参构造器就可以异步执行,加了有参构造器异步就无效了,在里面加了一个sleep测试 控制类会等待执行结束再继续往下走

感觉不可能咯,是不是没走ioc了?

@IocBean(args = {"appid String"})
public class TestAsyncService {
	private String appid;
	
	public TestAsyncService(String appid) {
		System.out.println(appid + "-------1------");
		this.appid = appid;
	}
	
	@Async
	public void test(){
		try {
			Thread.sleep(5000);
			System.out.println(appid + "-------2------");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
	}
	
}

@IocBean
@At("/test")
public class TestAction {
	@Inject(":see hi")
	TestAsyncService service;
	
	@At("")
	public void index(){
		long time1 = new Date().getTime();
		System.out.println("这是进入前");
		service.test();
		long time2 = new Date().getTime();
		System.out.println("这是进入后,时间差=" + (time2-time1));
		
	}
}

打印结果:
see hi-------1------
这是进入前
see hi-------2------
这是进入后,时间差=5001

@wendal 大佬 我这是不是哪里写的有问题才会导致出现这个问题呀

既然不加带参数的构造方法可以,那就不加嘛,配置信息通过PropertiesProxy conf等途径inject到实例,然后获取之

@wendal 哈哈 好的 其实我只是需要在异步的过程中给对象内的一个属性赋个值,因为在异步的过程都是围绕这个值来做的,但是这个值是动态的 每次请求可能都不一样,我没想到啥好方法,只是不想通过方法传过去, 所以就想到了这个方法,想尝试一下

每次不一样?那为啥不走方法参数?异步调用的方法能传参的

@wendal 因为这个参数属于请求的一个必要参数,在后期的业务过程中也都是围绕着这个参数来实现业务逻辑的,本身这个参数我在经过拦截器的时候会进行一次预处理,后面的每次方法都会用到,所以我就不想放在方法里总感觉这样方法每次都传这个参数会很麻烦,就想放在类的全局变量参数通过构造器来进行初始化赋值,或者有什么其他的方式,能让在注入的这个类里能拿到我想传过去的这个参数

既然是全局变量,做个public static 属性就行啦

@wendal 额 那在同一时间 ,两个请求,如果第一个方法没执行完第二个不是会覆盖上一个么?

@wendal 大佬 其实我的思路是 在拦截器里或者在动作链里将请求的参数拿到再进行预处理之后将值赋值到控制类中注入的某个异步类中,只要在这里面能拿到参数就可以 这个有没有什么方法可以实现

那跟构造方法参数完全没关系呀

@wendal 我也是没想到啥其他的好办法,就只想到通过构造器传参数过去。然后就没有思路了 就纠结在这个问题上了 麻烦大佬给个思路

既然是从请求参数得出,那就当方法参数传过去呀

嗯 那好吧 只能这么干了 麻烦大佬拉

构造方法参数就传一次,没有可行性呀

@wendal 哦对哦 只实例化一次,尴尬了 搞忘了,一直没思路还走了条死路。。。

添加回复
请先登陆
回到顶部