小编raf*_*ian的帖子

预初始化工作线程池以重用连接对象(套接字)

我需要在Java中构建一个工作池,每个工作者都有自己的连接套接字; 当工作线程运行时,它使用套接字但保持打开以便以后重用.我们决定使用这种方法,因为与临时创建,连接和销毁套接字相关的开销需要太多的开销,所以我们需要一种方法,通过这种方法,工作池预先初始化了它们的套接字连接,准备好在保持套接字资源不受其他线程影响的同时承担工作(套接字不是线程安全的),所以我们需要这些内容......

public class SocketTask implements Runnable {
  Socket socket;
  public SocketTask(){
    //create + connect socket here
  }

  public void run(){
    //use socket here
  }
Run Code Online (Sandbox Code Playgroud)

}

在应用程序启动时,我们想要初始化工作程序,并希望套接字连接在某种程度上......

MyWorkerPool pool = new MyWorkerPool();
for( int i = 0; i < 100; i++)
   pool.addWorker( new WorkerThread());
Run Code Online (Sandbox Code Playgroud)

当应用程序请求工作时,我们将任务发送到工作池以立即执行...

pool.queueWork( new SocketTask(..));
Run Code Online (Sandbox Code Playgroud)


更新了工作代码
根据Gray和jontejj的有用评论,我有以下代码工作...

SocketTask

public class SocketTask implements Runnable {
    private String workDetails;
    private static final ThreadLocal<Socket> threadLocal = 
           new ThreadLocal<Socket>(){
        @Override
        protected Socket initialValue(){
            return new Socket();
        }           
    };

    public SocketTask(String details){ …
Run Code Online (Sandbox Code Playgroud)

java concurrency thread-local threadpool threadpoolexecutor

14
推荐指数
2
解决办法
7123
查看次数

如何在鱼中清空文件?

bash shell脚本中,我通常会运行:> file以清空文件.

现在使用鱼,事情略有不同,上述命令不起作用.

什么是鱼等价物?

fish

13
推荐指数
2
解决办法
582
查看次数

如何使用Netflix eureka和功能区按版本查找服务

我们目前正在探索Netflix的Flux Capacitor来研究它们的微服务架构的实现.目前,我们的兴趣主要集中在服务注册和动态查找功能上.

浏览代码,示例和配置,但有些事情并不清楚; 服务版本控制.如果eureka提供发现服务,而ribbon是基于eureka的REST客户端,那么客户如何说它需要服务1.2服务fooBar?客户端在哪里存储/获取该版本号; 从像本地配置文件,抑或是通过动态地获得的archaius

java cloud netflix service-discovery

13
推荐指数
1
解决办法
4010
查看次数

Redis数据结构设计,用于对基于时间的值进行排序

我正在对数据流执行一些分析并在Redis频道上发布结果.消费者订阅这些频道并获得实时数据馈送.所有历史数据分析结果都将丢失.

现在我想添加在Redis中存储历史数据的功能,以便消费者可以查询这些历史数据(主要是按时间).由于分析结果按时间划分,将结果存储在Redis中的好设计是什么?

database-design redis

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

Groovy,附上函数的名字?

我正在使用Groovy 1.8.4,试图得到封闭函数的名称......

def myFunction() {
  println functionName??
}
Run Code Online (Sandbox Code Playgroud)

我试过delegate,this,owner,Groovy的抱怨没有找到这样的对象.

我也试过Java hack new Exception().getStackTrace()[0].getMethodName(),但那只是打印newInstance0

reflection groovy function introspection

10
推荐指数
3
解决办法
7687
查看次数

如何将groovy的太空船操作员连接起来进行多级排序?

Groovy拥有太空船操作员<=>,提供了一种简单的方法来实现比较.我怎样才能以更加时髦的方式将其链接到下面的代码?在这个例子中,我想首先按价格比较项目,然后按名称比较两个具有相同价格的项目.


class Item implements Comparable {
  int price
  String name

  int compareTo(Item other) {
    int result = price <=> other.price
    if (result == 0) {
      result = name <=> other.name
    }
    return result
  }
}
Run Code Online (Sandbox Code Playgroud)

groovy chaining spaceship-operator

10
推荐指数
1
解决办法
1525
查看次数

用于计算弹性搜索中的索引和类型命中的方面

我正在使用下面的查询在博客索引中找到"开发者"这个词......

http://localhost:9200/blog/_search
{ 
   "query": {
     "query_string": {
        "query": "developer"
      }
    }
}
Run Code Online (Sandbox Code Playgroud)

该查询返回3次点击user和1 次点击post类型,我想要一个方面来反映那些点击显示像...

搜索结果...
博客帖子(1)
用户(3)

...但我不确定如何将一个方面与一个查询结合起来计算这些命中数,因为大多数例子我发现了计数字段命中率; 我尝试使用_index返回索引命中,但无法使其工作; 是否有类似的类型,例如_type,计算索引中的文档类型命中?

indexing faceted-search elasticsearch

9
推荐指数
1
解决办法
3170
查看次数

如何查看已打开套接字连接的进程的线程ID?

我有一个进程,其中多个线程打开多个套接字连接.我想查看此信息并映射哪个线程已打开哪个套接字端口. lsof -inetstatcommand给出进程ID,但无法显示线程ID.是否有打印此信息的命令?

sockets linux multithreading

8
推荐指数
2
解决办法
6919
查看次数

从grails app中的自定义groovy文件加载spring bean

尝试从Grails中的自定义groovy文件加载spring bean 2.3.7.我之前已经问过这个问题,但是经过几个小时的搜索,我无法找到从类路径加载的一致方法.

目标

  • 模块化resources.groovy为多个自定义资源文件
  • 将自定义资源文件放在标准位置: grails-app/conf/spring
  • 使用插件来做魔术; 最小化开销

试了...

//## grails-app/conf/spring/MyBeansConfig.groovy 
beans {
   testsvc(TestService){
      msg = 'hello'
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我正在使用beans {},而不是beans = {},显然它有所不同:

resources.groovy

这有效......

beans = {
  loadBeans 'file:C:\\Proj\Test1\grails-app\\conf\\spring\\MyBeansConfig.groovy'
}
Run Code Online (Sandbox Code Playgroud)

......根据文档,这也应该,但不是:

importBeans("classpath:*MyBeansConfig.groovy")
Run Code Online (Sandbox Code Playgroud)

更新 - 工作选项

(为Grails 2.3.7工作)

选项1:(src/java)

根据lukelazarovic的建议,这种方法有效,因为Grails会自动将groovy文件复制(不编译)src/java到类路径中; 在日食和战争部署中工作正常:

//bean config files here
src/java/MyBeansConfig.groovy
src/java/FooBeansConfig.groovy

//resources.groovy
loadBeans('classpath*:*BeansConfig.groovy')
Run Code Online (Sandbox Code Playgroud)

选项2 :( grails-app/conf/spring)

这种方法允许自定义bean配置文件grails-app/conf/spring(对ideascultormark.esher的信用 )

   //bean config files here …
Run Code Online (Sandbox Code Playgroud)

java grails groovy spring spring-dsl

8
推荐指数
1
解决办法
3775
查看次数

使用事件侦听器作为Java 8 Stream源

快速正脏

是否可以将传统事件侦听器重构为Java 8 Stream,以便侦听器事件成为流源?

很长的故事

客户端提交任意作业,然后侦听结果:

Client client = new JobClient()
client.addTaskListener(this)
client.submitJobAsync( new MultiTaskJob())  //returns void, important (see below)

public void onTaskResult(TaskResult result){
  if(result.isLastResult())
    aggregateJobResults(result)
  else
    processResult(result)
}
Run Code Online (Sandbox Code Playgroud)

问题

对于提交的任何作业,客户端会收到n个结果,但它不知道它将收到多少结果(它用于isLastResult()确定何时停止和聚合).

目标

我想将侦听器重构为"供应商"或类似的东西,例如onTaskResult()流源:

Supplier<TaskResult> taskResultSupplier = 
    () -> Stream.of( .. )   //onTaskResult() feeds this
            .map(result -> {
               if(result.isLastResult())
                 //logic here
             });
Run Code Online (Sandbox Code Playgroud)

像这样的东西; 如果我能在没有客户知道会有多少结果的情况下做到这一点,我就是金色的; 现在,submitJobAsync()返回无效,我想保持这种方式,但我也愿意接受选择......

备择方案

在阅读了Tomasz Nurkiewicz针对类似场景的CompletableFutures之后,假设对客户进行了微小的更改,则存在备用选项:

List<CompletableFuture<TaskResult>> taskFutures = 
  client.submitJobAsync( new MultiTaskJob())
Run Code Online (Sandbox Code Playgroud)

在这里,客户获得一份清单CompletableFutures<TaskResult>,因此我们需要在完成时收集期货的结果:

//processes all task result …
Run Code Online (Sandbox Code Playgroud)

java future java-8 java-stream

8
推荐指数
1
解决办法
2143
查看次数