Java Spring积分边界测井
我在Jetty上部署了一个Spring集成应用程序,它从IBM MQ中提取消息(XML和JSON),进行一些转换,并将转换后的消息持久化到Oracle 目前我们正在进行负载测试,性能非常差,大约每秒15条消息在NFT环境中从队列中排出。即使我们的监控工具;AppD向我们展示了只需约20毫秒就可以持久化到Oracle,而在其他步骤中几乎什么都不做 在本地机器上构建时,我们可以看到显著更高的吞吐量(每秒约100个消息),我想通过一些边界日志来验证这一点;i、 e表示提取消息的速度和将消息持久化到数据库的速度。它可能有助于识别瓶颈甚至网络问题 我使用的是消息驱动的通道适配器Java Spring积分边界测井,java,oracle,spring-integration,ibm-mq,jetty-9,Java,Oracle,Spring Integration,Ibm Mq,Jetty 9,我在Jetty上部署了一个Spring集成应用程序,它从IBM MQ中提取消息(XML和JSON),进行一些转换,并将转换后的消息持久化到Oracle 目前我们正在进行负载测试,性能非常差,大约每秒15条消息在NFT环境中从队列中排出。即使我们的监控工具;AppD向我们展示了只需约20毫秒就可以持久化到Oracle,而在其他步骤中几乎什么都不做 在本地机器上构建时,我们可以看到显著更高的吞吐量(每秒约100个消息),我想通过一些边界日志来验证这一点;i、 e表示提取消息的速度和将消息持久化到数据
<jms:message-driven-channel-adapter id="jmsIn"
channel="routingChannel"
container="DefaultJmsListenerContainer" />
对于Oracle持久性部分,我将使用ServiceActivator调用JDBCTemplace以实现有效负载(写模型)持久性,并将消息排入队列通道,并使用聚合器实现批休眠持久性(读模型)
当我看到像下面这样的博客,每秒处理一百万个事务,这很容易,我想找到根本原因
如果我要从队列中读取10条消息,然后成批保存,我还不确定如何继续,那么应该如何配置消息驱动的通道适配器,并且仍然确保JMS事务管理与JDBC事务管理一起工作
在使用2个事务管理器时,我找不到一篇关于Spring Integration的事务管理的解释很好的文章。而我们方面的要求是实现零数据丢失,因此我必须了解这一点
因此,有两个问题:
Kris问题可能是您提到的是一个
队列频道。这一个实际上是基于一些轮询器,如果它被配置为类似于fixedDelay=1000
,那么这将是一个瓶颈。对于这个轮询器来说,另一个选择是:<代码> Max MaseSePopRe= -1 .P/>
我不确定您的边界日志记录是什么。从未听说过这样的术语,但您确实可以打开org.springframework.integration
的调试日志级别,您将在日志中看到消息是如何通过Spring集成组件传递的
对于DataSourceTransactionManager
和JmsTransactionManager
组合,我们始终建议阅读Dave Syer关于1PC分布式事务的文章:。此外,Spring数据中已经有一个ChainedTransactionManager
。一个SO线程中的问题太多了。这不是这里的工作原理Hi Artem…同意…但是,我觉得它们都与当前的性能问题有关。也许你真的可以展示你的整个集成流程?谢谢Artem。我正在读这篇文章。但是关于CachingConnectionFactory,我们正在使用它,我删除了它,因为我阅读了下面的API文档,其中提到在使用并发用户时不要使用后者。[链接]。我还使用我们创建的用于连接到队列的IBM队列更新了描述。
public MQQueue createRequestQueue() throws IllegalStateException, JMSException {
return new MQQueue(env.getRequiredProperty(QUEUE_MANAGER), incomingQueue);
}
@Bean(name="DefaultJmsListenerContainer")
public DefaultMessageListenerContainer provideJmsListenerContainer() throws IllegalStateException, JMSException {
DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
container.setConnectionFactory(connectionFactory());
container.setTransactionManager(provideTransactionManager());
container.setConcurrency(jmsConcurrency);
container.setCacheLevel(jmsCacheLevel);
container.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
container.setSessionTransacted(true);
container.setDestination(createRequestQueue());
return container;
}
@Bean(name="MQConnectionFactory")
public ConnectionFactory connectionFactory() {
if (factory == null) {
factory = new MQConnectionFactory();
try {
factory.setConnectionNameList(env.getRequiredProperty(HOST));
factory.setPort(Integer.parseInt(env.getRequiredProperty(PORT)));
factory.setQueueManager(env.getRequiredProperty(QUEUE_MANAGER));
factory.setChannel(env.getRequiredProperty(CHANNEL));
factory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
factory.setSSLCipherSuite(env.getRequiredProperty(SSL_CIPHER_SUITE));
factory.setStringProperty(WMQConstants.USERID, env.getRequiredProperty(QUEUE_USERID));
factory.setStringProperty(WMQConstants.PASSWORD, env.getRequiredProperty(QUEUE_PASSWORD));
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
return factory;
}
@Bean(name = "jmsTransactionManager")
public JmsTransactionManager provideTransactionManager() {
return new JmsTransactionManager(connectionFactory());
}
@Bean(name="jdbcTransactionManager")
public DataSourceTransactionManager jdbcTransactionManager() {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource());
return dataSourceTransactionManager;
}
@Bean
public DataSource dataSource() {
final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
dsLookup.setResourceRef(true);
DataSource dataSource = dsLookup.getDataSource("jdbc/pxxds");
return dataSource;
}