Java Spring积分边界测井

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表示提取消息的速度和将消息持久化到数据

我在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;
    }