小编sme*_*eeb的帖子

在Dropwizard Bundle中注册MetricRegistry

我正在创建一个Dropwizard Bundle,可以在我的所有微服务中重用.我想要标准化的一件事是MetricRegistry每个服务使用.

如果我可以MetricRegistry通过简单地在init上添加我的捆绑包来配置每个服务来使用它,那将是很好的,所以类似于:

class Microservice1 extends Application<Microservice1Config> {
    @Override
    void initialize(Bootstrap<Microservice1Config> cfg) {
        // Boom! Standardized metrics/reporters configured and initialized!
        bootstrap.addBundle(new MyBundle())
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是BundleAPI似乎不利于这种行为:

class MyBundle implements Bundle {
    MetricRegistry metricRegistry

    @Override
    void initialize(Bootstrap bootstrap) {

    }

    @Override
    void run(Environment environment) {
        environment.jersey().register(???)
    }
}
Run Code Online (Sandbox Code Playgroud)

由于该register(...)方法没有注册metricRegistry为JAX-RS资源,因此我不知道如何连接,以便将其metricRegistry用于整个微服务中的所有指标.想法?


更新

我正在寻找的是在哪里放置以下内容:

MetricRegistry metricRegistry = new MetricRegistry()
Slf4jReporter slf4jReporter = Slf4jReporter.forRegistry(metricRegistry)
    .convertRatesTo(TimeUnit.SECONDS)
    .convertDurationsTo(TimeUnit.SECONDS)
    .build()

slf4jReporter.start(5, TimeUnit.SECONDS)
Run Code Online (Sandbox Code Playgroud)

java bundle dropwizard codahale-metrics

7
推荐指数
1
解决办法
2203
查看次数

Gradle能以任何方式帮助解决jar地狱吗?

Java 8在这里.

假设有一个旧版本的widgetlibray,带有Maven坐标widgetmakers:widget:1.0.4,其中有一个类,如下所示:

public class Widget {
    private String meow;

    // constructor, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)

岁月流逝.这个widget库的维护者决定一个事实上Widget应该永远不meow应该bark.因此,新版本发布,Maven坐标widgetmakers:widget:2.0.0Widget看起来像:

public class Widget {
    private Bark bark;

    // constructor, getters, setters, etc.
}
Run Code Online (Sandbox Code Playgroud)

所以现在我去构建我的应用程序myapp.而且,想要使用我所有依赖项的最新稳定版本,我声明我的依赖项就像这样(在里面build.gradle):

dependencies {
    compile (
        ,'org.slf4j:slf4j-api:1.7.20'
        ,'org.slf4j:slf4j-simple:1.7.20'
        ,'bupo:fizzbuzz:3.7.14'
        ,'commons-cli:commons-cli:1.2'
        ,'widgetmakers:widget:2.0.0'
    )
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们说,这(虚构的)fizzbuzz图书馆总是对的1.x的版本取决于widget图书馆,在那里Widgetmeow.

所以现在,我widget在我的编译类路径上指定了两个版本:

  1. widgetmakers:widget:1.0.4fizzbuzz作为它的依赖,它被图书馆所吸引; 和 …

java conflicting-libraries dependency-management gradle transitive-dependency

7
推荐指数
1
解决办法
1291
查看次数

在没有UI的情况下设置速度?

我刚刚发现了Speedment,一个基于Java 8 Stream的OR/M库,并且不得不说我喜欢它的想法.没有更疯狂的配置或花费时间筛选900页的休眠文档来找到正确的方法来注释我的类:Speedment只是读取您的数据库,为您生成Java类并为您提供基于流的API来运行针对它们的DDL语句.邪恶酷.

然而,一个大大忌是,它看起来像你必须使用Speedment UI来配置你的数据库连接.此外,文档似乎没有具体说明如何执行以下操作:

  • 指定您希望代码生成哪些表(可能在数据库中有一些您希望为其生成模型的表
  • 执行存储过程
  • 配置内存中缓存

等等.在GitHub上,我似乎无法找到代码如何从UI连接在一起以生成配置对象.只是想知道是否有办法配置Speedment没有UI(可能通过JSON或YAML),如果是,可以使用哪些配置.

orm java-8 java-stream speedment

7
推荐指数
1
解决办法
378
查看次数

Spring Data ExampleMatchers by Example

我试图了解如何使用Spring Data的Query by Example功能,并且正在努力了解如何使用ExampleMatcher它及其各种with*方法.使用匹配器的经典示例包括以下代码段:

Person person = new Person();                          
person.setFirstname("Dave");                           

ExampleMatcher matcher = ExampleMatcher.matching()     
  .withIgnorePaths("lastname")                         
  .withIncludeNullValues()                             
  .withStringMatcherEnding();                          

Example<Person> example = Example.of(person, matcher);
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我无法将我的大脑包裹在这个DSL上.我们Person来自文档中的示例.假设一个Person实体看起来像这样:

// Pseudo code; omitting JPA annotations for this example
public class Person {
    private String firstName;
    private String lastName;
    private Date dob;
    private Long score;

    // Getters, setters & constructor omitted
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我展示如何构建一个ExampleMatcher允许我找到Person符合以下条件的记录的示例:

  • 名字以" Sme " 开头; 和
  • 姓氏长度不超过10个字符; 和
  • 出生日期是1970-01-01之前; 和
  • 得分在10到20之间,包括在内 …

spring query-by-example spring-data spring-data-jpa

7
推荐指数
1
解决办法
6437
查看次数

Akka/Java:处理自定义actor中的多个消息类型?

要在Akka(Java绑定)中实现自己的自定义actor,可以扩展UntypedActor基类.这需要您定义自己的onReceive(...)方法:

@Override
public void onReceive(Object message) {
    // TODO
}
Run Code Online (Sandbox Code Playgroud)

手头的问题是确定一种消息处理策略,使actor能够处理多种类型的消息.一种策略是使用反射/类型.这里的问题是:

  1. 它迫使我们创建空的"shell类",除了为消息赋予语义之外什么都不做(见下文); 和
  2. 它占用message参数并阻止我们传递任何动态或有意义的东西

空shell类的示例:

public class EmptyShellMessage { }
Run Code Online (Sandbox Code Playgroud)

然后在该onReceive方法中看起来像:

@Override
public void onReceive(Class<?> message) {
    if(message.isAssignableFrom(EmptyShellMessage.class)) {
        // TODO
    } else {
        // TODO
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我们不仅创建了一个无用的类,而且由于Object message现在用于确定消息的类/类型,我们不能使用它来包含任何更多的信息,尤其是另一个actor可能的动态/运行时信息想传递它.

有时我会看到这种变化:

@Override
public void onReceive(Object message) {
    if(message instanceof FizzEvent) {
        // TODO
    } else {
        // TODO
    }
}
Run Code Online (Sandbox Code Playgroud)

但在这里我们使用的instanceof许多人认为是一个巨大的反模式(只是谷歌" 反对模式的 …

java messaging akka

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

如何更改Eclipse-Groovy插件Groovy库?

我正在使用随附的Eclipse-Groovy插件的最新版本(2.8.0)groovy-all-2.1.5.jar.我将Guice添加到我的Groovy项目中,当我从Eclipse内部运行它们时,我在控制台输出中收到以下错误:

Caught: java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/typehandling/ShortTypeHandling
java.lang.NoClassDefFoundError: org/codehaus/groovy/runtime/typehandling/ShortTypeHandling
    at net.me.myapp.utils.restclient.RestClient.<init>(RestClient.groovy:57)
    at net.me.myapp.inject.UserServiceClientModule.configure(UserServiceClientModule.groovy:34)
    at com.google.inject.AbstractModule.configure(AbstractModule.java:59)
    at com.google.inject.spi.Elements$RecordingBinder.install(Elements.java:223)
    at com.google.inject.spi.Elements.getElements(Elements.java:101)
    at com.google.inject.internal.InjectorShell$Builder.build(InjectorShell.java:133)
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:103)
    at com.google.inject.Guice.createInjector(Guice.java:95)
    at com.google.inject.Guice.createInjector(Guice.java:72)
    at com.google.inject.Guice.createInjector(Guice.java:62)
    at net.me.myapp.UserServiceClient.<init>(UserServiceClient.groovy:37)
    at net.me.myapp.UserServiceClient.main(UserServiceClient.groovy:45)
Caused by: java.lang.ClassNotFoundException: org.codehaus.groovy.runtime.typehandling.ShortTypeHandling
    ... 12 more
Run Code Online (Sandbox Code Playgroud)

根据这个答案,因为ShortTypeHandling直到2.3.x才添加.所以我现在想附加groovy-all-2.3.3.jar到我的Eclipse项目的类路径.

问题是我似乎没有编辑权限来更改库在Groovy Libraries库中使用的库.当我手动将2.3.3 JAR添加到我的构建路径时,我收到以下错误:

Caught: java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.1.5 and you are trying to load version 2.3.3
Run Code Online (Sandbox Code Playgroud)

我有什么选择?

eclipse groovy eclipse-plugin buildpath eclipse-classpath

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

使用Gradle-Artifactory插件发布子项目

我有以下多项目Gradle构建:

myapp/
    myapp-client/
        build.gradle
        src/** (omitted for brevity)
    myapp-shared/
        build.gradle
        src/** (omitted for brevity)
    myapp-server
        build.gradle
        src/** (omitted for brevity)
    build.gradle
    settings.gradle
Run Code Online (Sandbox Code Playgroud)

其中myapp/build.gradle的样子:

subprojects {
    apply plugin: 'groovy'
    sourceCompatibility = '1.7'
    targetCompatibility = '1.7'
    [compileJava, compileTestJava]*.options*.encoding = 'UTF-8'

    repositories {
        mavenCentral()
        maven {
            // My local/private Artifactory
            url "http://localhost:8081/artifactory/myapp-snapshots"
        }
    }

    dependencies {
        compile (
            'org.codehaus.groovy:groovy-all:2.3.7'
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

目前,3个子项目Gradle文件中的每一个都非常简单:

dependencies {
    compile (
        'org.apache.commons:commons-lang3:3.3.2'
    )
}
Run Code Online (Sandbox Code Playgroud)

这是我想要实现的目标:

  • 当我gradle clean build -Pversion=0.1.5从父myapp目录运行时,我希望所有三个子项目都使用0.1.5的版本构建; 因此myapp-client-0.1.5.jar …

publish artifactory gradle maven

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

Gradle C插件示例

在我的本地文件系统上,我有以下C项目目录结构:

derpus/
    src/
        derpus/
            c/
                derpus.c
            headers/
    build.gradle
Run Code Online (Sandbox Code Playgroud)

在哪里derpus.c:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    puts("Derp!");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我想使用Gradle Native(C)插件来管理derpus构建的全部范围.具体来说,我希望Gradle:

  1. 生成Gradle包装器,以便我可以gradlew用于所有构建调用; 和
  2. 编译并构建derpusderpus.exevia gradlew; 和
  3. 我运行时生成Eclipse项目信息,gradlew eclipse然后我可以将项目导入Eclipse(我已经预安装了Eclipse CDT插件)

这是我的build.gradle:

apply plugin: 'c'
apply plugin: 'eclipse'

sources {
    c {
        source {
            srcDir "src/derpus/c"
            include "**/*.c"
        }
        exportedHeaders {
            srcDir "src/derpus/headers"
        }
    }
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.3'
} …
Run Code Online (Sandbox Code Playgroud)

c eclipse-cdt gradle

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

何时使用各种Akka邮箱类型

我试图了解何时何地使用不同的内置Akka邮箱,以及何时适合自己推出.但是,该页面上没有任何地方可以解释实际上是什么" 有界邮箱 ",或者它与无限邮箱的行为方式不同.此外,该页面将邮箱归类为" 阻止 "与" 非阻止 ".虽然我对它的含义有很强的了解(除非邮箱首先被清空,否则可以将邮件发送到邮箱)我不是百分之百确定我理解这一点.因此,当他们将邮箱归类为有界或阻塞时,我不知道文档是什么意思,我很难告诉我什么时候应该使用每种类型.

此外,如果重新启动该actor,似乎是清除演员邮箱的默认Akka行为.我想阻止这种情况,但不确定解决方案是使用这些内置邮箱类型之一(本页未提及消息持久性)或以某种方式使用持久性actor来实现此类无损.

messaging actor akka

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

Consul等配置工具如何"推送"配置更新到客户端?

有一种新兴的趋势是将全局状态传统的"静态"配置管理工具(例如Chef/Puppet/Ansible)中删除,而是将配置存储在某些集中/分布式工具中,其中主要参与者似乎是:

  • ZooKeeper(Apache)
  • 领事(Hashicorp)
  • 尤里卡(Netflix)

这些工具中的每一个都有不同的工作方式,但原理是相同的:

  • 将这些工具中的env变量和其他动态配置(即可以更改的内容)存储为键/值对
  • 在启动时通过客户端连接到这些工具/服务,并下拉配置KV对.这通常要求客户端提供服务名称(" MY_APP")和环境(" DEV"," PROD"等).

有一个优秀的Consul Java客户端,它可以很好地解释所有这些,并提供了充足的代码示例.

这些工具的理解是,它们建立在Zab,Paxos和Gossip等共识算法的基础之上,这些算法允许配置更新在整个节点中几乎以病毒式传播,最终保持一致.这样的想法存在,如果你有一个myapp有20个节点的应用程序,比如myapp01通过myapp20,如果你做一个配置改变其中之一,这种变化自然会"蔓延"遍及20个节点在一段秒/分钟.

我的问题是:这些更新如何实际部署到每个节点?在任何客户端API(我上面链接的那个,ZooKeeper API或Eureka API)中都没有看到某种回调功能,可以设置并用于在集中服务(例如领事)时通知客户端cluster)想要推送和重新加载配置更新.

所以我问:这应该如何工作(动态配置部署和客户端重装)?虽然Consul的API似乎是最先进的恕我直言,但我对这三种工具中的任何一种都有任何可行的答案感兴趣.

configuration-management consul netflix-eureka apache-zookeeper

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