Tag: spring jms

使用TransactionManager使用Spring JmsTemplate编写消息

使用Spring-JMS,可以通过DefaultMessageListenerContainer在外部事务上下文中接收消息。 但是, 编写消息的唯一记录方法是通过JmsTemplate.send(…) ,我无法看到如何强制使用给定的TransactionManager 。 谁能指出我正确的方向? 更多信息:确保事务管理器可用( WebSphereUowTransactionManager ),对Oracle AQjmsFactory.getQueueConnectionFactory(dataSource)使用JmsTemplate.write导致: org.springframework.jms.UncategorizedJmsException: Uncategorized exception occured during JMS processing; nested exception is oracle.jms.AQjmsException: could not use local transaction commit in a global transaction at org.springframework.jms.support.JmsUtils.convertJmsAccessException(JmsUtils.java:316) at org.springframework.jms.support.JmsAccessor.convertJmsAccessException(JmsAccessor.java:168) at org.springframework.jms.core.JmsTemplate.execute(JmsTemplate.java:469) at org.springframework.jms.core.JmsTemplate.send(JmsTemplate.java:534) Caused by: oracle.jms.AQjmsException: could not use local transaction commit in a global transaction at oracle.jms.AQjmsSession.commitNoCheck(AQjmsSession.java:1053) at […]

spring配置嵌入式BrokerService

我想在spring mvc应用程序中配置嵌入式ActiveMQ代理服务。 这是我的配置 @Configuration @EnableJms public class JmsConfiguration { @Bean(initMethod = “start”, destroyMethod = “stop”) public BrokerService brokerService() throws Exception { BrokerService brokerService = new BrokerService(); brokerService.setPersistent(false); brokerService.setUseJmx(false); brokerService.addConnector(“vm://localhost:0”); brokerService.setBrokerName(“broker”); brokerService.setUseShutdownHook(false); return brokerService; } @Bean public ConnectionFactory connectionFactory(){ return new ActiveMQConnectionFactory(“vm://localhost:0”); } @Bean public ActiveMQQueue defaultDestination(){ return new ActiveMQQueue(“broker”); } @Bean public JmsTemplate jmsTemplate(){ JmsTemplate […]

jms制作人与spring的表现

我创建了一个基于spring,jms和activemq的简单的生产者消费者模拟,我试图从双方,生产者和消费者那里获得高性能, 连接设置: 消费者设置: 制片人设置: 从消费者开始,我设法每秒消耗大约25条消息,这非常慢,我发现瓶颈是我正在使用交易,谷歌搜索一下,然后玩配置,我发现自动assemblyDefaultMessageListenerContainer并将cachelevel更改为 listenerContainer.setCacheLevelName(“CACHE_SESSION”) 我的性能增加到每秒约1500条消息,同时仍然有交易。 我的问题是现在生产者仍然停留在每秒约25次操作,我的生产者测试很简单: int numOfMessages = getNumberOfMessages(); double startTime = System.currentTimeMillis(); for (int i = 1; i <= numOfMessages; i++) { jmsTemplate.convertAndSend("HelloWorld" + i); } double endTime = System.currentTimeMillis(); double totalTime=(endTime-startTime)/1000; System.out.println("Time – "+totalTime+" seconds"); System.out.println("EPS – "+numOfMessages/totalTime); 我想知道如何与制作人达成类似的表演,因为它现在已经成为整个系统的瓶颈。

Java:如何从Spring的DMLC取消订阅持久订阅者?

在普通的JMS中我们可以这样做:session.unsubscribe(“持久订阅的名称”); 但是我们如何通过DMLC来做到这一点? 找不到任何具体的方法。

持久侦听器/使用者的用例场景

所以我正在创建一个主题的并发消费者,即多个听众。 我将它们配置为耐用。 @Bean public DefaultMessageListenerContainer listenerContainers() { DefaultMessageListenerContainer container = new DefaultMessageListenerContainer(); container.setConnectionFactory(connectionFactory()); container.setDestinationName(COMMENT_QUEUE); container.setPubSubDomain(true); container.setSessionTransacted(true); container.setConcurrentConsumers(2); container.setSubscriptionDurable(true); container.setMessageListener(datafileSubscriber); container.start(); return container; } 我在想耐用消费者的用例场景 我有一个发布消息的进程,并且消息由侦听器获取。 我在想是否有人停止了这个过程并重新启动它,我不会丢失消息和他们的处理,因为f耐用的消费者。 是对的吗? 我不会丢失消息,因为消息在KahaDB中,并且在重新启动进程后,它将重新发送尚未完全处理给侦听器的消息,因为它们是持久的。 这是正确的解释吗?

JMS负载平衡(1个队列,2个队列连接工厂和1个.bindings)

我正在使用JMS将消息放入队列。 队列与2个QueueConnection工厂和2个队列管理器相关联。 在将消息发送到队列时,我希望通过2个不同的队列连接工厂向2个不同的队列管理器平均分发/发送消息。 例: 在不同的时间点,我的服务接收来自某个用户的消息。我需要同样将消息放入2个QCF / QueueManagers。 (负载均衡) 如果我收到第一条消息,我需要发送到第一个QCF1 /队列管理器,如果另一个消息到达我的服务,我将必须将它发送到第二个QCF1 /队列管理器。 因为JMS允许我一次使用onle 1 QCF创建Queue Coontion。 这可以使用JMS完成吗? 还是另一种方法来实现这一目标? 使用一个QCF向Queue发送消息的方法: import javax.naming.InitialContext; import javax.jms.Queue; import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.QueueSession; import javax.jms.QueueSender; import javax.jms.QueueConnection; import javax.jms.QueueConnectionFactory; public class Receiver { @Resource(lookup = “jms/ConnectionFactory1”) private static QueueConnectionFactory connectionFactory1; @Resource(lookup = “jms/ConnectionFactory2”) private static QueueConnectionFactory connectionFactory2; @Resource(lookup = “jms/Queue”) […]

控制消息侦听器容器停止一段时间并再次开始侦听

听众: 我想停止容器监听JMS消息并在一段时间后再次启动它? 可以实现吗?

如何在Spring Java Config的单个MessageListenerContainer中添加多个JMS MessageListners

我在spring-config.xml中有以下xml代码 现在,我正在将spring xml配置文件转换为Java配置。 我把它翻译成了 @Bean(name = “consumerJmsListenerContainer”) public DefaultMessageListenerContainer consumerJmsListenerContainer() { DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer(); messageListenerContainer .setConnectionFactory(cachingConnectionFactory()); messageListenerContainer.setConcurrency(“20-25”); messageListenerContainer.setErrorHandler(new ConsumerErrorHandler()); messageListenerContainer .setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE); messageListenerContainer.setMessageListener(new TaskFinished()); return messageListenerContainer; } 我需要知道的是,如果消息容器中有多个MessageListner,如 我怎么能把这个xml代码转换成Java配置?

使用Spring的CachingConnectionFactory时关闭会话

这里与Spring CachingConnectionFactory相关的java doc有评论: 注意:此ConnectionFactory要求显式关闭从其共享Connection获取的所有Sessions。 无论如何,这是本机JMS访问代码的通常建议。 但是,使用此ConnectionFactory,必须使用它才能实际允许会话重用。 我不清楚如何使用我的应用程序中的以下给定配置来处理这个问题。 com.tibco.tibjms.naming.TibjmsInitialContextFactory tibjmsnaming://localhost:7222 admin admin 监听器类是这样的: public class MessageListenerApp implements MessageListener { private static int c = 0; @Override public void onMessage(Message arg0) { try { System.out.println(“Received Message…”+arg0.getStringProperty(“MessageNum”)+”. Waiting to finish..”); Thread.sleep(2000); System.out.println(“Finished processing..”+arg0.getStringProperty(“MessageNum”)+”..”+(c++)); } catch (Exception e) { e.printStackTrace(); } } } 如何遵循应明确关闭从共享连接获取的会话的建议? 遇到SessionAwareMessageListener接口,该接口提供onMessage方法,该方法提供Session的句柄。 那么要正确实现会话结束,是否应实现此接口?

JMS消息侦听器的执行失败,并且未设置ErrorHandler

当我使用Spring收听JMS消息时,我收到了上述错误。 我想知道如何将Errorhandler添加到JMS侦听器中?