我将Futures从ExecutorService推送到哈希映射中.之后,我可以在哈希映射中调用取消期货.虽然结果是正确的,但我后来在Callable过程中命中了断点,好像Future cancel()没有效果.我认为这可能是两个不同引用的情况(即使引用ID在断点时被列为相同),但是想知道某些专家是否可以插入.这是代码的样子:
ExecutorService taskExecutor = Executors.newCachedThreadPool();
Map <String, Future<Object>> results = new HashMap <String, Future<Object>>();
Future<Object> future = taskExecutor.submit(new MyProcessor(uid));
results.put(uid, future);
Run Code Online (Sandbox Code Playgroud)
我允许继续处理(这是一个在传入任务时提交任务的循环),稍后我可能会尝试通过调用此方法从外部源取消:
public static synchronized boolean cancelThread(String uid) {
Future<Object> future = results.get(uid);
boolean success = false;
if (future != null) {
success = (future.isDone() ? true : future.cancel(true));
if (success)
results.remove(uid);
}
return success;
}
Run Code Online (Sandbox Code Playgroud)
但是在调用future.cancel()之后,我仍然在MyProcessor.call()中遇到"未取消"路径 - 即它并没有真正被取消.
我哪里错了?这样做有好处吗?
我们在现有项目中有许多DAO(目前没有接口,但可以改变).我们没有为每个DAO类连接一个Spring管理的bean并将它们注入服务层,而是有一个类似于这样的DAO"工厂":
public class DAOFactory {
private static DAOFactory daoFac;
static{
daoFac = new DAOFactory();
}
private DAOFactory(){}
public static DAOFactory getInstance(){
return daoFac;
}
public MyDAO1 getMyDAO1(){
return new MyDAO1();
}
public MyDAO2 getMyDAO2(){
return new MyDAO2();
}
...
Run Code Online (Sandbox Code Playgroud)
(注意MyDAO1和MyDAO2是具体的类)
这允许我们在服务层内轻松添加/调用DAO方法,而不必1.)将DAO接口作为属性添加到服务类2.)通过配置将DAO实现连接到服务方法.(我们有时在一个服务类中使用多个DAO).
DAOFactory.getInstance().getMyDAO1().doSomething();
Run Code Online (Sandbox Code Playgroud)
到目前为止,这个策略对我们有用(我们不太需要切换实现),但我想知道如果我们能够开始新的更好的方法吗?我考虑将DAO自动装配为bean,但我仍然需要在每个服务类中创建属性来表示正在使用的DAO.在一个大型项目中,我仍然犹豫是否开始自动布线bean - 我们需要为所有开发人员提供可见性.
感觉就像我在一个实体之间紧密耦合,但是更少的代码/配置开销和b.)松散地耦合到接口,但需要大量的代码/配置开销.
有没有更好的方法让我失踪?介于两者之间?意见表示欢迎.
在我在本地构建的基本.NET Web服务(asmx)中,我正在尝试使用Log4NET登录到文件.如果我在Visual Studio中启动调试模式并使用提供的wsdl/test页面测试服务,这可以正常工作.但是,如果我尝试使用单独的客户端(我制作了一个C#控制台应用程序来调用该服务),我会看到预期的响应,但是没有记录.
(下面列出了单独的客户端代码.我必须导入对Web服务的内置DLL的引用.)
我对此有点新,但我推测问题是因为在VS服务器或IIS之外(我没有使用),不使用Global.asax(其中包含我的初始化命令用于记录).但我需要从外部客户端进行测试.如何从客户端应用程序的角度初始化Global.asax,或者如何避免需要?这听起来像解决我的日志问题吗?
我的Web服务项目中的Global.asax包含以下声明:
protected void Application_Start(object sender, EventArgs e)
{
log4net.Config.XmlConfigurator.Configure();
}
Run Code Online (Sandbox Code Playgroud)
我的单独客户端(控制台)应用程序如下所示:
static void Main(string[] args)
{
MyWebService proxy = new MyWebService();
MyWebService.Request request = new MyWebService.Request();
request.Type = "Test";
MyWebService.Response response = proxy.GetResponse(request);
Console.WriteLine("RESPONSE CODE: " + response.StatusCode);
Console.WriteLine("RESPONSE MSG: " + response.StatusMessage);
Console.WriteLine("Press any key to continue...");
Console.ReadKey(true);
}
Run Code Online (Sandbox Code Playgroud)
我也不清楚如何更改此控制台应用程序以引用Visual Studio服务器实例(例如:localhost:1583/MyWebService.asmx?op = GetResponse),而不是创建Web服务的代理实例.我认为这也可以解决问题,因为Visual Studio服务器使用Global.asax,不是吗?