我的团队正在转向Spring 3.0,有些人想要开始将所有内容都移到Annotations中.当我看到一个类似这样的方法的类时,我的肠道感觉非常糟糕(代码味道?):(只是一个例子 - 不是所有真正的注释)
@Transaction
@Method("GET")
@PathElement("time")
@PathElement("date")
@Autowired
@Secure("ROLE_ADMIN")
public void manage(@Qualifier('time')int time) {
...
}
Run Code Online (Sandbox Code Playgroud)
我只是落后于时代,还是这对所有人来说都是一个可怕的想法?而不是使用诸如继承和多态的OO概念,现在通过约定或通过注释来实现一切.我只是不喜欢它.必须重新编译所有代码来改变IMO配置的东西似乎是错误的.但它似乎是一切(特别是春天)的方式.我应该"克服它"还是应该推回并尝试尽可能地保留我们的代码作为注释?
我正在研究一些JDBC Oracle连接池项目,并遇到了一个名为通用连接池(UCP)的新的(Oracle)Oracle池实现.现在,它使用一个新类PoolDataSource用于连接池,而不是OracleDataSource [启用了缓存选项].我正在讨论是否要切换到这个新的实现,但找不到任何关于修复/升级这些会给我带来什么(如果有的话)的好文档.有人都有经验吗?加号/劣势?谢谢.
我试图权衡设置Content-Length
HTTP标头与使用分块编码从我的服务器返回[可能]大文件的优缺点.需要使用持久连接来满足HTTP 1.1规范中的一个或另一个.我看到Content-Length
标题的优点是:
缺点是必须在返回对象之前计算大小,这并不总是实用并且可能会增加服务器/数据库利用率.分块编码的缺点是在每个块和下载进度条之前添加块大小的开销很小.有什么想法吗?我可能没有想到的两种方法的任何其他HTTP注意事项?
我最近在阅读JRE 6 [ Java VM Options ]中可用的所有JVM参数,并看到了这一点:
-XX:+ StringCache:启用常用分配字符串的缓存.
现在我一直认为Java保留了一个实习池(正确的单词?)字符串,当使用字符串连接时,它不是创建新对象,而是从这个池中提取它们.有没有人曾经使用过这个论点,或者可以解释为什么需要它?
编辑:我试图运行一个基准测试,看看这个参数是否有任何影响,并且无法让Sun JVM识别它.这与:
java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode,
sharing)
Run Code Online (Sandbox Code Playgroud)
所以我不确定这个论点是否有效.
我正试图从Eureka转到Consul进行服务发现并遇到问题 - 我的网关服务注册和我的客户服务注册,但网关服务不会自动将请求路由到客户服务.我在网关控制器中专门定义的路由,使用Feign客户端来正常工作,但之前(使用Eureka)我可以向任何路径发出请求,例如"/ customer-service/blah"(其中customer-service是注册名称)并且网关只是将请求转发到下游微服务.
这是我的网关bootstrap.yml(它在bootstrap而不是应用程序,因为我也使用consul for config)
spring:
application:
name: gateway-api
cloud:
consul:
config:
watch:
wait-time: 30
discovery:
prefer-ip-address: true
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
Run Code Online (Sandbox Code Playgroud) 所以我在生产者/消费者类型应用程序中使用固定大小的BlockingQueue [ArrayBlockingQueue],但我希望用户能够动态更改队列大小.问题是没有BlockingQueue实现允许在创建后更改容量.以前有人见过这个吗?有任何想法吗?
我试图在Kafka 9中使用SimpleConsumer来允许用户从时间偏移重放事件 - 但是我从Kafka收到的消息是一个非常奇怪的编码:
7icf-test-testEvent.ebebf1a4.2911.431d.a138.f5d6db4647d7\?W>8??????{"namespace":"test","type":"testEvent.ebebf1a4.2911.431d.a138.f5d6db4647d7","received":1464819330373,"context":{"userid":0,"username":"testUser"}}?!}?a?????{"namespace":"test","type":"testEvent.ebebf1a4.2911.431d.a138.f5d6db4647d7","received":1464819331637,"context":{"userid":1,"username":"testUser"}}???r?????{"namespace":"test","type":"testEvent.ebebf1a4.2911.431d.a138.f5d6db4647d7","received":1464819332754,"context":{"userid":2,"username":"testUser"}}????????{"namespace":"test","type":"testEvent.ebebf1a4.2911.431d.a138.f5d6db4647d7","received":1464819333868,"context":{"userid":3,"username":"testUser"}}?p=
??????{"namespace":"test","type":"testEvent.ebebf1a4.2911.431d.a138.f5d6db4647d7","received":1464819334997,"context":{"userid":4,"username"
Run Code Online (Sandbox Code Playgroud)
使用KafkaConsumer这个消息解析得很好.这是我用来使用SimpleConsumer检索消息的代码:
for (MessageAndOffset messageAndOffset : fetchResponse.messageSet(topic, partition)) {
long currentOffset = messageAndOffset.offset();
if (currentOffset < readOffset) {
log.debug("Found an old offset - skip");
continue;
}
readOffset = messageAndOffset.nextOffset();
int payloadOffset = 14 + messageAndOffset.message().keySize(); // remove first x bytes, schema Id
byte[] data = messageAndOffset.message().payload().array();
byte[] realData = Arrays.copyOfRange(data, payloadOffset, data.length - payloadOffset);
log.debug("Read " + new String(realData, "UTF-8"));
}
Run Code Online (Sandbox Code Playgroud)
在我不断收到关于字节太高的UTF-32错误之后,我添加了代码以跳过前x个字节,我假设这是因为Kafka会将有关消息大小的信息添加到有效负载中.这是Avro神器吗?
因此,我们使用Spring-Boot编写Java微服务,使用Consul进行服务发现和配置管理,并在Docker容器中运行.所有这一切都在工作,但是当容器死亡或服务重新启动时,即使新容器已注册并显示所有内容,在Consul UI中显示为"失败"之后,旧的service-id永远不会在Consul和服务中消失绿色.
我们没有使用心跳 - 但是我找不到很多关于心跳和健康检查之间的区别的文档.
这是我的bootstrp.yml
spring:
application:
name: my-service
cloud:
config:
enabled: false
consul:
host: ${discovery.host:localhost}
port: ${discovery.port:8500}
config:
watch:
wait-time: 30
delay: 10000
profile-separator: "-"
format: FILES
discovery:
prefer-ip-address: true
instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}}
Run Code Online (Sandbox Code Playgroud)
还有其他设置可以启用心跳,但是文档说明这一点会给Consul集群带来更多压力.
有没有人设法让Consul和Spring Boot/Docker服务实际上自动取消注册?它实际上不会导致任何实际问题,但它使得Consul UI实际上无法监视上/下服务.
有没有办法(没有缓冲整个Inputstream)从Java Servlet获取HttpServletRequest并使用所有NIO将其写入文件?它甚至值得尝试吗?从普通的java.io流中读取并写入java.nio频道是否会更快?或者它们是否真的需要纯粹的NIO才能看到好处?谢谢.
编辑:
所以我只是做了一个快速而又脏的基准测试,从一个磁盘读取文件并写入另一个磁盘(所以我实际上是测试代码而不是磁盘).
Averages:
InputStream -> OutputStream : 321 ms.
FileChannel -> FileChannel : 3 ms.
InputStream -> FileChannel : 600 ms.
Run Code Online (Sandbox Code Playgroud)
实际上我尝试使用混合java.io - > java.nio时性能更差.nio-> nio速度快了很多,但我坚持使用Servlet InputStream.
所以这是我试图解决的问题 - 我有一个带有两个整数字段的对象我想要缓存
public class MyObject {
int x;
int y;
....
}
Run Code Online (Sandbox Code Playgroud)
现在该字段x
是我主要匹配的 - 但是可能存在重复,在这种情况下我想要回到第二个字段(因此this.x = that.x和this.y = that.y).y只能是25个不同的值.现在我知道我可以将两者合并为String并将其用作缓存键,但是我必须尝试x+[25 possible values]
确定它是否不在缓存中 - 使缓存未命中非常昂贵.我正在考虑尝试将a存储List<Integer>
为字段的缓存值x
,然后如果它们超过1,则迭代列表并查找匹配项y
.
现在,如果我使用a ConcurrentList
(或者如果我关心重复项,那么我们现在就忽略它)将多个线程能够添加到它,然后将其放回缓存而没有竞争条件?是否有可能Ehcache可能会将两个不同的列表对象返回到两个线程,然后当他们将新值添加到列表并尝试将其放回缓存时,我可能得到不确定的结果?您是否看到了构建此缓存的更好方法?
编辑:我很欣赏下面的答案,但每个人似乎都错过了重点.这会有用吗?Ehcache实际上可以为同一个cacheKey返回两个不同的对象(比如在调用期间对象是否在磁盘上并且它被序列化两次,每次调用一次).
java ×8
consul ×2
performance ×2
spring-boot ×2
algorithm ×1
annotations ×1
apache-kafka ×1
caching ×1
coding-style ×1
concurrency ×1
docker ×1
ehcache ×1
http ×1
jdbc ×1
jvm ×1
jvm-hotspot ×1
netflix-zuul ×1
nio ×1
oracle ×1
servlets ×1