由于它提供的速度和可扩展性,我正在启动一个我认为特别适合MongoDB的项目.
我目前感兴趣的模块是与实时聊天.如果我在传统的RDBMS中这样做,我会把它分成:
这个用例的目的,我想假设一次有5个通道活动,每个通道每秒最多处理5个消息.
需要快速的特定查询:
请记住MongoDB的文档限制是4mb,您将如何设计模式?你会是什么样的?有什么问题需要注意吗?
刚刚开始JMS ActiveMQ Acknowledgements着手在Spring工作.到目前为止,我有一个完美的消费者工作,除了当我不确认消息时,它仍然从队列中取出(我希望它留在那里或以死信队列结束).
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jms="http://www.springframework.org/schema/jms"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd">
<!-- A JMS connection factory for ActiveMQ -->
<bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"
p:brokerURL="failover://(tcp://jms1:61616,tcp://jms2:61616)?randomize=false&jms.redeliveryPolicy.maximumRedeliveries=5" />
<!-- A POJO that implements the JMS message listener -->
<bean id="simpleMessageListener" class="com.company.ConsumerClass" />
<!-- A JMS namespace aware Spring configuration for the message listener container -->
<jms:listener-container
container-type="default"
connection-factory="connectionFactory"
acknowledge="client"
concurrency="10-50"
cache="consumer">
<jms:listener destination="someQueue" ref="simpleMessageListener" method="onMessage" />
</jms:listener-container>
</beans>
Run Code Online (Sandbox Code Playgroud)
在ConsumerClass中,我的简单消费者看起来像这样:
@Override public final void onMessage(Message message) {
Object postedMessage = null; …Run Code Online (Sandbox Code Playgroud) 查看JMS队列并获取其中的所有消息的最佳方法是什么?
如何计算队列中的消息数?
谢谢.
以下是1.5.2演示问题的简单弹簧启动项目(版本):
https://github.com/lanwen/camel-jms-activemq-test
它有Apache Camel版本2.18.3
在分支上master一切正常,因为activemq-camel=5.14.4和camel-jms=2.16.3(从它传递)
Spring启动应用程序正常启动日志:
2017-04-22 00:53:19.647 INFO 97217 --- [ main] o.a.camel.spring.SpringCamelContext : Apache Camel 2.18.3 (CamelContext: camel-1) is starting
2017-04-22 00:53:19.662 INFO 97173 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.14.4 (localhost, ID:lanwen-osx3.local-62145-1492811599544-0:1) is starting
2017-04-22 00:53:19.665 INFO 97173 --- [ main] o.apache.activemq.broker.BrokerService : Apache ActiveMQ 5.14.4 (localhost, ID:lanwen-osx3.local-62145-1492811599544-0:1) started
2017-04-22 00:53:19.665 INFO 97173 --- [ main] o.apache.activemq.broker.BrokerService : For help or more information please see: …Run Code Online (Sandbox Code Playgroud) 我有一个非常标准的设置JMS- Spring Boot和ActiveMQ.它工作正常,直到我尝试进行简单的集成测试.经过一些调查后,我发现在第一个JMS消息被消耗后,Spring上下文和嵌入式代理都被关闭,无论消费过程中是什么,都会触发另一个事件.经纪人问题我能够通过useShutdownHook=false在测试设置中添加连接选项来解决,即
spring.activemq.broker-url = vm://broker?async=false&broker.persistent=false&broker.useShutdownHook=false
Run Code Online (Sandbox Code Playgroud)
我正在寻找的基本上是一种强制测试"保持活力"的方法,直到消耗掉所有JMS消息(在这种情况下它们只是两个).我理解整个设置的异步性质,但是在测试期间,生成和使用这些消息的所有结果会很有帮助.
下面是我的设置,虽然它很简单.
@EnableJms
public class ActiveMqConfig {
@Bean
public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory, MessageConverter messageConverter) {
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
jmsTemplate.setMessageConverter(messageConverter);
return jmsTemplate;
}
@Bean
public MessageConverter messageConverter() {
MappingJackson2MessageConverter messageConverter = new MappingJackson2MessageConverter();
messageConverter.setTargetType(MessageType.TEXT);
messageConverter.setTypeIdPropertyName("_type");
return messageConverter;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一个消息驱动的POJO,它监听给定的事件:
@JmsListener(destination = "events")
public void applicationSubmitted(MyType event) {
// do some work with the event here
jmsTemplate.convertAndSend("commands", mymessage);
}
Run Code Online (Sandbox Code Playgroud)
还有一个:
@JmsListener(destination = "commands")
public void onCommand(TextMessage …Run Code Online (Sandbox Code Playgroud) 因此,我的公司在foxpro数据库中存储了大量数据,并试图绕过直接触摸它的性能,我正在考虑发送任何可以异步完成的消息,以获得更快捷的用户体验.我开始关注ActiveMQ,但不知道C#将如何与它挂钩.想听听你们所有人的想法.
编辑:它将成为一个Web应用程序.触摸这个foxpro的任何东西都有点慢(可能是因为10年前设置它的人把它搞得一团糟,一些表文件非常大).我们每晚都会将foxpro复制到sql,我们的大部分数据都是正常的,所以我们专注于写入.加上写入会影响用户体验(购买)的关键部分,我们将其存储在sql中,然后只是消息将它放入foxpro中.我希望我们可以摆脱foxpro,不幸的是,该公司不想摆脱他们购买的非常旧的软件,这取决于它.
我一直在使用JMS和ActiveMQ.一切都在创造奇迹.我不是用春天,也不是我.
界面javax.jms.MessageListener只有一种方法onMessage.在实现中,有可能抛出异常.如果事实上抛出异常,那么我说消息没有正确处理,需要重新尝试.所以,我需要ActiveMQ等待一段时间,然后重试.即我需要抛出异常来回滚JMS事务.
我怎样才能完成这样的行为?
也许ActiveMQ中有一些我无法找到的配置.
或者......也许可以取消MessageListener向消费者注册并自己消费消息,如下所示:
while (true) {
// ... some administrative stuff like ...
session = connection.createSesstion(true, SESSION_TRANSACTED)
try {
Message m = receiver.receive(queue, 1000L);
theMessageListener.onMessage(m);
session.commit();
} catch (Exception e) {
session.rollback();
Thread.sleep(someTimeDefinedSomewhereElse);
}
// ... some more administrative stuff
}
Run Code Online (Sandbox Code Playgroud)
在几个线程中,而不是注册监听器.
或者......我可以以某种方式装饰/ AOP /字节操纵MessageListeners来自己做.
你会采取什么途径?为什么?
注意:我没有完全控制MessageListeners代码.
编辑 概念证明的测试:
@Test
@Ignore("Interactive test, just a proof of concept")
public void transaccionConListener() throws Exception {
final AtomicInteger atomicInteger = …Run Code Online (Sandbox Code Playgroud) 如何使用Java获取ActiveMQ中的队列长度(发送到队列的未消耗消息的数量)?
我阅读了今年UberConf的幻灯片,其中一位发言人提出Spring JMS为您的消息队列系统增加了性能开销的论点,但我没有看到任何证据支持幻灯片.发言者还说明点对点比传统的"发布 - 订阅"方法更快,因为每个消息只发送一次而不是广播给每个消费者.
我想知道是否有经验丰富的Java消息传递专家可以在这里权衡并澄清一些技术细节:
我正在处理的应用程序需要与远程位置的IBM MQ服务器进行通信.我们目前有一个使用活动MQ的工作系统,它使用代理,以及连接到这个远程IBM MQ服务器的桥,并且工作正常.
由于一些新的增强,我们现在尝试使用IBM客户端jar而不是Active MQ来实现相同的功能.
我面临的问题是我可以连接到远程服务器的inboundQ并发送消息.但我总是从远程服务器出站队列接收null.但我无法检查是否在远程位置收到了消息.但是,如果通过旧的ActiveMQ系统发送相同的消息将从远程MQ服务器获得响应.
旧的Active MQ在内部使用桥连接到远程IBM MQ服务器,该服务器的配置与我正在使用的新代码完全相同.
我已尝试从互联网和堆栈溢出本身的多个代码,并始终我能够连接但没有得到任何响应.
此外,尝试从远程IBM MQ发送或接收时,我没有收到任何错误或异常.
我将粘贴一个我试图开始工作的示例代码.我在代码中更改了一些配置值.
我怀疑如下.
我正在做的就是将IBM MQ客户端jar复制到应用程序中,并使用代码将消息发送到远程MQ.我还没有安装任何其他应用程序.这样的系统会工作还是应该总是有一些像活动MQ这样的中间程序?
相同的代码能够从我在本地网络中安装但未能从远程服务器获得响应的IBM MQ服务器发送和接收?这让我相信如果我在配置中遗漏了什么?除了在代码中还应该配置什么?
我看到没有错误或例外.始终发送消息但响应为空.我没有看到任何用户名密码或公钥 - 私钥认证的使用.是否通常使用任何身份验证来检查源.?
我正在使用IBM MQ客户端5.3版本,我知道它已经过时了.但是使用它,因为它们工作的主动MQ设置使用相同的并且正常工作.我无法知道远程计算机上的IBM MQ服务器上存在哪个版本.如果我们使用与服务器MQ版本不同的客户端MQ版本,是否存在问题.?
在本地环境中适用于我的示例代码,即能够从我在本地网络中的另一台机器上安装的IBM MQ服务器发送和接收.当我尝试将其与远程IBM MQ服务器一起使用时,相同的代码将获取null响应.
import javax.jms.*;
import javax.jms.JMSException;
import com.ibm.mq.jms.*;
import com.ibm.jms.JMSMessage;
import javax.jms.TextMessage;
public class SendReceive {
private MQQueueConnectionFactory connectionFactory;
private MQQueueConnection connection;
private void runTest() {
try {
connect();
connection.start();
MQQueueSession session = (MQQueueSession) connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MQQueue queue = (MQQueue) session.createQueue("INBOUND_QUEUE"); /* values replaced with correct values in deployment server */
MQQueue queue2 = (MQQueue) …Run Code Online (Sandbox Code Playgroud) activemq-classic ×10
jms ×8
java ×6
messaging ×3
spring ×2
apache-camel ×1
c# ×1
ibm-mq ×1
mongodb ×1
nosql ×1
rabbitmq ×1
spring-boot ×1
transactions ×1