小编Rya*_*n H的帖子

ExecutorService的未来任务并未真正取消

我将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()中遇到"未取消"路径 - 即它并没有真正被取消.

我哪里错了?这样做有好处吗?

java concurrency future executorservice

11
推荐指数
1
解决办法
1万
查看次数

Spring Java中许多DAO的策略

我们在现有项目中有许多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.)松散地耦合到接口,但需要大量的代码/配置开销.

有没有更好的方法让我失踪?介于两者之间?意见表示欢迎.

java spring dao

6
推荐指数
1
解决办法
2393
查看次数

使用Log4Net的.NET Web Service日志记录无法在单独的客户端上运行

在我在本地构建的基本.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,不是吗?

.net c# log4net web-services

0
推荐指数
1
解决办法
6790
查看次数

标签 统计

java ×2

.net ×1

c# ×1

concurrency ×1

dao ×1

executorservice ×1

future ×1

log4net ×1

spring ×1

web-services ×1