1. 程式人生 > >ActiveMQ訊息中介軟體 原理詳解 &&附demo實現、以及與springboot整合的demo

ActiveMQ訊息中介軟體 原理詳解 &&附demo實現、以及與springboot整合的demo

一、 訊息中介軟體概述

1. 什麼是訊息中介軟體?

面向訊息的中介軟體(MessageOrlented MiddlewareMOM)較好的解決了以上問題。傳送者將訊息傳送給訊息伺服器,

訊息伺服器將消感存放在若千佇列中,在合適的時候再將訊息轉發給接收者。

這種模式下,傳送和接收是非同步的,傳送者無需等待; 二者的生命週期未必相同: 傳送訊息的時候接收者不一定執行,接收訊息的時候傳送者也不一定執行;

一對多通訊: 對於一個訊息可以有多個接收者。

二、 JMS介紹

2.1 什麼是JMS?

JMS是java的訊息服務,JMS的客戶端之間可以通過JMS服務進行非同步的訊息傳輸。

2.2 什麼是訊息模型?

○ Point-to-Point(P2P) --- 點對點

○ Publish/Subscribe(Pub/Sub)---  釋出訂閱

即點對點和釋出訂閱模型

2.2.1 P2P (點對點)

P2P

1.P2P模式圖


2.涉及到的概念

1.訊息佇列(Queue)

2.傳送者(Sender)

3.接收者(Receiver)

4.每個訊息都被髮送到一個特定的佇列,接收者從佇列中獲取訊息。佇列保留著訊息,直到他們被消費或超時。

3.P2P的特點

1.每個訊息只有一個消費者(Consumer)(即一旦被消費,訊息就不再在訊息佇列中)

2.傳送者和接收者之間在時間上沒有依賴性,也就是說當傳送者傳送了訊息之後,不管接收者有沒有正在執行,它不會影響到訊息被髮送到佇列

3.接收者在成功接收訊息之後需向佇列應答成功

如果你希望傳送的每個訊息都應該被成功處理的話,那麼你需要P2P模式。

4.應用場景

QQ、微信、微博等社交軟體上的私信,不都是這樣的嗎?

2.2.2Pub/Sub (釋出與訂閱)

1.Pub/Sub模式圖

2.涉及到的概念 

1.主題(Topic)

2.釋出者(Publisher)


3.訂閱者(Subscriber) 

4.客戶端將訊息傳送到主題。多個釋出者將訊息傳送到Topic,系統將這些訊息傳遞給多個訂閱者。

3.Pub/Sub的特點

1.每個訊息可以有多個消費者

2.釋出者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須建立一個訂閱者之後,才能消費釋出者的訊息,而且為了消費訊息,訂閱者必須保持執行的狀態。

3.為了緩和這樣嚴格的時間相關性,JMS允許訂閱者建立一個可持久化的訂閱。這樣,即使訂閱者沒有被啟用(執行),它也能接收到釋出者的訊息。

4.如果你希望傳送的訊息可以不被做任何處理、或者被一個訊息者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型


4.訊息的消費 

在JMS中,訊息的產生和訊息是非同步的。對於消費來說,JMS的訊息者可以通過兩種方式來消費訊息。 

○ 同步 

訂閱者或接收者呼叫receive方法來接收訊息,receive方法在能夠接收到訊息之前(或超時之前)將一直阻塞 。

○ 非同步 

訂閱者或接收者可以註冊為一個訊息監聽器。當訊息到達之後,系統自動呼叫監聽器的onMessage方法。

5.應用場景

微信公眾號


三、 MQ產品的分類

RabbitMQ

是使用Erlang編寫的一個開源的訊息佇列,本身支援很多的協議:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它變的非常重量級,更適合於企業級的開發。同時實現了一個經紀人(Broker)構架,這意味著訊息在傳送給客戶端時先在中心佇列排隊。對路由(Routing),負載均衡(Load balance)或者資料持久化都有很好的支援。

Redis
是一個Key-Value的NoSQL資料庫,開發維護很活躍,雖然它是一個Key-Value資料庫儲存系統,但它本身支援MQ功能,所以完全可以當做一個輕量級的佇列服務來使用。對於RabbitMQ和Redis的入隊和出隊操作,各執行100萬次,每10萬次記錄一次執行時間。測試資料分為128Bytes、512Bytes、1K和10K四個不同大小的資料。實驗表明:入隊時,當資料比較小時Redis的效能要高於RabbitMQ,而如果資料大小超過了10K,Redis則慢的無法忍受;出隊時,無論資料大小,Redis都表現出非常好的效能,而RabbitMQ的出隊效能則遠低於Redis。

ZeroMQ

號稱最快的訊息佇列系統,尤其針對大吞吐量的需求場景。ZMQ能夠實現RabbitMQ不擅長的高階/複雜的佇列,但是開發人員需要自己組合多種技術框架,技術上的複雜度是對這MQ能夠應用成功的挑戰。ZeroMQ具有一個獨特的非中介軟體的模式,你不需要安裝和執行一個訊息伺服器或中介軟體,因為你的應用程式將扮演了這個服務角色。你只需要簡單的引用ZeroMQ程式庫,可以使用NuGet安裝,然後你就可以愉快的在應用程式之間傳送訊息了。但是ZeroMQ僅提供非永續性的佇列,也就是說如果down機,資料將會丟失。其中,Twitter的Storm中使用ZeroMQ作為資料流的傳輸。

ActiveMQ

是Apache下的一個子專案。 類似於ZeroMQ,它能夠以代理人和點對點的技術實現佇列。同時類似於RabbitMQ,它少量程式碼就可以高效地實現高階應用場景。RabbitMQ、ZeroMQ、ActiveMQ均支援常用的多種語言客戶端 C++、Java、.Net,、Python、 Php、 Ruby等

Jafka/Kafka

Kafka是Apache下的一個子專案,是一個高效能跨語言分散式Publish/Subscribe訊息佇列系統,而Jafka是在Kafka之上孵化而來的,即Kafka的一個升級版。具有以下特性:快速持久化,可以在O(1)的系統開銷下進行訊息持久化;高吞吐,在一臺普通的伺服器上既可以達到10W/s的吞吐速率;完全的分散式系統,Broker、Producer、Consumer都原生自動支援分散式,自動實現複雜均衡;支援Hadoop資料並行載入,對於像Hadoop的一樣的日誌資料和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka通過Hadoop的並行載入機制來統一了線上和離線的訊息處理,這一點也是本課題所研究系統所看重的。Apache Kafka相對於ActiveMQ是一個非常輕量級的訊息系統,除了效能非常好之外,還是一個工作良好的分散式系統。

其他一些佇列列表HornetQ、Apache Qpid、Sparrow、Starling、Kestrel、Beanstalkd、Amazon SQS就不再一一分析。

四、 ActiveMQ使用

4.1 、window下 ActiveMQ安裝

ActiveMQ部署其實很簡單,和所有Java一樣,要跑java程式就必須先安裝JDK並配置好環境變數,這個很簡單。

1.解壓下載的apache-activemq-5.11-bin.zip壓縮包到一個目錄,得到解壓後的目錄結構如下圖:


2.進入bin目錄,發現有win32和win64兩個資料夾,這2個資料夾分別對應windows32位和windows64位作業系統的啟動指令碼。


3.我的實驗環境是windows10,就進入win64目錄,會看到如下目錄結構。


4.其中activemq.bat便是啟動指令碼,雙擊啟動。


看到這樣的標誌,部署成功了!

ActiveMQ預設啟動到8161埠,啟動完了後在瀏覽器位址列輸入:http://localhost:8161/admin要求輸入使用者名稱密碼,預設使用者名稱密碼為admin、admin,這個使用者名稱密碼是在conf/users.properties中配置的。

輸入使用者名稱密碼後便可看到如下圖的ActiveMQ控制檯介面了。

4.1.1 控制檯介紹

看下圖:


Number Of Consumers  消費者 這個是消費者端的消費者數量 

Number Of Pending Messages 等待消費的訊息 這個是當前未出佇列的數量。可以理解為總接收數-總出佇列數

Messages Enqueued 進入佇列的訊息  進入佇列的總數量,包括出佇列的。 這個數量只增不減 

Messages Dequeued 出了佇列的訊息  可以理解為是消費這消費掉的數量 


這個要分兩種情況理解 

在queues裡它和進入佇列的總數量相等(因為一個訊息只會被成功消費一次),如果暫時不等是因為消費者還沒來得及消費。 

在 topics裡 它因為多消費者從而導致數量會比入佇列數高。 

簡單的理解上面的意思就是 

當有一個訊息進入這個佇列時,等待消費的訊息是1,進入佇列的訊息是1。

當訊息消費後,等待消費的訊息是0,進入佇列的訊息是1,出佇列的訊息是1. 

在來一條訊息時,等待消費的訊息是1,進入佇列的訊息就是2. 

沒有消費者時  Pending Messages   和 入佇列數量一樣 

有消費者消費的時候 Pedding會減少 出佇列會增加 

到最後 就是 入佇列和出佇列的數量一樣多 

以此類推,進入佇列的訊息和出佇列的訊息是池子,等待消費的訊息是水流。

4.2 、實現點對點通訊模式

 使用ActiveMQ完成點對點(p2p)通訊模式

1.引入pom檔案依賴

	<dependencies>
		<dependency>
			<groupId>org.apache.activemq</groupId>
			<artifactId>activemq-core</artifactId>
			<version>5.7.0</version>
		</dependency>
	</dependencies>


生產者:

public class P2PProduct {
	
	private  static  final  String USERNAME="admin";
	private  static  final  String PASSWORD="admin";
	private  static  final  String BROKERURL="tcp://127.0.0.1:61616";
	private  static  final  String QUEUENAME="myQueue";
	public static void main(String[] args) throws JMSException {
		start();
	}
	static void start() throws JMSException{
		//connectionFactory,jsm用它建立連線
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
		//jms客戶端到jmsprovide的連線
		Connection connection = connectionFactory.createConnection();
		//啟動連線
		connection.start();
		//Session 一個傳送或接受訊息的執行緒    設定訊息可靠性   自動簽收
		Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
		//訊息的目的地;訊息傳送給誰.
		Queue queue = session.createQueue(QUEUENAME);
		//訊息生產者
		MessageProducer producer = session.createProducer(queue);
		//存放訊息佇列
		for(int i=1;i<=5;i++){
		TextMessage textMessage = session.createTextMessage("HELLO ACTIVEMQ: I'M: "+i);
		producer.send(textMessage);
		}
		System.out.println("訊息佇列內容存放。。。。成功。。。");
		session.close();
		connection.close();
	}
}



消費者:
public class P2PConsumer {
	private static final String USERNAME = "admin";
	private static final String PASSWORD = "admin";
	private static final String BROKERURL = "tcp://127.0.0.1:61616";
	private static final String QUEUENAME = "myQueue";

	public static void main(String[] args) throws JMSException {
		start();
	}
	static void start() throws JMSException {
		//連線工廠,JMS 用它建立連線
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
		//JMS 客戶端到JMS Provider 的連線
		Connection connection = connectionFactory.createConnection();
		//開啟連線
		connection.start();
		//JMS 客戶端到JMS Provider 的連線  設定訊息可靠性   手動簽收
		Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
		//訊息的目的地;訊息傳送給誰.
		Queue queue = session.createQueue(QUEUENAME);
		// 消費者,訊息接收者
		MessageConsumer consumer = session.createConsumer(queue);
		while (true) {
			//消費者接受訊息,
			TextMessage receive = (TextMessage) consumer.receive();
			//如果生產者有訊息傳送過來,就直接輸出,並手工應答生產者,我已經收到訊息了!
			if (receive != null) {
				System.out.println("ActiveMQ訊息接收成功。。訊息內容:" + receive.getText());
				//手工應答
				receive.acknowledge();
			} else {
				break;
			}
		}
		session.close();
		connection.close();
	}
}



4.3 、JMS訊息可靠機制

ActiveMQ訊息簽收機制:客戶端成功接收一條訊息的標誌是一條訊息被簽收,成功應答。

訊息的簽收情形分兩種:1、帶事務的session  如果session帶有事務,並且事務成功提交,則訊息被自動簽收。如果事務回滾,則訊息會被再次傳送。2、不帶事務的session  不帶事務的session的簽收方式,取決於session的配置。

   Activemq支援一下三種模式:   1.Session.AUTO_ACKNOWLEDGE  訊息自動簽收   2.Session.CLIENT_ACKNOWLEDGE  客戶端呼叫acknowledge方法手動簽收3.textMessage.acknowledge();//手動簽收 4.Session.DUPS_OK_ACKNOWLEDGE 不是必須簽收,訊息可能會重複傳送。在第二次重新傳送訊息的時候,訊息只有在被確認之後,才認為已經被成功地消費了。訊息的成功消費通常包含三個階段:客戶接收訊息、客戶處理訊息和訊息被確認。 在事務性會話中,當一個事務被提交的時候,確認自動發生。在非事務性會話中,訊息何時被確認取決於建立會話時的應答模式(acknowledgement mode)。該引數有以下三個可選值:

Number Of Consumers  消費者 這個是消費者端的消費者數量 Number Of Pending Messages 等待消費的訊息 這個是當前未出佇列的數量。可以理解為總接收數-總出佇列數 Messages Enqueued 進入佇列的訊息  進入佇列的總數量,包括出佇列的。 這個數量只增不減 Messages Dequeued 出了佇列的訊息  可以理解為是消費這消費掉的數量 

4.4 、釋出訂閱 生產者:

/**
 * 
 * @author WangYongSheng
 *釋出訂閱生產者
 */
public class TopicProduct {
	
	private  static  final  String USERNAME="admin";
	private  static  final  String PASSWORD="admin";
	private  static  final  String BROKERURL="tcp://127.0.0.1:61616";
	private  static  final  String TOPICNAME="myTopic";
	public static void main(String[] args) throws JMSException {
		start();
	}
	static void start() throws JMSException{
		//connectionFactory,jsm用它建立連線
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
		//jms客戶端到jmsprovide的連線
		Connection connection = connectionFactory.createConnection();
		//啟動連線
		connection.start();
		//Session 一個傳送或接受訊息的執行緒    設定訊息可靠性   手動簽收
		Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
		//建立一個佇列
		Topic topic = session.createTopic(TOPICNAME);
		//訊息生產者 釋出
		MessageProducer producer = session.createProducer(topic);
		//存放訊息佇列
		for(int i=1;i<=5;i++){
		TextMessage textMessage = session.createTextMessage("HELLO ACTIVEMQ: I'M: "+i);
		producer.send(textMessage);
		}
		System.out.println("訊息佇列內容存放。。。。成功。。。");
		session.close();
		connection.close();
	}
}


消費者:

/**
 * 
 * @author WangYongSheng
 *釋出訂閱消費者
 */
public class TopicConsumer {
	private static final String USERNAME = "admin";
	private static final String PASSWORD = "admin";
	private static final String BROKERURL = "tcp://127.0.0.1:61616";
	private static final String TOPICNAME = "myTopic";


	public static void main(String[] args) throws JMSException {
		start();
	}
	static void start() throws JMSException {
		//connectionFactory,jsm用它建立連線
		ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(USERNAME, PASSWORD, BROKERURL);
		//jms客戶端到jms provide的連線
		Connection connection = connectionFactory.createConnection();
		//啟動連線
		connection.start();
		//Session 一個傳送或接受訊息的執行緒    設定訊息可靠性   手動簽收
		Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
		//建立一個佇列
		Topic createTopic = session.createTopic(TOPICNAME);
		//訊息消費者  進行訂閱
		MessageConsumer consumer = session.createConsumer(createTopic);
		while (true) {
			//消費者接受訊息
			TextMessage receive = (TextMessage) consumer.receive();
			//如果生產者有訊息傳送過來,就直接輸出,並手工應答生產者,我已經收到訊息了!
			if (receive != null) {
				System.out.println("ActiveMQ訊息訂閱成功。。訊息內容:" + receive.getText());
				//手工應答
				receive.acknowledge();
			} else {
				break;
			}
		}
		session.close();
		connection.close();
	}
}


4.5 、SpringBoot整合ActiveMQ

生產者:

4.5.1 引入 maven依賴

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<!-- spring boot web支援:mvc,aop... -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-activemq</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

4.5.2 引入 YML配置

application.yml

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
queue: kmx.pas.job.sgtest
4.5.3 建立QueueConfig
@Configuration
public class QueueConfig {
	@Value("${queue}")
	private String queue;

	@Bean
	public Queue logQueue() {
		return new ActiveMQQueue(queue);
	}
}
4.5.4 建立Product
@Component
@EnableScheduling
public class Producer {
	@Autowired
	private JmsMessagingTemplate jmsMessagingTemplate;
	@Autowired
	private Queue queue;

	@Scheduled(fixedDelay = 5000)
	public void send() {
		jmsMessagingTemplate.convertAndSend(queue, "測試訊息佇列" + System.currentTimeMillis());
	}
}
4.5.5 啟動
@SpringBootApplication
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}
消費者:

4.5.1 引入 maven依賴

<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
		<!-- spring boot web支援:mvc,aop... -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-activemq</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>
4.5.2 引入 YML配置

application.yml

spring:
  activemq:
    broker-url: tcp://127.0.0.1:61616
    user: admin
    password: admin
queue: kmx.pas.job.sgtest
4.5.3 建立Consumer
@Component
public class Consumer {

	@JmsListener(destination = "${queue}")
	public void receive(String msg) {
		System.out.println("監聽器收到msg:" + msg);
	}

}
4.5.4 啟動
@SpringBootApplication
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}





相關推薦

ActiveMQ訊息中介軟體 原理 &&demo實現以及springboot整合demo

一、 訊息中介軟體概述1. 什麼是訊息中介軟體? 面向訊息的中介軟體(MessageOrlented MiddlewareMOM)較好的解決了以上問題。傳送者將訊息傳送給訊息伺服器, 訊息伺服器將消感

JMS訊息中介軟體原理ActiveMQ在企業中的應用(接上篇)

程式碼實現:傳送訊息---》接受訊息---》伺服器配置 //1 傳送訊息(接受回覆訊息) public class SenderMessageService { //釋出指定訊息到指定地址(在釋出之前,建議將訊息儲存到資料庫)  public void publish(St

ActiveMQ訊息中介軟體入門學習

同步通訊:客戶端向伺服器端發出請求,並一直等待伺服器端的響應。直到獲取到伺服器端返回的響應資訊,客戶端才能繼續執行。 MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方

ActiveMQ——訊息中介軟體深入學習

  訊息中間件概述 訊息中介軟體產生的背景 在客戶端與伺服器進行通訊時.客戶端呼叫後,必須等待服務物件完成處理返回結果才能繼續執行。  客戶與伺服器物件的生命週期緊密耦合,客戶程序和服務物件程序都都必須正常執行;如果由於服務物件崩潰或者網路故障導致使

ActiveMQ訊息中介軟體-hello world

生產者 package com.wuk.mq; import java.util.concurrent.TimeUnit; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.

activemq訊息中介軟體--JMS概述(1)

1 JMS概述 目前現在很多的RPC中介軟體技術都有如下問題: (1)同步通訊,客戶端發出呼叫請求,必須等待服務端處理完成以後返回結果才能繼續執行。 (2)客戶和服務物件的生命週期緊密耦合,客戶程序和服務程序都必須正常進行,如果由於服務物件的崩潰和網路故障導致客戶請求不可達,客戶收到

ActiveMQ 訊息中介軟體

什麼是ActiveMQ ActiveMQ是Apache出品,能力強勁的開源訊息匯流排。ActiveMQ 是一個完全支援JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出臺已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。 JMS介紹 JMS的全

Dubbo+Zookeeper架構—高階篇17—Linux安裝ActiveMQ訊息中介軟體

IP:192.168.126.131   環境:CentOS 6.6、JDK8 1、 安裝 JDK 並配置環境變數(略) JAVA_HOME=/usr/local/java/jdk1.8.0_72  2、 下載 Linux 版的 ActiveMQ(當前最新版 apach

淘寶JAVA中介軟體Diamond(一)---簡介&快速使用

大家好,今天開始為大家帶來我們通用產品團隊的產品 —— diamond的專題,本次為大家介紹diamond的概況和快速使用。 一、概況 diamond是淘寶內部使用的一個管理持久配置的系統,它的特點是簡單、可靠、易用,目前淘寶內部絕大多數系統的配置,由diamond來進行統一管理。 diamond為

淘寶JAVA中介軟體Diamond(1)-簡介&快速使用

感謝有奉獻精神的人 轉自:http://my.oschina.net/u/435621/blog/270483?p=1 淘寶JAVA中介軟體Diamond詳解(一)---簡介&快速使用 大家好,今天開始為大家帶來我們通用產品團隊的產品 —— diamon

Veritas Velocity資料副本管理技術原理(報告)

      Veritas Velocity資料副本管理解決方案能夠以自助方式隨時提供對所需資料

01.什麼是中介軟體)(轉)

目錄   背景 正文 1. 由來 2. 中介軟體的起源 2.1 中介軟體發展的歷史 2.2 中介軟體發展的驅動力 3. 中介軟體的概念 3.1 中介軟體的特徵(內涵) 平臺化 應用支撐 軟體複用 耦合關係 互操作性 3.

訊息中介軟體原理及JMS簡介之一

在寫部落格的時候,找到這樣一篇部落格,分析總結的很好,學習了,感謝博主的分享,轉載到這裡 原文作者:orangelizq -------------------------------------------------------------------- 摘要:

ActiveMQ訊息中介軟體學習(一)

同步通訊:客戶端向伺服器端發出請求,並一直等待伺服器端的響應。直到獲取到伺服器端返回的響應資訊,客戶端才能繼續執行。 MQ全稱為Message Queue, 訊息佇列(MQ)是一種應用程式對應用程式的通訊方法。應用程式通過讀寫出入佇列的訊息(針對應用程式的資料)來通訊,而

訊息中介軟體原理及JMS簡介之二

哈,還是原作者的哦 原文作者:orangelizq ---------------------------------------- 2.3 訊息中介軟體的傳遞模式 訊息中介軟體一般有兩種傳遞模型:點對點模型(PTP)和釋出-訂閱模型(Pub/Sub)[2]。 1.

activeMQ訊息中介軟體spring的整合

activemq是基於jetty服務容器的,可在原始碼中發現。 1.maven依賴jar <!-- ActiveMQ --> <dependency> <groupId>org.apache.activemq</group

訊息中介軟體原理及JMS簡介(2)

  2.3 訊息中介軟體的傳遞模式   訊息中介軟體一般有兩種傳遞模型:點對點模型(PTP)和釋出-訂閱模型(Pub/Sub)。   1. 點對點模型(PTP)   點對點模型用於訊息生產者和訊息消費者之間點到點的通訊。訊息生產者將訊息發動到由某個名字標識的特定消費者。這個名字實際上對應於訊息服務中的一個佇

初識ActiveMQ訊息中介軟體

ActiveMQ官方網站:https://activemq.apache.org/ 關於ActiveMQ訊息傳遞的方式詳見:ht

iOS UITabBarController用法原理(一)自定義tabbar

UITabBarController的原理:UITabBarController會一次性初始化所有子控制器,但是預設只加載第一個控制器檢視,其他檢視控制器只初始化預設不會載入,只有當需要顯示的時候才loadView載入,為了能夠將其他子控制器也正常顯示在Tab bar中,我們

用Burg法估計AR模型的引數原理及matlab實現

用Burg法估計AR模型的引數。藉助如圖所示的格型預測誤差濾波器,伯格法通過求出前向預測誤差和後向預測誤差的平均功率來選取最佳的反射係數k,使誤差的平均功率取得最小值,進而通過反饋求出模型係數和噪聲方差,該演算法可直接通過分析觀測資料得到需要的模型引數,而不用取求解計算量較大