消息队列:ActiveMQ:ActiveMQ的高可用性配置_第1页
消息队列:ActiveMQ:ActiveMQ的高可用性配置_第2页
消息队列:ActiveMQ:ActiveMQ的高可用性配置_第3页
消息队列:ActiveMQ:ActiveMQ的高可用性配置_第4页
消息队列:ActiveMQ:ActiveMQ的高可用性配置_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

消息队列:ActiveMQ:ActiveMQ的高可用性配置1消息队列基础1.1ActiveMQ简介ActiveMQ是Apache的一个开源项目,它是基于Java的消息中间件,实现了高级消息队列协议(AMQP)。ActiveMQ提供了强大的消息传递功能,包括持久化、事务处理、消息分发等,使其成为企业级应用中消息传递的首选解决方案。1.1.1特点高可用性:ActiveMQ支持集群和主从模式,确保即使在单点故障的情况下,消息传递服务也能持续运行。高性能:通过优化的内存管理和消息处理机制,ActiveMQ能够处理高吞吐量的消息传递需求。易用性:ActiveMQ提供了丰富的客户端库,支持多种编程语言,如Java、C++、.NET等,使得开发者能够轻松地集成消息队列功能到他们的应用中。1.2消息队列的工作原理消息队列是一种用于在分布式系统中进行消息传递的机制。它允许应用程序将消息发送到队列中,然后由其他应用程序从队列中读取消息。这种模式可以提高系统的解耦性、可靠性和可扩展性。1.2.1基本概念生产者:向消息队列发送消息的应用程序。消费者:从消息队列读取消息的应用程序。队列:存储消息的容器,生产者将消息放入队列,消费者从队列中取出消息。1.2.2工作流程生产者创建消息并将其发送到消息队列。消息队列存储消息,直到消费者读取。消费者从消息队列中读取消息并处理。1.2.3示例代码以下是一个使用ActiveMQ发送和接收消息的简单示例://生产者代码

importorg.apache.activemq.ActiveMQConnectionFactory;

publicclassProducer{

publicstaticvoidmain(String[]args)throwsException{

ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory("tcp://localhost:61616");

Connectionconnection=connectionFactory.createConnection();

connection.start();

Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

Destinationdestination=session.createQueue("ExampleQueue");

MessageProducerproducer=session.createProducer(destination);

TextMessagemessage=session.createTextMessage("Hello,ActiveMQ!");

producer.send(message);

connection.close();

}

}

//消费者代码

importorg.apache.activemq.ActiveMQConnectionFactory;

publicclassConsumer{

publicstaticvoidmain(String[]args)throwsException{

ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory("tcp://localhost:61616");

Connectionconnection=connectionFactory.createConnection();

connection.start();

Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

Destinationdestination=session.createQueue("ExampleQueue");

MessageConsumerconsumer=session.createConsumer(destination);

TextMessagemessage=(TextMessage)consumer.receive();

System.out.println("Receivedmessage:"+message.getText());

connection.close();

}

}这段代码展示了如何使用ActiveMQ创建一个简单的消息队列,生产者发送一条文本消息到队列,消费者从队列中读取并打印消息。1.3ActiveMQ在企业级应用中的作用在企业级应用中,ActiveMQ的作用主要体现在以下几个方面:异步通信:允许应用程序异步发送和接收消息,提高系统的响应速度和吞吐量。负载均衡:通过消息队列,可以将任务分发到多个消费者,实现负载均衡。故障恢复:消息队列可以存储未处理的消息,即使消费者暂时不可用,消息也不会丢失。解耦:生产者和消费者不需要直接通信,它们只需要与消息队列交互,这使得系统更加灵活和可扩展。1.3.1实际应用案例假设一个电子商务网站需要处理大量的订单请求。在高峰期,订单请求可能超过服务器的处理能力。通过使用ActiveMQ,可以将订单请求放入队列中,然后由多个订单处理服务从队列中读取并处理这些请求。这样,即使在高峰期,系统也能保持稳定运行,不会因为处理能力不足而拒绝服务。1.3.2配置示例在企业级应用中,为了确保ActiveMQ的高可用性和性能,通常需要进行一些高级配置,例如设置持久化存储、配置集群等。以下是一个简单的ActiveMQ配置示例,用于设置持久化存储:<brokerxmlns="/schema/core"brokerName="myBroker"dataDirectory="${activemq.data}/myBroker">

<persistenceAdapter>

<kahaDBdirectory="${activemq.data}/kahadb"/>

</persistenceAdapter>

<transportConnectors>

<transportConnectorname="openwire"uri="tcp://localhost:61616"/>

</transportConnectors>

</broker>在这个配置文件中,dataDirectory指定了ActiveMQ的数据存储目录,persistenceAdapter配置了KahaDB存储引擎,用于持久化消息。transportConnectors配置了ActiveMQ的网络连接,这里使用的是OpenWire协议。通过以上介绍,我们了解了ActiveMQ的基本概念、工作原理以及在企业级应用中的作用。ActiveMQ的强大功能和灵活性使其成为构建高可用、高性能分布式系统的重要工具。2消息队列:ActiveMQ:高可用性配置2.1高可用性概念2.1.1高可用性的定义高可用性(HighAvailability,简称HA)是指系统在遇到故障时,能够自动切换到备用系统或组件,以确保服务的连续性和数据的完整性。在分布式系统中,高可用性尤为重要,因为它能够保证即使在部分组件失效的情况下,整个系统仍然能够正常运行。2.1.2ActiveMQ高可用性的重要性ActiveMQ作为一款广泛使用的开源消息中间件,其高可用性配置对于企业级应用至关重要。在生产环境中,消息队列的稳定性直接影响到业务的连续性和数据处理的效率。通过实现高可用性,可以确保ActiveMQ在遇到硬件故障、网络中断或软件错误时,能够快速恢复,避免数据丢失和业务中断。2.1.3实现高可用性的方法ActiveMQ提供了多种实现高可用性的方法,包括:主从模式(Master-Slave)在主从模式下,一个ActiveMQ实例作为主节点运行,另一个实例作为从节点。当主节点发生故障时,从节点自动接管主节点的工作,确保消息队列服务的连续性。集群模式(Cluster)集群模式下,多个ActiveMQ实例通过网络连接形成一个集群。消息可以被发送到集群中的任何一个节点,集群内部会自动进行消息的复制和分发,确保即使部分节点失效,消息仍然能够被正确处理。持久化存储ActiveMQ支持多种持久化存储方式,如KahaDB和LevelDB。通过持久化存储,可以确保消息在系统重启或故障后仍然能够被恢复,从而提高系统的高可用性。多网络适配器(Multi-NIC)在ActiveMQ中配置多网络适配器,可以提高网络的冗余性,确保即使一个网络接口失效,系统仍然能够通过其他接口进行通信。仲裁模式(Arbitration)仲裁模式是一种基于集群的高可用性解决方案,它使用仲裁者(Arbiter)来决定哪个节点应该成为主节点。仲裁者可以是一个独立的ActiveMQ实例,也可以是外部的仲裁服务,如ZooKeeper。2.2主从模式配置示例在主从模式下,我们需要在ActiveMQ的配置文件activemq.xml中进行相应的设置。以下是一个简单的主从模式配置示例:<!--activemq.xml-->

<beanid="master"class="org.apache.activemq.broker.BrokerService">

<propertyname="brokerName"value="master"/>

<propertyname="dataDirectory"value="${activemq.data}/master"/>

<propertyname="transportConnectors">

<list>

<refbean="masterConnector"/>

</list>

</property>

<propertyname="plugins">

<list>

<beanclass="org.apache.activemq.plugin.MasterSlavePlugin">

<propertyname="slaveBrokerURL"value="tcp://slave:61616"/>

</bean>

</list>

</property>

</bean>

<beanid="slave"class="org.apache.activemq.broker.BrokerService">

<propertyname="brokerName"value="slave"/>

<propertyname="dataDirectory"value="${activemq.data}/slave"/>

<propertyname="transportConnectors">

<list>

<refbean="slaveConnector"/>

</list>

</property>

<propertyname="plugins">

<list>

<beanclass="org.apache.activemq.plugin.MasterSlavePlugin">

<propertyname="masterConnectorURI"value="tcp://master:61616"/>

</bean>

</list>

</property>

</bean>

<beanid="masterConnector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://master:61616?maximumConnections=1000"/>

</bean>

<beanid="slaveConnector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://slave:61616?maximumConnections=1000"/>

</bean>在这个示例中,我们定义了两个BrokerService实例,分别作为主节点和从节点。主节点和从节点通过MasterSlavePlugin插件进行连接,从节点通过masterConnectorURI属性指定主节点的连接信息,而主节点则通过slaveBrokerURL属性指定从节点的连接信息。2.3集群模式配置示例集群模式下,ActiveMQ实例之间通过网络进行消息的复制和分发。以下是一个使用ReplicatedLevelDBPersistenceAdapter进行集群配置的示例:<!--activemq.xml-->

<beanid="broker"class="org.apache.activemq.broker.BrokerService">

<propertyname="brokerName"value="clusteredBroker"/>

<propertyname="dataDirectory"value="${activemq.data}/clusteredBroker"/>

<propertyname="transportConnectors">

<list>

<refbean="connector"/>

</list>

</property>

<propertyname="plugins">

<list>

<beanclass="org.apache.activemq.cluster.failover.FailoverClusterConnectionPlugin">

<propertyname="brokerURLs">

<list>

<value>tcp://node1:61616</value>

<value>tcp://node2:61616</value>

</list>

</property>

</bean>

</list>

</property>

<propertyname="persistenceAdapter">

<beanclass="org.apache.activemq.store.leveldb.ReplicatedLevelDBPersistenceAdapter">

<propertyname="brokerName"value="clusteredBroker"/>

<propertyname="directory"value="${activemq.data}/clusteredBroker/leveldb"/>

<propertyname="replicationURI"value="tcp://node1:61617"/>

</bean>

</property>

</bean>

<beanid="connector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://localhost:61616?maximumConnections=1000"/>

</bean>在这个示例中,我们使用了FailoverClusterConnectionPlugin插件来实现集群的故障转移,同时使用了ReplicatedLevelDBPersistenceAdapter持久化适配器来确保消息的复制。brokerURLs属性列出了集群中所有节点的连接信息,而replicationURI属性指定了消息复制的目标节点。2.4持久化存储配置示例ActiveMQ支持多种持久化存储方式,其中KahaDB和LevelDB是最常用的两种。以下是一个使用KahaDB进行持久化存储的配置示例:<!--activemq.xml-->

<beanid="broker"class="org.apache.activemq.broker.BrokerService">

<propertyname="brokerName"value="kahadbBroker"/>

<propertyname="dataDirectory"value="${activemq.data}/kahadbBroker"/>

<propertyname="transportConnectors">

<list>

<refbean="connector"/>

</list>

</property>

<propertyname="persistenceAdapter">

<beanclass="org.apache.activemq.store.kaha.KahaDBPersistenceAdapter">

<propertyname="directory"value="${activemq.data}/kahadbBroker/kaha"/>

<propertyname="journalMaxFileLength"value="10485760"/>

<propertyname="mapMemory"value="536870912"/>

</bean>

</property>

</bean>

<beanid="connector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://localhost:61616?maximumConnections=1000"/>

</bean>在这个示例中,我们使用了KahaDBPersistenceAdapter持久化适配器,通过设置directory属性来指定存储目录,journalMaxFileLength属性来控制日志文件的最大长度,mapMemory属性来控制内存映射文件的大小。2.5多网络适配器配置示例在ActiveMQ中配置多网络适配器,可以提高网络的冗余性。以下是一个配置了两个网络适配器的示例:<!--activemq.xml-->

<beanid="broker"class="org.apache.activemq.broker.BrokerService">

<propertyname="brokerName"value="multiNicBroker"/>

<propertyname="dataDirectory"value="${activemq.data}/multiNicBroker"/>

<propertyname="transportConnectors">

<list>

<refbean="primaryConnector"/>

<refbean="secondaryConnector"/>

</list>

</property>

</bean>

<beanid="primaryConnector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://primaryNic:61616?maximumConnections=1000"/>

</bean>

<beanid="secondaryConnector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://secondaryNic:61616?maximumConnections=1000"/>

</bean>在这个示例中,我们定义了两个TransportConnector实例,分别对应两个不同的网络适配器。通过这种方式,即使一个网络适配器失效,ActiveMQ仍然能够通过另一个适配器进行通信。2.6仲裁模式配置示例仲裁模式下,ActiveMQ使用仲裁者来决定哪个节点应该成为主节点。以下是一个使用ZooKeeper作为仲裁者的配置示例:<!--activemq.xml-->

<beanid="broker"class="org.apache.activemq.broker.BrokerService">

<propertyname="brokerName"value="arbiterBroker"/>

<propertyname="dataDirectory"value="${activemq.data}/arbiterBroker"/>

<propertyname="transportConnectors">

<list>

<refbean="connector"/>

</list>

</property>

<propertyname="plugins">

<list>

<beanclass="org.apache.activemq.cluster.failover.ZooKeeperMasterSlavePlugin">

<propertyname="zookeeperConnectionString"value="localhost:2181"/>

<propertyname="zookeeperPath"value="/activemq"/>

</bean>

</list>

</property>

</bean>

<beanid="connector"class="org.apache.activemq.transport.TransportConnector">

<propertyname="uri"value="tcp://localhost:61616?maximumConnections=1000"/>

</bean>在这个示例中,我们使用了ZooKeeperMasterSlavePlugin插件,并通过zookeeperConnectionString属性指定了ZooKeeper的连接信息,zookeeperPath属性指定了在ZooKeeper中存储ActiveMQ集群信息的路径。通过以上配置示例,我们可以看到ActiveMQ提供了多种方式来实现高可用性,包括主从模式、集群模式、持久化存储、多网络适配器和仲裁模式。选择哪种方式取决于具体的应用场景和需求,但无论哪种方式,都需要在配置文件中进行相应的设置,以确保ActiveMQ在遇到故障时能够自动恢复,保证服务的连续性和数据的完整性。3消息队列:ActiveMQ:高可用性配置详解3.1ActiveMQ集群配置3.1.1设置主从模式在ActiveMQ中,主从模式(Master-Slave)是一种简单的高可用性配置,其中一个节点作为主节点处理所有请求,而另一个节点作为从节点监听主节点的状态。当主节点发生故障时,从节点自动接管,确保消息处理的连续性。配置步骤在主节点上配置:<!--在activemq.xml中添加-->

<transportConnectors>

<transportConnectorname="openwire"uri="tcp://localhost:61616"/>

<transportConnectorname="slave"uri="vm://0?create=false"/>

</transportConnectors>在从节点上配置:<!--在activemq.xml中添加-->

<transportConnectors>

<transportConnectorname="openwire"uri="tcp://localhost:61617"/>

<transportConnectorname="master"uri="vm://0?create=true"/>

</transportConnectors>连接主从节点:在从节点的activemq.xml中,添加指向主节点的配置:<systemUsage>

<memoryUsage>

<maximumPhysicalMemorySize>100mb</maximumPhysicalMemorySize>

</memoryUsage>

<storeUsage>

<maximumSize>100mb</maximumSize>

</storeUsage>

</systemUsage>

<slave>

<masterConnector>

<transportConnectorRefref="openwire"/>

</masterConnector>

<masterConnection>

<broker>

<transportConnectorRefref="slave"/>

</broker>

</masterConnection>

</slave>3.1.2配置镜像集群镜像集群(MirroredMode)是ActiveMQ提供的一种更高级的高可用性配置,它通过复制消息和状态在多个节点间实现负载均衡和故障转移。所有节点都参与消息处理,但只有一个节点是活动的,其他节点作为镜像节点,当活动节点故障时,镜像节点自动升级为活动节点。配置步骤在所有节点上配置:<!--在activemq.xml中添加-->

<transportConnectors>

<transportConnectorname="openwire"uri="tcp://localhost:61616"/>

<transportConnectorname="cluster"uri="multicast://default"/>

</transportConnectors>启用镜像集群:在activemq.xml中,添加以下配置:<brokerxmlns="/schema/core"brokerName="BrokerA"dataDirectory="${activemq.data}/BrokerA">

<persistenceAdapter>

<kahaDBdirectory="${activemq.data}/BrokerA/kahadb"/>

</persistenceAdapter>

<transportConnectors>

<!--上述配置-->

</transportConnectors>

<clusterConnector>

<static>

<broker>

<transportConnectorRefref="cluster"/>

</broker>

</static>

</clusterConnector>

</broker>配置镜像策略:使用<brokerxmlns="/schema/core">标签,可以指定镜像策略,例如:<brokerxmlns="/schema/core"brokerName="BrokerA"dataDirectory="${activemq.data}/BrokerA">

<!--上述配置-->

<brokerPlugins>

<masterSlavePlugin>

<masterConnector>

<transportConnectorRefref="openwire"/>

</masterConnector>

<slaveConnector>

<transportConnectorRefref="cluster"/>

</slaveConnector>

</masterSlavePlugin>

</brokerPlugins>

</broker>3.1.3负载均衡与故障转移ActiveMQ的高可用性配置不仅限于主从模式和镜像集群,还可以通过负载均衡和故障转移策略进一步增强系统的稳定性和性能。负载均衡负载均衡是通过将消息均匀地分发到集群中的所有节点,以提高处理能力和响应速度。在ActiveMQ中,可以通过配置<loadBalancer>来实现。<loadBalancer>

<failover>

<broker>

<transportConnectorRefref="openwire"/>

</broker>

<broker>

<transportConnectorRefref="cluster"/>

</broker>

</failover>

</loadBalancer>故障转移故障转移是指当集群中的某个节点发生故障时,其他节点能够自动接管其工作,确保服务的连续性。在ActiveMQ中,故障转移可以通过<failover>策略实现,它会自动尝试连接到集群中的其他可用节点。<brokerxmlns="/schema/core"brokerName="BrokerA"dataDirectory="${activemq.data}/BrokerA">

<!--上述配置-->

<brokerPlugins>

<failoverPlugin>

<broker>

<transportConnectorRefref="openwire"/>

</broker>

<broker>

<transportConnectorRefref="cluster"/>

</broker>

</failoverPlugin>

</brokerPlugins>

</broker>示例代码以下是一个使用Java客户端连接到ActiveMQ集群的示例:importorg.apache.activemq.ActiveMQConnectionFactory;

publicclassActiveMQClusterClient{

publicstaticvoidmain(String[]args){

//配置连接工厂,使用故障转移策略

ActiveMQConnectionFactoryconnectionFactory=newActiveMQConnectionFactory(

"failover:(tcp://localhost:61616,tcp://localhost:61617)?randomize=false&initialReconnectDelay=0"

);

//创建连接

Connectionconnection=connectionFactory.createConnection();

//开始连接

connection.start();

//创建会话

Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);

//创建目的地

Destinationdestination=session.createQueue("MyQueue");

//创建消息生产者

MessageProducerproducer=session.createProducer(destination);

//创建消息

TextMessagemessage=session.createTextMessage("Hello,ActiveMQCluster!");

//发送消息

producer.send(message);

//关闭资源

producer.close();

session.close();

connection.close();

}

}此代码示例展示了如何使用故障转移策略连接到ActiveMQ集群,确保即使某个节点不可用,也能自动切换到其他节点,从而实现高可用性。通过上述配置和示例,可以有效地在ActiveMQ中实现高可用性,确保消息处理的连续性和系统的稳定性。4持久化与数据同步4.1理解ActiveMQ的持久化机制在ActiveMQ中,持久化机制是确保消息在服务器重启或故障后仍然可用的关键。ActiveMQ支持多种持久化策略,包括:KahaDB:这是一种基于日志的持久化存储,提供了高性能和高可靠性。LevelDB:一种快速的键值存储,适用于需要高速读写操作的场景。JDBC:通过JDBC连接到关系数据库,如MySQL、PostgreSQL等,适用于需要与现有数据库系统集成的场景。Memory:尽管不是持久化策略,但在某些场景下,将消息存储在内存中可以提供极高的性能。4.1.1配置KahaDBKahaDB是默认的持久化策略,其配置主要在activemq.xml文件中进行。以下是一个KahaDB配置的例子:<kahadbdirectory="${activemq.data}/kahadb"/>这里,directory属性指定了KahaDB数据存储的目录。4.2配置数据同步策略数据同步策略对于实现ActiveMQ的高可用性至关重要。ActiveMQ支持多种数据同步方式,包括:同步:消息在发送到客户端之前,必须先写入磁盘。异步:消息可以先发送给客户端,然后在后台写入磁盘。4.2.1配置同步策略在activemq.xml中,可以通过以下方式配置同步策略:<kahadbdirectory="${activemq.data}/kahadb"journalMaxFileLength="10485760"useJournalDiskSyncs="true"/>这里,useJournalDiskSyncs属性设置为true,表示使用同步写盘。4.3数据同步的常见问题与解决方法4.3.1问题1:性能瓶颈原因:同步写盘虽然保证了数据的持久性,但可能会成为性能瓶颈。解决方法:可以考虑使用异步写盘,或者优化磁盘I/O性能,如使用SSD。4.3.2问题2:数据丢失原因:在异步写盘模式下,如果在消息写入磁盘之前服务器发生故障,可能会导致数据丢失。解决方法:可以配置ActiveMQ的持久化策略为同步写盘,或者使用集群和镜像功能来提高数据的可靠性。4.3.3问题3:磁盘空间不足原因:如果消息量过大,可能会导致磁盘空间不足。解决方法:定期清理过期的消息,或者增加磁盘空间。在activemq.xml中,可以配置消息过期时间:<brokerxmlns="/schema/core"brokerName="localhost"dataDirectory="${activemq.data}">

<destinationPolicy>

<policyMap>

<policyEntries>

<policyEntrytopic=">"queue=">"producerFlowControl="true"maxPageSize="1048576"maxProducers="1000"maxConsumers="1000"maxEnrollments="1000"maxMessages="1000000"messageTTL="86400000"/>

</policyEntries>

</policyMap>

</destinationPolicy>

</broker>这里,messageTTL属性设置了消息的过期时间,单位为毫秒。4.3.4问题4:数据一致性原因:在集群环境中,如果数据同步策略配置不当,可能会导致数据一致性问题。解决方法:使用ActiveMQ的镜像功能,确保所有节点的数据一致。在activemq.xml中,可以配置镜像功能:<brokerxmlns="/schema/core"brokerName="localhost"dataDirectory="${activemq.data}">

<transportConnectors>

<transportConnectorname="openwire"uri="tcp://localhost:61616?wireFormat.maxFrameSize=10000000&wireFormat.cacheEnabled=false&transport.maintainConnection=false&transport.useAsyncSend=true&transport.useAsyncDispatch=true&transport.useThreadLocalConnection=true&transport.useSendWorkaround=true&transport.useTcpNoDelay=true&transport.useEpollNativeSelector=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=true&transport.useReceiveBufferSizeWorkaround=true&transport.useSendBufferSizeWorkaround=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论