小编for*_*has的帖子

在卡夫卡创造了多少生产商?

在大量实时Java Web应用程序中,我正在向apache kafka发送消息.目前我正在发送一个主题,但将来我可能需要向多个主题发送消息.

在这种情况下,我不确定每个主题创建一个制作人的天气,还是我应该使用单个制作人来处理我的所有主题?

这是我的代码:

props = new Properties();
props.put("zk.connect", <zk-ip1>:<2181>,<zk-ip3>:<2181>,<zk-ip3>:<2181>);
props.put("zk.connectiontimeout.ms", "1000000");
props.put("producer.type", "async");

Producer<String, Message> producer = new kafka.javaapi.producer.Producer<String, Message>(new ProducerConfig(props));

ProducerData<String, Message> producerData1 = new ProducerData<String, Message>("someTopic1", messageTosend);
ProducerData<String, Message> producerData2 = new ProducerData<String, Message>("someTopic2", messageTosend);

producer.send(producerData1);
producer.send(producerData2);
Run Code Online (Sandbox Code Playgroud)

如您所见,一旦创建了生产者,我就可以使用它将数据发送到不同的主题.我想知道什么是最佳做法?如果我的应用程序发送到多个主题(每个主题获得不同的数据)可以/我应该使用单个生产者还是应该创建多个生产者?什么时候(一般来说)我应该使用多个生产者?

java apache-kafka

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

杰克逊地图序列化模块

我有一个包含Map(带非String键)和其他一些字段的Class.

public class MyClass() {
    private Map<KeyObject, OtherObject> map;
    private String someField;

    public MyClass(Map<KeyObject, OtherObject> map, String someField) {
        this.map = map;
        this.someField = someField;
    }

    // Getters & Setters
}
Run Code Online (Sandbox Code Playgroud)

我想使用Jackson对这个类进行序列化和反序列化.我看到了不同的方法,并决定尝试使用jackson模块.

我按照这篇文章并扩展了JsonDeserializer和JsonSerializer.问题是应该键入这些类,所以看起来应该是这样的

public class keyDeserializer extends JsonDeserializer<Map<KeyObject, OtherObject>> {
...
}
Run Code Online (Sandbox Code Playgroud)

KeySerializer也是如此.

然后添加到模块:

module.addSerializer(new keySerializer());
module.addDeserializer(Map.class, new keyDeserializer());
Run Code Online (Sandbox Code Playgroud)

但这显然是错误的,因为我得到了一个例外:

keySerializer does not define valid handledType() -- must either register with method that takes type argument  or make serializer extend 'org.codehaus.jackson.map.ser.std.SerializerBase'
Run Code Online (Sandbox Code Playgroud)

我可以将我的序列化器和反序列化器输入MyClass,但后来我必须手动解析所有这些,这是不合理的.

更新:

我设法通过使用注释绕过代码中的模块创建 …

java serialization map jackson jackson-modules

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

Google Guice Properties Management

我想在java webapp中创建一个适当的属性管理策略,在google guice上作为DI框架进行中继.

我想有一个机制来回答以下3个要求:

  • 我希望能够使用guice注入属性(@Named)
  • 我希望能够以静态方式访问属性
  • 该机制应该支持属性的优先级,这意味着属性可以在已部署的战争中以特定值包装,但在目标系统级别或本地文件系统(我部署的目标机器)上也可能是冗余的,在这种情况下例如,战争中的值将被目标机器中存在的值覆盖.

我相信这是标准要求.现在,使用guice标准活页夹我可以轻松获得第一个要求,但不能获得其他两个要求.为了获得另外两个,我创建了自己的类来执行以下操作:

  • 包装并公开guice的绑定方法(绑定属性的绑定方法)例如:

public static void bindString(AnnotatedBindingBuilder<String> binder, String property, String defaultValue) { binder.annotatedWith(Names.named(property)).toInstance(getProperty(property, defaultValue)); }

getProperty方法知道如何处理我的属性(从war或系统级别获取值)并静态公开属性.

所以基本上只要我使用我为属性绑定创建的这个实用程序我很好,它涵盖了我的所有要求但是一旦我使用标准的guice绑定,我就失去了第二和第三个要求.

有没有办法覆盖guice绑定并获得所有这3个要求?

一旦我在一个基于弹簧的应用程序中有相同的挑战,并且很容易.我使用以下方法实现了ApplicationContextInitializer:

@Override public void initialize(ConfigurableWebApplicationContext ctx) { PropertySource<Map<String, Object>> localProps = null; try { localProps = new ResourcePropertySource(new ClassPathResource(LOCAL_PROPERTIES_FILE_NAME)); } catch (IOException e) { LOG.fatal("Could not load local properties from classpath " + LOCAL_PROPERTIES_FILE_NAME); return; } LOG.info("Loaded configuration from classpath local file " + LOCAL_PROPERTIES_FILE_NAME); ctx.getEnvironment().getPropertySources().addFirst(localProps); }

所以这给了我一种方法来为我的环境添加具有最高优先级的本地属性.如果与war属性重叠,则本地属性具有更高的优先级.另外,我静态地暴露了我的环境,因此我可以静态访问我的属性(对于不是由容器管理的服务,主要是遗留的).

我如何用guice实现这一目标?

java dependency-injection properties guice

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

将java BitSet保存到DB

使用JPA,我希望能够将BitSet保存到数据库并将其拉回到程序中.

假设我有:

@Entity
@Table(name = "myTable")
public class MyClass {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "Object_Id")
    protected long id;

    @Column(name = "Tags")
    protected BitSet tags;

... getters & setters etc...
}
Run Code Online (Sandbox Code Playgroud)

还应该定义"columnDefinition"吗?我真的不明白它是如何持久的(使用toString()?)而且它是如何从数据库中加载回来的.

你能帮帮我一下吗?

谢谢!

java persistence jpa bitset

6
推荐指数
2
解决办法
2210
查看次数

在Mysql上使用ddl模式生成时,未生成ON DELETE CASCADE选项

在Tomcat Web应用程序上运行的Maven-Spring-Hibernate-MySql中,我正在使用hibernate ddl来生成MySQL5InnoDBDialect的数据库模式.

除了外键的级联选项之外,生成的模式很好.例如,我有这样的结构:

保存用户详细信息对象的用户对象,两者共享相同的密钥:

@Entity
@Table(name = "Users")
public class User implements Serializable {

    private static final long serialVersionUID = -359364426541408141L;

    /*--- Members ---*/

    /**
     * The unique generated ID of the entity.
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "User_Id")
    protected long id;

    @Getter
    @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "user", optional = true)
    protected UserDetails userDetails;

...

}
Run Code Online (Sandbox Code Playgroud)

而用户详细信息:

@Entity
@Table(name = "UserDetails")
public class UserDetails implements Serializable {

    private static final long serialVersionUID = …
Run Code Online (Sandbox Code Playgroud)

mysql hibernate cascade hbm2ddl cascading-deletes

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

kafka生产者单元测试(java)

用kafka(java代码)做我的第一步我想为kafka生成器创建一个简单的测试,像这样我可以模拟动物园饲养员(这个实现看起来不错,但我无法到达那里的一些类,特别是EmbeddedZookeeper和TestUtils).

有任何想法吗?

java unit-testing apache-kafka apache-zookeeper

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

ThreadPoolTask​​Executor 执行策略

我正在使用 spring 的抽象 ThreadPoolTask​​Executor 来使用线程执行任务。

执行方法描述为(java doc):

执行给定的任务。如果实现使用异步执行策略,调用可能会立即返回,或者在同步执行的情况下可能会阻塞。

有2个问题:

  1. 哪里可以配置执行策略?
  2. 如果执行策略设置为“同步”,它如何为我服务?使用同步工作的执行器似乎很奇怪。

spring executorservice threadpoolexecutor

6
推荐指数
0
解决办法
595
查看次数

log4j DB附加程序引发异常

我在我的log4j.properties文件中添加了一个数据库附加程序:

log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DB.URL=jdbc:mysql://${db.url}/mydb
log4j.appender.DB.driver=com.mysql.jdbc.Driver
log4j.appender.DB.user=user
log4j.appender.DB.password=password
log4j.appender.DB.sql=INSERT INTO logs (Date, Logger, Priority, Message) VALUES ('%d', '%c', '%p', '%m')
log4j.appender.DB.layout=org.apache.log4j.PatternLayout
log4j.appender.DB.threshold=INFO
Run Code Online (Sandbox Code Playgroud)

这是我的表格的样子:

CREATE TABLE `logs` (
  `Id` bigint(20) NOT NULL AUTO_INCREMENT,
  `Date` varchar(30) NOT NULL,
  `Logger` varchar(128) NOT NULL,
  `Priority` varchar(10) NOT NULL,
  `Message` varchar(4096) NOT NULL,
  PRIMARY KEY (`Id`)
Run Code Online (Sandbox Code Playgroud)

部署应用程序后,启动tomcat时,我看到以下异常:

log4j:ERROR Failed to excute sql
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use …
Run Code Online (Sandbox Code Playgroud)

sql spring log4j

5
推荐指数
1
解决办法
1915
查看次数

嘲弄Couchbase

我有一个基于Java的数据访问层,可以与Couchbase进行交互.为了将单元测试应用于该层,我想模拟Couchbase.

浏览网络我遇到了这个项目,它也在GitHub托管.我想用它,但遗漏了一些基本的例子.

也许有人之前尝试过,可以为我提供一些Java的基本用法?

java mocking couchbase

5
推荐指数
1
解决办法
3448
查看次数

heroku 中的 Java 版本错误

我创建了一个 spring boot 应用程序,并希望在heroku上运行它。我的应用程序是使用 java 9 编译的。

当我使用CLI 插件将它部署到 heroku 时,我得到了

Exception in thread "main" java.lang.UnsupportedClassVersionError: io/safeblocks/firewall/FirewallApplication has been compiled by a more recent version of the Java Runtime (class file version 53.0), this version of the Java Runtime only recognizes class file versions up to 52.0
Run Code Online (Sandbox Code Playgroud)

显然,这意味着 Java 版本不匹配。我按照说明system.properties文件添加到我的资源文件夹中java.runtime.version=9 但仍然出现相同的错误。

当我运行命令时,heroku run java -version --app myApp 我得到:

openjdk version "1.8.0_171-heroku"
OpenJDK Runtime Environment (build 1.8.0_171-heroku-b11)
OpenJDK 64-Bit Server VM …
Run Code Online (Sandbox Code Playgroud)

heroku spring-boot java-9

5
推荐指数
1
解决办法
834
查看次数