Tag: jms

如何在Activemq中回滚消息

我想在变量x值等于1时向Activemq发送确认。如果它不等于1 ,我想将消息重新发送到Activemq 。 然后只有Activemq再次向订阅者传递消息。为此,我编写了以下程序。 MessageConsumer.java: public class Consumer extends HttpServlet { @Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { try { ActiveMQConnectionFactory connectionFactory=new ActiveMQConnectionFactory(“admin”,”admin”,”tcp://localhost:61617″); RedeliveryPolicy policy = new RedeliveryPolicy(); policy.setInitialRedeliveryDelay(1000L); policy.setMaximumRedeliveries(RedeliveryPolicy.NO_MAXIMUM_REDELIVERIES); connectionFactory.setRedeliveryPolicy(policy); connectionFactory.setUseRetroactiveConsumer(true); Connection connection=connectionFactory.createConnection(); final Session session=connection.createSession(true, Session.AUTO_ACKNOWLEDGE); Topic queue=session.createTopic(“MessageTesting”); javax.jms.MessageConsumer consumer=session.createConsumer(queue); //anonymous class MessageListener listener = new MessageListener() { @Override […]

Wildfly JMS:当消息存在时,MDB bean空闲

我在Wildfly 8.1(HornetQ)上使用捆绑的JMS实现来OCR大量文档。 我希望有一个3个MDB池,消耗队列的消息和要被OCR的文件。 每个MDB都使用Apache commons-exec启动一个进程并阻塞,直到该进程退出。 在我的测试中,我有50条JMS消息(每条消息代表一个要被OCR的文档),它们在测试开始时加载到队列中。 处理开始时,在任何给定时间我都可以看到有3个CPU密集型OCR进程,一个由每个MDB启动和阻止。 在某些时候,在20分钟左右之后,其中一个OCR过程消失,并且在任何给定时间只有2个保持活着。 当剩余10条JMS消息时,另一个OCR进程停止,并且在任何给定时间只有1个。 最后,所有50个文档都已被OCR,并且任何OCR进程或我的应用程序都不会抛出任何exception。 我发现这种行为很奇怪,因为我希望在任何时间消耗JMS消息时都会有3个OCR进程处于活动状态(当然除外)。 如果在队列中输入时将JMS消息“分配”到MDB实例,而不是实时,则可以解释此行为。 例如,如果为每个MDB分配了大约17条消息。 根据文档大小,当其他MDB实例仍然可以使用消息时,某些MDB实例可以更早地完成并保持空闲而不消耗任何其他消息。 这是发生了什么? 如果是,是否有办法更改此设置,以便每当MDB实例完成处理消息时,都会向MDB实例分配消息? @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = “destinationLookup”, propertyValue = “queue/csrOcrQueue”), @ActivationConfigProperty(propertyName = “minSession”, propertyValue = “3”), @ActivationConfigProperty(propertyName = “maxSession”, propertyValue = “3”) }) @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public class OcrMessageListener implements MessageListener {

ActiveMQ在不同操作系统中的性能

我在某些操作系统中测试了activeMQ JMSProducer。 结果如下: AIX – Persistent – around 50 messages per second Solaris – Persistent – around 60 messages per second Linux – Persistent – around 500 messages per second 这是正常的行为,因为在Linux中,速度要快得多吗? ActiveMQ Performance文档仅基于Linux。 并且, Slow KahaDB access降低activeMQ的性能? 谢谢。

Spring – 在JPA事务之后提交JMS事务

我有两个事务管理器: JpaTransactionManager ( myJpaTm )和myJmsTm ( myJmsTm )。 考虑以下代码: @Named public class TestA { @Inject TestB testB; @Transactional(transactionManager=”myJpaTm”) public void methoda() { // store stuff in db testB.methodb(); } } @Named public class TestB { @Transactional(transactionManager=”myJmsTm”) public void methodb() { // send few JMS messages } } 我们有外部JPA事务和内部JMS事务,两者都是分开的,因为我们没有使用分布式事务。 我想在提交JPA事务后立即提交JMS事务。 在这种情况下,当前的JMS事务需要连接到父JPA事务。 我不是在寻找分布式事务的替代,我只想在将数据提交到数据库之后发送JMS消息。 我知道我可以创建另一个可以调用methodb ,然后methodb调用methodb ,但我想通过连接两个事务来解决它。

当JMS Prod位于帮助程序POJO类中时,如何在事务中包含JMS生产者

简短的问题:是否有办法强制由无状态EJB调用的POJO存在于EJB的上下文中,以便事务和资源注入在POJO中起作用? 特别是在我想要做的事情的上下文中:如何在EJB的事务中包含POJO JMS Producer,它在调用POJO发送消息之前将数据库中的某些数据持久化,这样如果消息不能由于exception发送,数据库事务也会回滚吗? 我想异步发送邮件。 这是快乐的路径(从无状态会话bean开始): 将数据保存到数据库//这有效 从持久数据中提取数据并将其放入自定义“消息”类(实际上是dto) 调用EmailQueueMessenger POJO的sendEmail方法,将消息对象传递给它。 消息被发送到MDB以处理和发送电子邮件(不是问题的一部分,只是为了完整性) 下面的代码工作,它只是不会在调用类中回滚数据库“persist”如果我强制说错误,例如,上下文查找。 顺便说一句,我也无法让@Resource注入工作。 //In the EJB EmailQueueMessenger eqm = new EmailQueueMessenger(); eqm.sendEmail(messageObject); // mailObject will be translated into an email message at the other end of the queue. /******************** POJO Below ************/ public class EmailQueueMessenger implements Serializable { // Resource injection doesn’t work… using ‘lookup’ […]

如何设置队列生成器超时?

我正在测试WebLogic 10.3.1 JMS,但是存在问题。 我的测试步骤: 启动WebLogic Server 启动JMS客户端 客户端将对象发送到WebLogic JMS并且服务器接收到该对象。 停止WebLogic Server 将另一个对象发送到WebLogic JMS。 我所期待的是一个例外,但没有任何出现和程序被绞死。 程序停在: sender.send(objMsg); 我添加了一些超时设置,但仍然无法正常工作: ((WLProducerImpl) sender).setSendTimeout(1000); ((WLConnection) connection).setReconnectPolicy(JMSConstants.RECONNECT_POLICY_PRODUCER); ((WLConnection) connection).setReconnectBlockingMillis(1000); 在这种情况下有没有办法产生exception? 非常感谢你。 最诚挚的问候,克里斯

使用JMS,有没有办法在间歇性断开连接的客户端上存储消息,并在网络可用时将它们转发给代理?

我正在考虑一种架构,我的客户端间歇性地连接到网络。 我希望在网络不可用时将在这些客户端上创建的消息存储在JMS队列中,并在客户端在网络上时将这些消息转发到中央消息代理。 (用户可以控制网络,例如拨入,因此不像手机那样间歇性连接。) 是否有任何提供此function的JMS实现?

javax.jms.ConnectionFactory和javax.jms.XAConnectionFactory之间的差异

我正在进入JTA的世界,由于需要分布式事务,我不确定javax.jms.ConnectionFactory和javax.jms.XAConnectionFactory之间的区别,或者更准确地说, javax.jms.ConnectionFactory执行的方式如何?我所期望的只有javax.jms.XAConnectionFactory才能为我做。 细节:我使用Atomikos essentials作为我的事务管理器,我的应用程序在Apache Tomcat 6上运行。 我正在运行一个带有虚拟应用程序的小型POC,我将JMS提供程序( OpenMQ )注册为JNDI资源。 奇怪的是,在我的代码中我这样做: Context ctx = new InitialContext(); ConnectionFactory queueConnectionFactory = (ConnectionFactory)ctx.lookup(“java:comp/env/jms/myQueueFactory”); javax.jms.Connection connection = queueConnectionFactory.createConnection(); Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); 稍后在代码中,我在UserTransaction使用此会话,并且它使用Commit或Rollback两个MessageProducer完美地执行。 我不明白的是,我是如何使用javax.jms.XAConnectionFactory.createConnection()方法的,我得到了一个能完成工作的Session ? 什么是javax.jms.XAConnectionFactory角色? 我还要补充一点,我已经查看了两个类(和javax.jms.BasicConnectionFactory )的源代码,并且我validation了XA类没有覆盖createConnection 。

JMS有哪些替代方案?

我们有JMS的替代品吗? 问题陈述我们有一个名为Configuration Manager的组件,它包含应用程序的配置。 此配置管理器由4个应用程序实例使用。 现在,只要管理员更改配置,就应该通知应用程序的所有实例。

Java:使用多个线程将消息发送到JMS队列

我正在尝试编写一个Java类来使用多个线程从JMS队列发送和读取消息以加快速度。 我有以下代码。 System.out.println(“Sending messages”); long startTime = System.nanoTime(); Thread threads[] = new Thread[NumberOfThreads]; for (int i = 0; i < threads.length; i ++) { threads[i] = new Thread() { public void run() { try { for (int i = 0; i < NumberOfMessagesPerThread; i ++) { sendMessage("Hello"); } } catch (Exception e) { e.printStackTrace(); } […]