在工作中,我们在尝试将大数除以1000时发现了一个问题.这个数字来自数据库.
说我有这个方法:
private static BigDecimal divideBy1000(BigDecimal dividendo) {
if (dividendo == null) return null;
return dividendo.divide(BigDecimal.valueOf(1000), RoundingMode.HALF_UP);
}
Run Code Online (Sandbox Code Playgroud)
当我拨打以下电话时
divideBy1000(new BigDecimal("176100000"))
Run Code Online (Sandbox Code Playgroud)
我收到176100的预期值.但是,如果我尝试下面这一行
divideBy1000(new BigDecimal("1761e+5"))
Run Code Online (Sandbox Code Playgroud)
我收到价值200000.为什么会这样?这两个数字是相同的,具有不同的表示,最新的是我从数据库收到的.我知道,不知何故,JVM将数字1761除以1000,向上舍入并在最后填充0.
避免这种行为的最佳方法是什么?请记住,原始号码不受我控制.
我有spring的配置和一个完整的功能stomp代理(activemq):
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
private static Logger LOG = org.slf4j.LoggerFactory.getLogger(WebsocketConfig.class);
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableStompBrokerRelay("/topic/", "/queue/");
config.setApplicationDestinationPrefixes("/app");
config.setUserDestinationPrefix("/user");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/socket").withSockJS();
}
}
Run Code Online (Sandbox Code Playgroud)
天真地,我虽然spring使用了我当前的activemq配置,但实际上它尝试使用默认的stomp端口连接到localhost中的服务器.我发现可以通过输入以下内容来更改此配置:
config.enableStompBrokerRelay("/topic/", "/queue/")
.setRelayHost("activeMQHOST")
.setRelayPort(9999);
Run Code Online (Sandbox Code Playgroud)
多数民众赞成,但目前我有两个经纪人的故障转移设置(master/flave with shared file system).如何为stomp broker relay配置这样的设置?
如果不可能,我想在以下解决方案中:
第二种选择是可取的吗?
我正在开发一个使用activemq来交换消息的应用程序,有些很大,我想取消它.
我们使用activemq故障转移传输与两个ActiveMQ实例(主/从).代理本身对消息具有100mb帧大小限制.
问题是:如果我尝试发送大于100mb的消息,ActiveMQ服务器将关闭连接.此时,故障转移传输将尝试重新连接并再次发送消息,从而创建无限循环.
客户端记录以下内容:
2017-01-05 09:19:11.910 WARN 14680 --- [0.1:61616@57025] o.a.a.t.failover.FailoverTransport : Transport (tcp://localhost:61616) failed , attempting to automatically reconnect: {}
java.io.EOFException: null
at java.io.DataInputStream.readInt(DataInputStream.java:392) ~[na:1.8.0_91]
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:267) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:240) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:232) ~[activemq-client-5.13.4.jar:5.13.4]
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215) ~[activemq-client-5.13.4.jar:5.13.4]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]
2017-01-05 09:19:11.921 INFO 14680 --- [ActiveMQ Task-1] o.a.a.t.failover.FailoverTransport : Successfully reconnected to tcp://localhost:61616
2017-01-05 09:19:11.923 WARN 14680 --- [0.1:61616@57026] o.a.a.t.failover.FailoverTransport : Transport (tcp://localhost:61616) failed , attempting to automatically reconnect: {}
java.io.EOFException: null
at java.io.DataInputStream.readInt(DataInputStream.java:392) ~[na:1.8.0_91]
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:267) ~[activemq-client-5.13.4.jar:5.13.4]
at …
Run Code Online (Sandbox Code Playgroud) 我正在体验我正在制作的工具的akka远程功能.实际上,我能够使核心和远程系统在具有不同端口的同一主机中工作.请注意,我的远程服务器在路由器上运行,如akka文档中所述.
现在我正在尝试使用几个azure虚拟机来进行更好的实验,但我遇到了一些问题.
核心应用程序具有以下配置(出于安全原因,我已更改了一些名称):
akka.actor.deployment {
/querierActor/querierPool {
router = round-robin-pool
nr-of-instances = 12
target.nodes = [
"akka.tcp://SYSTEM@remote-srv01.cloudapp.net:2560"
,"akka.tcp://SYSTEM@remote-srv02.cloudapp.net:2560"
,"akka.tcp://SYSTEM@remote-srv03.cloudapp.net:2560"
]
}
}
// remote configuration. Use it for multiple machines calculation
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote {
enabled-transports = ["akka.remote.netty.tcp"]
netty.tcp {
maximum-frame-size = 100MiB
port = 2552
hostname = "0.0.0.0"
}
}
}
Run Code Online (Sandbox Code Playgroud)
远程主机具有以下配置:
akka.actor.deployment {
/querierActor/querierPool {
router = balancing-pool
nr-of-instances = 15
}
}
akka {
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
remote …
Run Code Online (Sandbox Code Playgroud) 我有一个模板系统,在某些例外情况下,必须在将DOM元素附加到DOM后删除它们.
我通常用我拥有的模板字符串创建一个jquery对象.例:
var template = "<div><div class='itenToRemove'>REMOVE!</div><div>DO NOT REMOVE!</div></div>"
var $elementToAppend = $(template);
Run Code Online (Sandbox Code Playgroud)
但有时我需要删除元素的某些部分,比如
$elementToAppend.remove('.itenToRemove')
Run Code Online (Sandbox Code Playgroud)
但它不起作用!为什么不?显然,只有DOM上已经插入的元素才能使用remove方法.
我创建了一个说明我问题的jsFiddle:https://jsfiddle.net/raphaeldovale/mz6Lrrbh/1/
我正在为一个应用程序制作原型,以测试将来的应用程序的Spring消息传递功能。
我知道我们需要做的一件事是在同一应用程序中处理来自activemq的主题和队列。因此,在同一个bean中,我应该有一个@JmsListener注释的方法,该方法将听到一个队列,而另一个将听到一个主题。那可能吗?
什么是更简单的方法?我看到一些答案使用带有弹簧JMS主题像这一个,但在这种情况下我想我需要创建两个使用DefaultMessageListenerContainer,一个是话题,另一个用于队列。这是最好的解决方案?
有没有针对此问题的注释方法?
java ×4
jms ×2
spring ×2
spring-jms ×2
akka ×1
akka-cluster ×1
azure ×1
bigdecimal ×1
failover ×1
html ×1
javascript ×1
jquery ×1
stomp ×1
websocket ×1