我遇到以下设置问题:
Java应用程序将电子邮件msg发送到JMS队列,然后侦听队列的MDB使用onMessage方法获取电子邮件msg,它在Gmail SMTP上打开连接,将电子邮件发送到SMTP并关闭连接.对JMS队列中的所有消息执行此操作.
当我在队列中同时拥有最多5条消息时,它工作得很好.5个不同的MDB实例同时拾取所有邮件,因此我有5个并发连接到Gmail SMTP服务器.但是当JMS队列中有更多消息时,我从Gmail SMTP服务器收到连接错误.5个第一个消息是正确发送的,但不是其余的,所以其他消息丢失,因为它们不再在队列中.
所以我的问题是,是否可以限制将侦听JMS队列的MDB实例的数量?如果我最多有5个MDB,那么即使队列中有1000个消息,也只需要更长的时间来清空队列,但至少我不会丢失任何消息.
任何其他建议来解决这个问题将非常感谢.
这是Jboss版本:
[服务器]版本ID:JBoss [Trinity] 4.2.3.GA(build:SVNTag = JBoss_4_2_3_GA date = 200807181417)
MDB的配置如下:
@MessageDriven(activationConfig = {
@ActivationConfigProperty( propertyName = "destinationType", propertyValue = "javax.jms.Queue" ),
@ActivationConfigProperty( propertyName = "destination", propertyValue = "queue/emailQueue")
})
Run Code Online (Sandbox Code Playgroud)
你需要更多吗?
谢谢
编辑2011-02-14
也许我想错误地限制MDB实例的数量.我看到了一个关于JMS线程数量的配置.如果我限制将发布到MDB的线程数,也许它会解决我的问题?在再次发布消息之前,JMS是否会等到MDB可用?这样做会有副作用吗?你虽然请.谢谢
结束编辑
我有一个带HornetQ的JBoss-6服务器和一个队列:
<queue name="my.queue">
<entry name="/queue/test"/>
</queue>
Run Code Online (Sandbox Code Playgroud)
有连接到这个队列中一个不同的消费者(在不同的机器),但只有一个单一的消费者是活动的时间.如果我关闭此消费者,消息将立即由其他消费者处理.
由于我的消息有一些耗时的处理,我希望多个消费者同时处理它们的唯一消息.
我记得早期版本的JBoss中有类似的设置,这种设置没有问题.在Jboss-6中,消息传递系统运行良好 - 除了上述问题.这个问题与hornetq中的多个客户端消费者类似吗?,但情景与我的情况不同.
更新1:如果我关闭(STRG + C)一个消费者,则会有一个短暂的超时(直到服务器识别丢失的消费者),直到下一个消费者获得消息.
更新2:代码段
VoidListener ml = new VoidListener();
QueueConnectionFactory qcf = (QueueConnectionFactory)
ctx.lookup("ConnectionFactory");
QueueConnection conn = qcf.createQueueConnection();
Queue queue = (Queue) ctx.lookup(queueName);
QueueSession session = conn.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
QueueReceiver recv = session.createReceiver(queue,"");
recv.setMessageListener(ml);
conn.start();
Run Code Online (Sandbox Code Playgroud)
和MessageListerner:
public class OlVoidListener implements MessageListener
{
public void onMessage(Message msg)
{
counter++;
logger.debug("Message ("+counter+") received");
try {Thread.sleep(15*1000);} catch (InterruptedException e) {}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用JMS访问MQ队列.我得到了以下
java.lang.UnsatisfiedLinkError: no mqjbnd05 in java.library.path
Run Code Online (Sandbox Code Playgroud)
我过世了
-Djava.library.path="C:\Program Files\IBM\WebSphere MQ\java\lib"
Run Code Online (Sandbox Code Playgroud)
作为在eclipse中运行程序时的VM参数.这个问题在网上讨论得很多,但没有任何结论.有人解决了吗?TIA.
我的Java EE应用程序将JMS连续发送到队列,但有时JMS使用者应用程序停止接收JMS.它导致JMS队列非常大甚至已满,从而使服务器崩溃.我的服务器是JBoss或Websphere.应用程序服务器是否提供删除"超时"JMS消息的策略?
处理大型JMS队列的策略是什么?谢谢!
在分布式环境中部署无状态Java EE 6应用程序以实现高可用性和可伸缩性的最佳方法是什么?我的申请是无国籍的.因此,我不需要复制任何会话状态(HTTP会话,EJB有状态bean等)
具体来说,我想知道以下内容:
我计划使用Amazon AWS(具有多AZ部署的RDS,弹性负载平衡,EC2).
刚刚开始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队列并获取其中的所有消息的最佳方法是什么?
如何计算队列中的消息数?
谢谢.
我是新来的JMS.据我所知,Consumers能够从队列/主题中选择消息.那你为什么需要一个MessageListener因为Consumers会知道他们什么时候收到消息?这样的实际用途是MessageListener什么?
编辑:从MessageListener的Javadoc:
MessageListener对象用于接收异步传递的消息.
每个会话必须确保它将消息串行传递给侦听器.这意味着分配给同一会话的一个或多个使用者的侦听器可以假定在会话完成最后一次调用之前,不会使用下一条消息调用onMessage方法.
所以我在异步和串行一起使用术语时感到困惑.这两个术语在描述特征方面MessageListener有何关联?
以下是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) jms ×10
java ×7
jboss ×2
apache-camel ×1
ejb-3.0 ×1
glassfish ×1
hornetq ×1
ibm-mq ×1
java-ee ×1
jboss-4.2.x ×1
jboss6.x ×1
messaging ×1
spring ×1
spring-boot ×1