java 發布訂閱

在這里插入圖片描述
1.發布者接口

package com.yy.subpub;
/**
* @Description: 發布者接口
* @author: leijing
* @date: 2016年9月29日 下午5:07:20
*/
public interface IPublisher<M> {
/**
* @Description: 向訂閱器發布消息
* @param subscribePublish 訂閱器
* @param message 消息
* @param isInstantMsg	是否立即發送
* @author: leijing
* @date: 2016年9月29日 下午5:08:52
*/
public void publish(SubscribePublish subscribePublish,M message,boolean isInstantMsg);
}

2.訂閱者接口

package com.yy.subpub;
/**
* @Description: 訂閱者接口
* @author: leijing
* @date: 2016年9月29日 下午5:07:20
*/
public interface ISubcriber<M> {
/**
* @Description: 訂閱
* @param: subscribePublish 訂閱器
* @author: leijing
* @date: 2016年9月29日 下午5:08:04
*/
public void subcribe(SubscribePublish subscribePublish);
/**
* @Description: 退訂
* @param: subscribePublish 訂閱器
* @author: leijing
* @date: 2016年9月29日 下午5:09:00
*/
public void unSubcribe(SubscribePublish subscribePublish);
/**
* @Description: 接收消息
* @param: publisher 發布者
* @param: message 消息
* @author: leijing
* @date: 2016年9月29日 下午5:09:44
*/
public void update(String publisher,M message);
}

3.訂閱器類

package com.yy.subpub;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/**
* @Description: 訂閱器類
* @author: leijing
* @date: 2016年9月29日 下午5:07:20
*/
public class SubscribePublish<M> {
//訂閱器名稱
private String name;
//訂閱器隊列容量
final int QUEUE_CAPACITY = 20;
//訂閱器存儲隊列
private BlockingQueue<Msg> queue = new ArrayBlockingQueue<Msg>(QUEUE_CAPACITY);
//訂閱者
private List<ISubcriber> subcribers = new ArrayList<ISubcriber>();
/**
* @Description:構造方法
* @param name
*/
public SubscribePublish(String name) {
this.name = name;
}
/**
* @Description: 接收發布者的消息
* @param publisher
* @param Msg
* @param isInstantMsg
* @author: leijing
* @date: 2016年9月29日 下午5:17:03
*/
public void publish(String publisher,M message,boolean isInstantMsg) {
if(isInstantMsg){
update(publisher,message);
return;
}
Msg<m> m = new Msg<m>(publisher,message);
if(!queue.offer(m)){
update();
}
}
/**
* @Description: 訂閱
* @param subcriber
* @return: void
* @author: leijing
* @date: 2016年9月29日 下午5:18:43
*/
public void subcribe(ISubcriber subcriber) {
subcribers.add(subcriber);
}
/**
* @Description: 退訂
* @param subcriber
* @return: void
* @author: leijing
* @date: 2016年9月29日 下午5:18:43
*/
public void unSubcribe(ISubcriber subcriber) {
subcribers.remove(subcriber);
}
/**
* @Description: 發送存儲隊列所有消息
* @return: void
* @author: leijing
* @date: 2016年9月29日 下午5:20:33
*/
public void update(){
Msg m = null;
while((m = queue.peek())!= null){
this.update(m.getPublisher(),(M)m.getMsg());
}
}
/**
* @Description: 發送消息
* @param publisher
* @param Msg
* @return: void
* @author: leijing
* @date: 2016年9月29日 下午5:14:29
*/
public void update(String publisher,M Msg) {
for(ISubcriber subcriber:subcribers){
subcriber.update(publisher,Msg);
}
}
}
/**
* @Description: 消息類
* @author: leijing
* @date: 2016年9月29日 下午5:25:21
*/
class Msg<M>{
private String publisher;
private M m;
public Msg(String publisher, M m) {
this.publisher = publisher;
this.m = m;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public M getMsg() {
return m;
}
public void setMsg(M m) {
this.m = m;
}
}

4.發布者實現類

package com.yy.subpub.imp;
import com.yy.subpub.IPublisher;
import com.yy.subpub.SubscribePublish;
/**
* @Description: 發布者實現類
* @author: leijing
* @date: 2016年9月29日 下午5:10:00
*/
public class PublisherImpOne<M> implements IPublisher<M>{
private String name;
public PublisherImpOne(String name) {
super();
this.name = name;
}
public void publish(SubscribePublish subscribePublish, M message,boolean isInstantMsg) {
subscribePublish.publish(this.name, message, isInstantMsg);
}
}

5.訂閱者實現類

package com.yy.subpub.imp;
import com.yy.subpub.ISubcriber;
import com.yy.subpub.SubscribePublish;
/**
* @Description: 訂閱者實現類
* @author: leijing
* @date: 2016年9月29日 下午5:10:00
*/
public class SubcriberImpOne<M> implements ISubcriber<M>{
public String name;
public SubcriberImpOne(String name) {
super();
this.name = name;
}
public void subcribe(SubscribePublish subscribePublish) {
subscribePublish.subcribe(this);
}
public void unSubcribe(SubscribePublish subscribePublish) {
subscribePublish.unSubcribe(this);
}
public void update(String publisher,M message) {
System.out.println(this.name+"收到"+publisher+"發來的消息:"+message.toString());
}
}

6.測試類

package com.yy.subpub;
import com.yy.subpub.imp.PublisherImpOne;
import com.yy.subpub.imp.SubcriberImpOne;
/**
* @Description: 發布訂閱測試類
* @author: leijing
* @date: 2016年9月29日 下午5:28:53
*/
public class SubPubTest {
public static void main(String[] args) {
SubscribePublish<string> subscribePublish = new SubscribePublish<string>("訂閱器");
IPublisher<string> publisher1 = new PublisherImpOne<string>("發布者1");
ISubcriber<string> subcriber1 = new SubcriberImpOne<string>("訂閱者1");
ISubcriber<string> subcriber2 = new SubcriberImpOne<string>("訂閱者2");
subcriber1.subcribe(subscribePublish);
subcriber2.subcribe(subscribePublish);
publisher1.publish(subscribePublish, "welcome",true);
publisher1.publish(subscribePublish, "to",true);
publisher1.publish(subscribePublish, "yy",false);
}
}

測試結果:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249722.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249722.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249722.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

.NET Core Session的簡單使用

前言 在之前的.NET 里&#xff0c;我們可以很容易的使用Session讀取值。那今天我們來看看 如何在.NET Core中讀取Session值呢&#xff1f; Session 使用Session之前&#xff0c;我們需要到Startup.cs中配置我們的服務如下&#xff1a; ①在ConfigureServices中加入&#xff1a;…

EasyNVR內網攝像機接入網關+EasyNVS云端管理平臺,組件起一套輕量級類似于企業級螢石云的解決方案...

背景分析 對于EasyNVR我們應該都了解&#xff0c;主要應用于互聯安防直播&#xff0c;對于EasyNVR&#xff0c;我們可以清楚的發現&#xff0c;EasyNVR的工作機制是EasyNVR拉取攝像機的RTSP/Onvif視頻流&#xff0c;然后客戶端可以通過訪問EasyNVR服務端實現流分發&#xff0c;…

java.util.Queue用法

隊列是一種特殊的線性表&#xff0c;它只允許在表的前端&#xff08;front&#xff09;進行刪除操作&#xff0c;而在表的后端&#xff08;rear&#xff09;進行插入操作。進行插入操作的端稱為隊尾&#xff0c;進行刪除操作的端稱為隊頭。隊列中沒有元素時&#xff0c;稱為空隊…

Vim刪除文件到行首或者行尾

vim用的不是很熟練&#xff0c;只是有時候需要的時候會學習一下 我們知道&#xff0c;vim有三種模式&#xff0c;一種是一般模式&#xff0c;一種是編輯模式&#xff0c;另外一種是命令行模式 在一般模式下&#xff0c;可以進行刪除&#xff0c;復制粘貼等操作&#xff0c;在編…

新版本微信導致的ios表單bug

解決方法如下&#xff1a; $(document).delegate(input, textarea, select, blur, function(){setTimeout(function(){$(html).animate({height: 100.1vh}, 100, function(){$(this).animate({height: 100vh}, 1)})},100); }); 轉載于:https://www.cnblogs.com/qdlhj/p/1033676…

Golang的值類型和引用類型的范圍、存儲區域、區別

常見的值類型和引用類型分別有哪些&#xff1f; 值類型&#xff1a;基本數據類型 int 系列, float 系列, bool, string 、數組和結構體struct&#xff0c;使用這些類型的變量直接指向存在內存中的值&#xff0c;值類型的變量的值通常存儲在棧中。 引用類型&#xff1a;指針、sl…

python3之time模塊

時間戳1: import time2: print(time.time()) 可讀的時間格式1: import time2: print(time.ctime())3: later time.time() 6004: print(time.ctime(later)) 結果1: Wed Jan 30 17:11:49 20192: Wed Jan 30 17:21:49 2019 暫停程序(進程或者線程)1: time.sleep(secs) 計時時鐘1…

網絡規劃設計(項目類業務)

前期準備&#xff1a;找經開部要到當地的現場結構圖 1.和通信段約好時間&#xff0c;實地跑一趟&#xff0c;找到光纜、電纜的原匯聚點。 2.與車間人員溝通&#xff0c;看是否要遷匯聚點&#xff0c;倘若遷匯聚點&#xff0c;遷到哪里。 3.怎么從光纜/電纜的舊址遷到新址&#…

RPC框架實現原理

一、什么是RPC框架&#xff1f; RPC&#xff0c;全稱為Remote Procedure Call&#xff0c;即遠程過程調用&#xff0c;是一種計算機通信協議。 比如現在有兩臺機器&#xff1a;A機器和B機器&#xff0c;并且分別部署了應用A和應用B。假設此時位于A機器上的A應用想要調用位于B機…

jQuery安裝

http://www.runoob.com/jquery/jquery-install.html 網頁中添加jQuery&#xff1a; 方法一&#xff1a;可以從http://jquery.com/download/ 下載jQuery庫 方法二&#xff1a;從CDN中載入jQuery 下載 jQuery 有兩個版本的 jQuery 可供下載&#xff1a; Production version - 用于…

redhat相關配置

網絡配置&#xff1a; vi /etc/sysconfig/network-scripts/ifcfg-eth BOOTPROTOstaticONBOOTyesIP配置IPADDR192.168.31.102NETMASK255.255.255.0GATEWAY192.168.31.1DNS1192.168.31.1redhat6&#xff1a;防火墻&#xff1a;1. 永久性生效開啟&#xff1a;chkconfig iptables o…

zookeeper入門系列

zookeeper可謂是目前使用最廣泛的分布式組件了。其功能和職責單一&#xff0c;但卻非常重要。 在現今這個年代&#xff0c;介紹zookeeper的書和文章可謂多如牛毛&#xff0c;本人不才&#xff0c;試圖通過自己的理解來介紹zookeeper&#xff0c;希望通過一個初學者的視角來學習…

java.lang.NumberFormatException: multiple points錯誤問題

最近項目一直會出現時間轉換報錯&#xff0c;一直不知道是什么問題??? java.lang.NumberFormatException: multiple pointsat sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1110)at java.lang.Double.parseDouble(Double.java:540)at java.text.Dig…

plsql查詢數據中文亂碼

在plsql中進行表數據查詢的時候&#xff0c;發現查詢出來的中文居然顯示為亂碼&#xff0c;通過查找資料解決該問題。 1、查看數據的編碼&#xff08;語句&#xff1a;select * from v$nls_parameters&#xff09; 發現顯示的語言不是我們常用的GBK模式 2、配置本機語言環境變量…

Zookeeper的功能以及工作原理

1.ZooKeeper是什么&#xff1f; ZooKeeper是一個分布式的&#xff0c;開放源碼的分布式應用程序協調服務&#xff0c;是Google的Chubby一個開源的實現&#xff0c;它是集群的管理者&#xff0c;監視著集群中各個節點的狀態根據節點提交的反饋進行下一步合理操作。最終&#xf…

前端學習總結——CSS布局方式之傳統布局

傳統布局 傳統布局即是早期在平板電腦、智能手機等移動設備并不流行的時候使用的布局方式。 一、表格布局 例如&#xff1a;采用表格方式實現如下簡單模型的布局 &#xff08;1&#xff09;固定布局 即用具體的像素值來確定模型的寬和高等值。 HTML代碼如下所示 <tabl…

aspose word for java去除目錄文字藍色樣式以及文字下方藍色下劃線

//去除目錄文字藍色樣式以及文字下方藍色下劃線for(FieldStart field: (Iterable<FieldStart>)doc.getChildNodes(NodeType.FIELD_START, true)){if (field.getFieldType() FieldType.FIELD_HYPERLINK){FieldHyperlink hyperlink (FieldHyperlink)field.getField();//判…

[POI2007]MEG-Megalopolis

傳送門&#xff1a;嘟嘟嘟 第一反應是樹鏈剖分&#xff0c;但是太長懶得寫&#xff0c;然后就想出了一個很不錯的做法。 想一下&#xff0c;如果我們改一條邊&#xff0c;那么影響的只有他的子樹&#xff0c;只要先搞一個dfs序&#xff0c;為什么搞出這個呢&#xff1f;因為有一…

memcache在ThinkPHP中的使用1---PHP下安裝memcache

1.什么是Memcached緩存 Memcached是一套小巧、高效且成熟的內存數據庫。與普通的數據庫不同&#xff0c;Memcached存儲的數據只能是簡單的鍵值對&#xff0c;在查詢時需要根據存放的key獲取數據。 Memcached最大的特點是數據存放于內存&#xff0c;性能會比傳統文件系統高出…

【集合工具類:Collections】

集合工具類&#xff1a;Collections(1) 是針對集合進行操作的工具類(2) 面試題&#xff1a;Collection 和 Collections 的區別A:Collection 是單列集合的頂層接口&#xff0c;有兩個子接口 List 和 SetB:Collections 是針對集合進行操作的工具類&#xff0c;可以對集合進行排序…