1、错误:Channel was inactive for too long
(服务器消息较长时间没有消息发送时,客户端会报这个错误)
解决方法:在建立连接的Uri中加入:
jms.activemq.brokerURL=nio://127.0.0.1:61618?tcpNoDelay=true&wireFormat.maxInactivityDuration=0
2、ActiveMQ发送模式
(1)ActiveMQ异步发送,只需新增参数transport.useAsyncSend=true,具体如下:
activeMQ默认情况下就是同步发送
3、错误:The Session is closed(网络异常时客户端会报出这个错误)
解决办法:在建立连接的Uri中加入: maxReconnectDelay=10000
maxReconnectDelay 最大重连间隔
4、ActiveMQ负责均衡
对broker采取了负载均衡和基于共享文件系统的主备配置,这个时候,客户端生产者和消费者的URI中用
failover:(tcp://192.168.1.117:61616,tcp://192.168.1.118:61616,tcp://broker3:61616)
5、ActiveMQ的ACK设置
根据不同的需要可以将ACK设置为Session::CLIENT_ACKNOWLEDGE 或 Session::AUTO_ACKNOWLEDGE 默认为Session::AUTO_ACKNOWLEDGE
如:
if( clientAck )
{
session = connection->createSession( Session::CLIENT_ACKNOWLEDGE);
}
else
{
session = connection->createSession( Session::AUTO_ACKNOWLEDGE);
}
6、ActiveMQ的Topic设置
根据不同的需要可以将Topic设置为Topic或 Queue默认为Queue如:
if(useTopic)
{
destination = session->createTopic(destURI);
}
else
{
destination = session->createQueue(destURI);
}
7、ActiveMQ的DeliveryMode设置(生产者时设置)
根据不同的需要可以将DeliveryMode设置为DeliveryMode::NON_PERSISTENT或 DeliveryMode::PERSISTENT默认为DeliveryMode::NON_PERSISTENT如:
if(usePersistent)
{
producer->setDeliveryMode( DeliveryMode::PERSISTENT);
}
else
{
producer->setDeliveryMode( DeliveryMode::NON_PERSISTENT);
}
8、activemq抛出如下异常:java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:375)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:269)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:226)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:218)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:201)
at java.lang.Thread.run(Thread.java:619)
这是因为用jenkins自动部署时候tomcat关闭连接,但另一边仍在做读取这样的操作造成的。
如果客户端关闭了连接,服务器端要知道这个关闭讯息是有点时间延迟的。这段时间里,
服务器端里会驻留一些连接打开的资源。如果并发量较高,客户端关了较为频繁。那么服务器端的驻留
资源越积累越多,这是个不小的隐患。有可能造成大量的连接被占用,而且同时会占用大量内存。
虽然,最终是会被释放掉。但垃圾收集是有个度量的准则的,如果信息质过大,那么垃圾收集会不堪重负。
如果你的activeMq是连接池分发的,由spring管理的,这里你还要测试下连接池与spring管理连接在高并发下是否
存在问题。
}
8、activemq抛出如下异常:java.io.EOFException
at java.io.DataInputStream.readInt(DataInputStream.java:375)
at org.apache.activemq.openwire.OpenWireFormat.unmarshal(OpenWireFormat.java:269)
at org.apache.activemq.transport.tcp.TcpTransport.readCommand(TcpTransport.java:226)
at org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:218)
at org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:201)
at java.lang.Thread.run(Thread.java:619)
这是因为用jenkins自动部署时候tomcat关闭连接,但另一边仍在做读取这样的操作造成的。
如果客户端关闭了连接,服务器端要知道这个关闭讯息是有点时间延迟的。这段时间里,
服务器端里会驻留一些连接打开的资源。如果并发量较高,客户端关了较为频繁。那么服务器端的驻留
资源越积累越多,这是个不小的隐患。有可能造成大量的连接被占用,而且同时会占用大量内存。
虽然,最终是会被释放掉。但垃圾收集是有个度量的准则的,如果信息质过大,那么垃圾收集会不堪重负。
如果你的activeMq是连接池分发的,由spring管理的,这里你还要测试下连接池与spring管理连接在高并发下是否
存在问题。