NutzCN Logo
问答 如何在子线程里获取Request?
发布于 2791天前 作者 天空 3835 次浏览 复制 上一个帖子 下一个帖子
标签:
Class Action {
public MyRunner myRunner = new MyRunner();
public void doAction(){
Thread t = new Thread(myRunner);
t.start();

}
}

现在是如何在MyRunner的run()里,获得Request!?,需要取当前全网址。

18 回复

并不能, 作为构造方法参数传给它呗

把你所需的、request里面要获取的东西,包装成一个map之类的东西,然后放到线程执行环境里面。

可否注入?
因为Runner里是通过nutz的IOC注入了多个service,实际上是service要这个全网址拼链接。

@IocBean(name="inMsgParaserRunner")
public class InMsgParaserRunner implements Runnable {
	@Inject("msgServices")
	private List<IMsgService> msgServices;
}

因为service里也要dao等,所以。。。取用ioc注入的方式。

你这种情形,这个runner不去实现runnable,而当作一个工厂类:比如实现个getRunnable(String fullPath)方法;再在doAction里面,构建线程的时候去new Thread(myRunner.getRunnable(calcFullPath(request))),比较好。

@IocBean(name="inMsgParaserRunner", singleton=false)
public class InMsgParaserRunner implements Runnable {
	@Inject("msgServices")
	private List<IMsgService> msgServices;
        private String uri;
}

@IocBean
public class XXXAction {
@Inject("refer:$ioc")
private Ioc ioc;
@At
public void xxx() {
    InMsgParaserRunner runner = ioc.get(InMsgParaserRunner.class);
    runner.setUri(xxxx);
    new Thread(runner).start();
}

兽总的ioc代码强势入侵了。

@wendal
兽哥,可以构造时放进去,但只是Runner里可用吧。如何在service里获取呢?声明静态变量?

@qq_f9362623
取用什么存放这个map呢?

我只是建议不要直接传request而已,需要什么传什么,传的办法和兽总的一样。需要一个,就传一个;需要多个,就传多个或者构建一个map——比如NutMap。

@wendal 你6楼的代码我是明白的,这样Runner内部是可以使用了。
但由于是Runner的注入变量service里用这个url拼接,不会又每个service来setUrl(String url)吧,这样要改所有service的接口。
能不能优雅点?^_^!

service层没有mvc的req/resp代码才是优雅哦

嗯,service不需要req,是业务处理需要当前上下文的URL。

@qq_f9362623 所以作为参数传给他呗

-_-!
就是为了一个service需要这个上下文URL,改所有service的接口,也是醉了。。。真TM拗口。
谢谢兽哥先
我再试试静态变量行不行。建义nutz加个这样的工具类,嘻嘻。(子线程里也可以获到主线程的一些特殊变量。)

把req传给runner,然后runner的run方法开头的地方执行一下 Mvcs.setReq()

@wendal 我试过把ActionContext和request都放到Runner的实例变量,然后在run方法开头做Mvcs.setActionContext()和setReq().
但在Runner里注入的service(数组)的exe()里调用Mvcs.getActionContext()还是为空。
还没搞明到底注入的service在使用那一个线程的东东。

晚上再试了一下,这种情况可以直接在Action里把参数放到Runner类的静态变量中,然后子线程相关的类可以直接调用这个静态变量。
@IocBean
public class XXXAction {
@Inject("refer:$ioc")
private Ioc ioc;
@At
public void do() {
InMsgParaserRunner runner = ioc.get(InMsgParaserRunner.class);
runner.setUri(xxxx);
new Thread(runner).start();
}

@IocBean(name="inMsgParaserRunner")
public class InMsgParaserRunner implements Runnable {

private static String url;

public static String getUrl() {
    return url;
}

public static void setUrl(String url) {
    if (null == InMsgParaserRunner.url){
       InMsgParaserRunner.url= url;
    }else{
       throw new IllegalArgumentException("不能重新赋值给该静态变量");
    }

}

}

//其它的类使用时,直接
InMsgParaserRunner.getUrl() ;

问题解决,就是无啦啦多左个静态变量,眼晕。。

不怕并发问题么?

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