如何使用Java获取ActiveMQ中的队列长度(发送到队列的未消耗消息的数量)?
我阅读了今年UberConf的幻灯片,其中一位发言人提出Spring JMS为您的消息队列系统增加了性能开销的论点,但我没有看到任何证据支持幻灯片.发言者还说明点对点比传统的"发布 - 订阅"方法更快,因为每个消息只发送一次而不是广播给每个消费者.
我想知道是否有经验丰富的Java消息传递专家可以在这里权衡并澄清一些技术细节:
如何使用JMS进行单元测试?这是事实吗?
我google了一些东西 - JMS的单元测试:http ://activemq.apache.org/how-to-unit-test-jms-code.html - jmsTemplate:activemq.apache.org/jmstemplate-gotchas.html - mockRunner:mockrunner .sourceforge.net /
你对我有什么好的经验和建议吗?
Apache ActiveMQ与Apache ActiveMQ Apollo有什么区别?
Apollo文档说:"ActiveMQ Apollo是一个更快,更可靠,更易于维护的消息代理,它是从原始ActiveMQ的基础构建的.它使用完全不同的线程和消息调度架构来实现这一点."但是没有java样本代码和良好的用户指南.
有人在实时环境中使用ApacheActiveMQApollo吗?对原始ActiveMQ做得更好吗?
我有java 1.6,maven 2,activeMQ 5.5和testng功能测试.当我在Idea中启动它然后确定,但是当我尝试使用maven从控制台启动它们然后在尝试通过activeMQ发送消息后进程暂停,并且在一段时间后崩溃并在日志中出现以下错误:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006d92f7a6, pid=5716, tid=7000
#
# JRE version: 6.0_27-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (20.2-b06 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x9f7a6]
#
# If you would like to submit a bug report, please visit:
# http://java.sun.com/webapps/bugreport/crash.jsp
#
--------------- T H R E A D ---------------
Current thread (0x00000000072b6000): JavaThread "ActiveMQ Transport: …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我添加了两个不同的JmsListener但是当我在ActiveMQ面板中运行项目时,只有其中一个主题有消费者!
那么我应该为每个JmsListener添加单独的jmsListenerContainerFactory配置吗?
@JmsListener(destination = "foo1")
public void foo1(final Message jsonMessage) throws JMSException {
...
}
@JmsListener(destination = "foo2")
public void foo12(final Message jsonMessage) throws JMSException {
...
}
Run Code Online (Sandbox Code Playgroud)
编辑:这是来自JMS配置文件:
@Configuration
@EnableJms
public class FooJmsConfig {
@Bean
public ActiveMQConnectionFactory connectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(BROKER_URL);
connectionFactory.setPassword(BROKER_USERNAME);
connectionFactory.setUserName(BROKER_PASSWORD);
connectionFactory.setUseCompression(true);
connectionFactory.setClientID("FPP_API");
connectionFactory.setConnectionIDPrefix("DRR");
connectionFactory.setUseAsyncSend(true);
return connectionFactory;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
return factory;
}
}
Run Code Online (Sandbox Code Playgroud) 我需要队列来强制执行不重复的策略.可能吗?如果是这样,怎么样?(我一直在谷歌搜索几个小时......)
编辑:
ActiveMQSession实现有以下几行:
// transform to our own message format here
ActiveMQMessage msg = ActiveMQMessageTransformation.transformMessage(message, connection);
// Set the message id.
if (msg == message) {
msg.setMessageId(new MessageId(producer.getProducerInfo().getProducerId(), sequenceNumber));
} else {
msg.setMessageId(new MessageId(producer.getProducerInfo().getProducerId(), sequenceNumber));
message.setJMSMessageID(msg.getMessageId().toString());
}
Run Code Online (Sandbox Code Playgroud)
ActiveMQMessageTransformation是可插入的(您可以设置它),但以下if语句是一个相当无可争议的.
任何想法,除了改变他们的代码?
我在ActiveMQ页面中读到,使用JMX我们可以监视activemq中的队列.如果队列在ActiveMQ中有消息(深度高)或服务间隔很高,我们如何得到通知.在unix环境中不使用任何shell脚本.是否可以通过Java程序?如果是的话,请给我一些想法来完成这项工作.
我在几个例子中注意到,使用camel配置activemq的常用方法是使用以下bean.我想知道Spring Boot是否已经默认配置了这些bean.我知道如果activemq jar在类路径上,则会创建一个默认的连接工厂,但是下面的内容呢?
<bean id="jmsConnectionFactory"
class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="tcp://localhost:61616"/>
</bean>
<bean id="pooledConnectionFactory"
class="org.apache.activemq.pool.PooledConnectionFactory"
init-method="start" destroy-method="stop">
<property name="maxConnections" value="8"/>
<property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
<bean id="jmsConfig"
class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="concurrentConsumers" value="10"/>
</bean>
<bean id="jms"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig"/>
<property name="transacted" value="true"/>
<property name="cacheLevelName" value="CACHE_CONSUMER"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
要么
@Bean
public ActiveMQConnectionFactory getConnectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(brokerURL);
return connectionFactory;
}
@Bean(initMethod = "start", destroyMethod = "stop")
public PooledConnectionFactory getPooledConnectionFactory() {
PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory();
pooledConnectionFactory.setMaxConnections(maxConnections);
pooledConnectionFactory.setConnectionFactory(getConnectionFactory());
return pooledConnectionFactory;
} …Run Code Online (Sandbox Code Playgroud) activemq-classic ×10
java ×6
jms ×6
apache-camel ×1
apollo ×1
fatal-error ×1
jmstemplate ×1
jmx ×1
maven ×1
messaging ×1
mocking ×1
monitoring ×1
queue ×1
spring ×1
spring-boot ×1
testng ×1
unit-testing ×1