Java 与执行者共享应用程序上下文
让我先澄清一下议程:Java 与执行者共享应用程序上下文,java,spring,soap,executorservice,Java,Spring,Soap,Executorservice,让我先澄清一下议程: 我有1000个请求数据 我将阅读所有1000份申请,并将1000份申请提交给执行人 每个任务都将访问soap Web服务并获得响应 问题: 我有一个共享的应用程序上下文,它对所有线程都是相同的 在bean.xml文件中,我有一个原型bean,我想用它来发出soap请求 如果我使用共享应用程序上下文并获得proptype bean,那么它将导致共享应用程序上下文变量出现任何synchrinizattion问题 下面是示例代码: import java.io.ObjectInp
import java.io.ObjectInputStream.GetField;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class AppContext
{
ApplicationContext sharedContext = new ClassPathXmlApplicationContext("Beans.xml");
public static ApplicationContext getAppContext()
{
if(sharedContext!=null)
return sharedContext; //will this cause any isseu while accessing by multiple threads
}
}
public class Testing {
public static void main(String args[])
{
//here I tried to submit the task using ExecutorService and want to use the same application context
//can I pass the prototypeBean in all the task with out synchronization issue?
//because My appcontext is static so will it cause any issue while accessing my multiple threads
ExecutorService service=Executors.newFixedThreadPool(10);
service.submit(new LoopTaskA(AppContext.getAppContext().getBean("myProtoTypeBean")));
service.submit(new LoopTaskA(AppContext.getAppContext().getBean("myProtoTypeBean")));
service.submit(new LoopTaskA(AppContext.getAppContext().getBean("myProtoTypeBean")));
service.submit(new LoopTaskA(AppContext.getAppContext().getBean("myProtoTypeBean")));
service.shutdown();
}
}
这取决于您的
可运行程序的功能。如果它们是无状态bean,并且不与其他Runnable
s共享/修改相同的变量/引用,那么通常您是安全的<如果bean作用域是prototype,则code>getBean()
将返回一个新实例
注意池大小,确保设置了合理的池大小(请参阅)。另外,确保发出web服务请求的工作线程设置了适当的超时。这取决于
可运行程序的功能。如果它们是无状态bean,并且不与其他Runnable
s共享/修改相同的变量/引用,那么通常您是安全的<如果bean作用域是prototype,则code>getBean()
将返回一个新实例
注意池大小,确保设置了合理的池大小(请参阅)。另外,确保发出web服务请求的工作线程设置了适当的超时。在我的Runnable中,我将使用原型bean来访问web服务。我的所有任务都是从同一个应用程序上下文中获取原型bean,那么我的同一个应用程序上下文是否会导致任何问题?请帮助代码将与我上面提到的相同。通过不同线程从同一应用程序上下文获取辅助bean没有问题。但是如果您的工作bean共享/修改相同的变量/引用,那么就有问题了。共享相同的变量是什么意思,我认为您是指通过相同的应用程序上下文共享单例bean?所以,如果它的原型bean由应用程序上下文提供服务,那么我没有任何问题,您需要阅读关于线程安全的内容。例如,假设您仅将全局计数器保留为
int
变量,并在处理每个请求(来自工作线程)后更新它,那么您的代码不是线程安全的-您有一个争用条件,所以你需要一个合适的锁或者AtomicInteger
来更新这个计数器。我的所有任务都是从同一个应用程序上下文中获取原型bean,那么我的同一个应用程序上下文是否会导致任何问题?请帮助代码将与我上面提到的相同。通过不同线程从同一应用程序上下文获取辅助bean没有问题。但是如果您的工作bean共享/修改相同的变量/引用,那么就有问题了。共享相同的变量是什么意思,我认为您是指通过相同的应用程序上下文共享单例bean?所以,如果它的原型bean由应用程序上下文提供服务,那么我没有任何问题,您需要阅读关于线程安全的内容。例如,假设您仅将全局计数器保留为int
变量,并在处理每个请求(来自工作线程)后更新它,那么您的代码不是线程安全的-您有一个争用条件,因此您需要一个适当的锁定或AtomicInteger
来更新此计数器。