小编Rae*_*ald的帖子

Java Executor应该永远运行的任务的最佳实践

我正在开发一个Java项目,我需要异步运行多个任务.我被引导相信Executor是我做这件事的最佳方式,所以我很熟悉它.(可以获得报酬!)然而,我不清楚最好的方法是完成我想要做的事情.

为了争论,让我说我有两个任务在运行.预计两者都不会终止,并且两者都应该在应用程序的生命周期内运行.我正在尝试编写一个主包装类,以便:

  • 如果任一任务抛出异常,则包装器将捕获它并重新启动任务.
  • 如果任一任务运行完成,则包装器将注意并重新启动该任务.

现在,应该注意的是,两个任务的实现都会将代码包装run()在一个永远不会运行完成的无限循环中,并且try/catch块应该处理所有运行时异常而不会中断循环.我正试图增加另一层确定性; 如果我或跟随我的人做了一些愚蠢的事情来挫败这些保护措施并停止任务,那么应用程序需要做出适当的反应.

是否有最佳实践来解决这个问题,那些比我更有经验的人会推荐?

FWIW,我已经掀起了这个测试类:


public class ExecTest {

   private static ExecutorService executor = null;
   private static Future results1 = null;
   private static Future results2 = null;

   public static void main(String[] args) {
      executor = Executors.newFixedThreadPool(2);
      while(true) {
         try {
            checkTasks();
            Thread.sleep(1000);
         }
         catch (Exception e) {
            System.err.println("Caught exception: " + e.getMessage());
         }
      }
   }

   private static void checkTasks() throws Exception{
      if (results1 == null || results1.isDone() || results1.isCancelled()) {
         results1 = executor.submit(new Test1());
      } …
Run Code Online (Sandbox Code Playgroud)

java executor

36
推荐指数
2
解决办法
2万
查看次数

在jasmine或mocha中声明"待定"规范/测试

我想描述应该在代码中的规范,但稍后会添加它们的实现.在测试结果中,我希望看到它们既不会通过也不会失败,而是"正在等待"实施.

如果有可能在摩卡或茉莉花中开箱即用,我很感兴趣.

谢谢

mocha.js jasmine

36
推荐指数
3
解决办法
2万
查看次数

Spring Rest模板用法导致EOFException

java.io.EOFException在Android上使用Spring REST模板时收到了.

stacktrace原因如下:

Caused by: java.io.EOFException
at libcore.io.Streams.readAsciiLine(Streams.java:203)
at libcore.net.http.HttpEngine.readResponseHeaders(HttpEngine.java:560)
at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:813)
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
at org.springframework.http.client.SimpleClientHttpResponse.getRawStatusCode(SimpleClientHttpResponse.java:49)
at org.springframework.http.client.SimpleClientHttpResponse.getStatusCode(SimpleClientHttpResponse.java:55)
at org.springframework.http.client.BufferingClientHttpResponseWrapper.getStatusCode(BufferingClientHttpResponseWrapper.java:47)
at com.company.util.LoggingClientHttpRequestInterceptor.intercept(LoggingClientHttpRequestInterceptor.java:33)
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.execute(InterceptingClientHttpRequest.java:81)
at com.company.api.interceptor.AuthTokenInterceptor.intercept(AuthTokenInterceptor.java:51)
at org.springframework.http.client.InterceptingClientHttpRequest$RequestExecution.execute(InterceptingClientHttpRequest.java:81)
at org.springframework.http.client.InterceptingClientHttpRequest.executeInternal(InterceptingClientHttpRequest.java:67)
at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:46)
at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:63)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:475)
... 14 more
Run Code Online (Sandbox Code Playgroud)

另一个类似的堆栈跟踪:

org.springframework.web.client.ResourceAccessException: I/O error: null; nested exception is java.io.EOFException
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:490)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:438)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:414)
at com.company.api.ApiClient_.logLoginAttempt(ApiClient_.java:299)
at com.company.security.CompanyAuthenticationService$2.onCreateCall(CompanyAuthenticationService.java:206)
at com.company.api.SafeApiCall.doInBackground(SafeApiCall.java:49)
at com.company.api.SafeApiCall.doInBackground(SafeApiCall.java:22)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856) …
Run Code Online (Sandbox Code Playgroud)

spring android eof android-annotations

36
推荐指数
2
解决办法
2万
查看次数

UPDATE是否成为隐含的​​INSERT

对于Cassandra,如果所选行不存在,那么它是否会UPDATE隐含INSERT?就是说,如果我说

 UPDATE users SET name = "Raedwald" WHERE id = 545127
Run Code Online (Sandbox Code Playgroud)

并且idPRIMARY KEY对的users表,表中有没有行与545127的关键,那将是等同于

 INSERT INTO users (id, name) VALUES (545127, "Raedwald")
Run Code Online (Sandbox Code Playgroud)

我知道相反的情况是正确的:INSERT对于id已经存在的已成为UPDATE行的一部分id.较早的Cassandra文档谈到了插入实际上是"upserts"的原因.

我对CQL3,Cassandra 1.2+版本感兴趣.

cql cassandra

36
推荐指数
3
解决办法
2万
查看次数

在UI中执行具有业务逻辑的单元测试数据库应用程序

我自己管理一个相当大的应用程序(50k +代码行),它管理一些相当重要的业务操作.为了简单描述这个程序,我想说它是一个花哨的UI,能够显示和更改数据库中的数据,它管理着大约1,000个租赁单元,大约3k租户和所有财务.

当我进行更改时,因为它的代码库太大了,我有时会在其他地方破坏某些东西.我通常通过浏览我在功能级别更改的内容来测试它(即我运行程序并通过UI工作),但我无法测试每种情况.这就是我想开始进行单元测试的原因.

但是,这不是一个真正的三层程序,它具有数据库层,业务层和UI层.很多业务逻辑都是在UI类中执行的,很多事情都是在事件上完成的.为了使事情复杂化,一切都是数据库驱动的,我还没有看到(到目前为止)关于如何对数据库交互进行单元测试的好建议.

如何开始使用此应用程序的单元测试是一种好方法.记住.我以前从未做过单元测试或TDD.我是否应该重写它以从UI类中删除业务逻辑(很多工作)?或者,还有更好的方法?

c# database unit-testing

35
推荐指数
6
解决办法
1814
查看次数

如何检查java中的空值

在这段代码中.

public class Test {
     public static void testFun(String str) {
         if (str == null | str.length() == 0) {
             System.out.println("String is empty");
         } else { 
             System.out.println("String is not empty");
         }
     }
     public static void main(String [] args) {
         testFun(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我们将null值传递给函数null.编译很好,但testFun在运行时给出.

假设传递给的实际参数的值NullPointerException是从某个进程生成的.假设该进程错误地返回null值并将其提供给testFun.如果是这种情况,如何验证传递给函数的值是否为null?

一个(奇怪的)解决方案可能是将形式参数分配给函数内的某个变量,然后对其进行测试.但是如果有许多变量传递给函数,那可能会变得乏味且不可行.那么,如何在这种情况下检查空值?

编辑:错误地写了|| 而不是| 在if条件下.现在生成运行时异常

java nullpointerexception

35
推荐指数
3
解决办法
16万
查看次数

从请求中获取根域

以下面的URL为例. http://www.test1.example.com

有什么方法可以让"example.com"作为输出.我知道有一种方法servletrequest.getServerName().它给我输出test1.example.com

任何帮助赞赏.

java servlets

35
推荐指数
2
解决办法
5万
查看次数

Rhino Mocks - Stub .Expect vs .AssertWasCalled

好吧,我知道在Rhino Mocks中对新的AAA语法有很多困惑,但我必须说实话,从我到目前为止看到的,我喜欢.它读得更好,并节省了一些按键.

基本上,我正在测试一个ListController基本上将负责一些事情列表:)我已经创建了一个最终将成为DAL的接口,这当然是存在的.

我有以下代码:

(manager是被测系统,data是存根数据接口)

    [Fact]
    public void list_count_queries_data()
    {
        data.Expect(x => x.ListCount(1));
        manager.ListCount();
        data.VerifyAllExpectations();
    }
Run Code Online (Sandbox Code Playgroud)

此测试的主要目的是确保经理实际查询DAL.请注意,DAL实际上并不存在,因此没有"实际"值返回..

但是,这是失败的,因为我需要将期望值更改为具有返回值,例如:

        data.Expect(x => x.ListCount(1)).Return(1);
Run Code Online (Sandbox Code Playgroud)

然后这将运行正常,测试将通过,令我困惑的是,此时,返回值没有任何意义.我可以将它改为100,50,42,无论如何,测试总会通过?

这让我感到紧张,因为测试应该是明确的,如果不能满足预期的条件,应该完全失败吗?

如果我将测试更改为("1"是计数链接到的预期ID):

    [Fact]
    public void list_count_queries_data()
    {
        manager.ListCount();
        data.AssertWasCalled(x => x.ListCount(1));
    }
Run Code Online (Sandbox Code Playgroud)

这一切都很顺利,如果我将测试切换到它的头部AssertWasNotCalled,它会按预期失败.我也认为它看起来好多了,更清楚正在测试什么,最重要的是PASSES和FAILS如预期的那样!

那么,我在第一个代码示例中遗漏了什么?你对存根断言有什么看法?(有一些有趣的讨论在这里,我个人也很喜欢这种反应.

rhino-mocks

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

什么是log4j的默认日志文件转储路径

嗨,我是编程概念的新手,我倾向于使用log4j解决问题.所以我正在阅读Log4j教程,在那里我找到了以下代码:

package test;
import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;


public class Log4jExample {

    /* Get actual class name to be printed on */
        static Logger log = Logger.getLogger(Log4jExample.class.getName());
        public static void main(String[] args)throws IOException,SQLException
        {
            log.debug("Hello this is an debug message");
            log.info("Hello this is an info message");
        }

}
Run Code Online (Sandbox Code Playgroud)

但是在eclipse中运行后,我无法找到生成的日志文件.任何人都可以告诉文件被转储到哪里?也帮我从那里我可以从从头学Log4j和Java文档的一些最好的网站.谢谢!!

java eclipse log4j

34
推荐指数
3
解决办法
9万
查看次数

ReplicaSet和ReplicationController有什么区别?

从我在文档中可以看出,a ReplicaSet是在运行时创建的Deployment.它似乎支持一些相同的功能ReplicationController- 扩展/缩小和自动重启,但目前尚不清楚它是否支持滚动升级或自动缩放.

v1.1.8用户指南显示了如何在部署应用程序(自动创建a ReplicaSet)中创建部署,但该kubectl get replicasets命令在v1.2.0之前不可用.我ReplicaSet在文档中找不到任何其他信息.

ReplicaSet最终取代ReplicationController?我为什么要使用DeploymentReplicaSet不是ReplicationController

deployment replicaset kubernetes

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