MES: ESB
ESB定义了消息的收发和收发池,对于各种通讯方式定义了收发API,在收到信息后由eventBus来发布消息
ISender:
public abstract interface ISender { public abstract void send(Object paramObject) throws Exception; public abstract Object sendRequest(Object paramObject, double paramDouble) throws Exception; }
IListener:
public abstract interface IListener { public abstract void connect() throws Exception; public abstract void disconnect() throws Exception; public abstract boolean isconnect() throws Exception; public abstract void destroy() throws Exception; }
SenderPool: 可以用GenericKeyedObjectPool<String, ISender>代替(线程安全的)
public abstract class SenderPool extends BasePooledObjectFactory<ISender> { private String id; private ObjectPool<ISender> pool; id,pool getter, setter... public PooledObject<ISender> wrap(ISender sender) { return new DefaultPooledObject<ISender>(sender); } public ISender borrowClient() throws Exception { return (ISender)getPool().borrowObject(); } public void returnClient(ISender sender) throws Exception { getPool().returnObject(sender); } public void destroy() throws Exception { getPool().clear(); } }
ListenerPool: 可以用GenericKeyedObjectPool<String, IListener>代替pool, method: listAllObjects() 可以用来遍历各个PooledObject,省去了ListenerCf
public abstract class ListenerPool { private String id; private ListenerCf config; private Set<IListener> pool = new CopyOnWriteArraySet<IListener>(); private EventBus eventBus; constructor, getter, setter... public void connect() throws Exception() { for (IListener listener : getPool()) listener.connect(); } public void disconnect() throws Exception { for (IListener listener : getPool()) listener.disconnect(); } public boolean isconnect() throws Exception { for (IListener listener : getPool()) if (!listener.isconnect()) return false; return true; } public void destroy() throws Exception { for (IListener listener : getPool()) listener.destroy(); } }
ESBFactory: map各个SenderPool, ListenerPool
public abstract class ESBFactory { private Map<String, SenderPool> senderMap = new ConcurrentHashMap<String, SenderPool>(); private Map<String, ListenerPool> listenerMap = new ConcurrentHashMap<String, ListenerPool>(); public abstract void initialize(); public void destroy() {对各个pool destroy并清空map} public void disconnect() {对各个pool disconnect} }
ESBComponent: @Startup, @Singleton
@Startup @Singleton public class ESBComponent { public static Set<ESBFactory> esbFactory = new CopyOnWriteArraySet(); public static Map<String, SenderPool> senderMap = new ConcurrentHashMap(); public static Map<String, ListenerPool> listenerMap = new ConcurrentHashMap(); @PostConstruct public void initialize() { 将esbFactory里的所有senderMap和ListenerMap中的所有Pool都整合到ESBComponent的senderMap和listenerMap中 } @Lock(LockType.READ) public void disconnect() { 。。。 } @Lock(LockType.READ) public boolean disconnect(String listener) { ... } public boolean isConnected(String listener) { ... } @PreDestroy public void destroy() throws Exception { ... } static { esbFactory.add(new TibcoFactory()); esbFactory.add(new FtpFactory()); esbFactory.add(new FileFactory()); esbFactory.add(new JmsFactory()); esbFactory.add(new IbmMqFactory()); } }
=================================================================================================
JmsSender: 用javax.jms来实现ISender,send是用来向destination发送textMessage,sendRequest是发送完接受返回数据的。(可以将两个重载设计)
public class JmsSender implements ISender { private String id; private Connection connection; private Session session; private int timeOut; private String destination; constructor with fields, setter, getter... public void send(String destination, Object object) throws Exception { InitialContext initialContext = null; try { initialContext = new InitialContext(); Destination des = (Destination)initialContext.lookup(destination); MessageProducer producer = this.session.createProducer(des); Message message = null; if ((object instanceof String)) { message = this.session.createTextMessage((String)object); } if (message != null) producer.send(message); } catch(JMSException e) { ... } finally { if (initialContext != null) initialContext.close(); } } } public Object sendRequest(String destination, Object object, double timeOut) throws Exception { InitialContext initialContext = null; try { initialContext = new InitialContext(); Queue queue = (Queue) initialContext.lookup(destination); MessageProducer producer = this.session.createProducer(queue); TemporaryQueue replyQueue = this.session.createTemporaryQueue(); MessageConsumer replyConsumer = this.seesion.createConsumer(replyQueue); Message message = null; if ((object instanceof String)) { message = this.session.createTextMessage((String)object); } if (message != null) { message.setJMSReplyTo(replyQueue); producer.send(message); Message replyMessage = replyConsumer.receive((long)timeOut); return replyMessage; } replyConsumer.close(); replyQueue.delete(); } catch (JMSException e) { ... } finally { if (initialContext != null) { initialContext.close(); } } return null; }
JmsSenderPool: extends SenderPool, 因此要实现create method.
public class JmsSenderPool extends SenderPool { private JmsSenderCf config; constructor with fields, setter, getter... public ISender create() throw Exception { InitialContext initialContext = null; try { String destination = this.config.getDestination(); initialContext = new initialContext(); ConnectionFactory cfact = (ConnectionFactory)initialContext.lookup(this.config.getConnectionFactory()); Connection connection = cfact.createConnection(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); connection.start(); JmsSender sender = new JmsSender(getId(), connection, session, destination, this.config.getTimeOut()); return sender; } finally { if (initialContext != null) initialContext.close(); } } }
JmsListener: 实现IListener, MessageListener. (可以将IListener去掉,Consumer的创建放到JmsListenerPool中)
onMessage Method:
public void onMessage(Message request) { try { JmsMessage message = new JmsMessage(); message.setMessage(request); Destination replyQueue = request.getJMSReplyTo(); if (replyQueue == null) { String replyTo = request.getStringProperty("JMSReplyTo"); if ((replyTo != null) && (replyTo.trim().length() > 0)) { replyQueue = (Destination) this.initialContext.lookup(replyTo); } if (replyQueue == null) replyQueue = this.defaultReplyQueue; } request.setJMSReplyTo(replyQueue); message.setConnection(this.connection); } this.eventBus.post(message); } catch ... }
最关键的是this.eventBus.post(message);即用eventBus发布消息
JmsListenerPool:
JmsFactory: 读取配置文件,并初始化ListenerPool和SenderPool
MES: ESB的更多相关文章
- 微服务理论之六:ESB与SOA的关系
一.SOA和ESB一直是没有明确概念的两个缩略词 SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服务整合来解决系统集成的 ...
- 杂项:ESB接口
ylbtech-杂项:ESB接口 ESB全称为Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢, ...
- 企业 SOA 设计(1)–ESB 设计
最近为公司完成了一个 ESB 的设计.下面简要说明一下具体的设计方案. 企业 SOA 整体方案 在前一篇<SOA.ESB.NServiceBus.云计算 总结>中说到,SOA 是面向服 ...
- 面向服务架构(SOA)和企业服务总线(ESB)
http://www.cnblogs.com/shanyou/archive/2008/04/19/1161452.html 学习和研究在企业中实施面向服务架构(SOA),简单回顾SOA和ESB,重点 ...
- 企业服务总线(ESB)
思考: 1.ESB的定义到底是什么?是一款产品还是一种架构模式? 2.ESB有何实际用处? 定义ESB 对于企业服务总线(Enterprise Service Bus),目前还没有公认的定义,根据供应 ...
- 几种ESB(企业服务总线)介绍
ESB(Enterprise Service Bus,即企业服务总线)是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素. 企业服务 ...
- ESB、SOA、EAI异同【转】
先说概念: ESB:企业服务总线(ESB : Enterprise Service Bus):ESB 是一种开放的.基于标准的分布式同步或异步信息传递中间件.通过 XML.Web Serv ...
- ESB 企业服务总线
整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David . @肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验.曾参和设计和开发基 ...
- REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
转载自处blog.csdn.net/tantexian. SOA: 维基百科解释:SOA:面向服务的软件架构(Service Oriented Architecture),是一种计算机软件的设计模式, ...
随机推荐
- synchronized的使用方法
[转自] http://blog.csdn.net/witsmakemen/article/details/6966116 记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的 ...
- svn 入门
SVN版本:1.5 及更新版本 名词说明: WC:Working Copy 你的工作区 Versioned:受控的:受版本控制的 SVN是什么? SVN是开源的版本控制系统. 比CVS更多的特性.一个 ...
- 【转】UnityVS(Visual Studio Tools For Unity)的安装与使用
Unity 的开发者们,尤其是微软系的Unity开发者们,用Mono是不是烦死了?你是不是跟我一样,用vs来写代码,用Mono来跟踪调试?好麻烦啊好麻烦. 也许你会说,傻逼你不会用UnityVS插件么 ...
- JS中的工厂模式
.一个栗子: var BicycleShop = function(){}; BicycleShop.prototype = { sellBicycle : function( model ){ va ...
- Redis学习笔记(8)-发布/订阅
package cn.com; import java.util.List; import redis.clients.jedis.Jedis; public class Redis_PubSub { ...
- 通过runtime替换系统类实现的代码(从github开源库fdstackview中摘录)
其中部分代码为汇编:由此可见oc的runtime的灵活性和能力.此代码仅供参考 // ---------------------------------------------------- // R ...
- 【Android测试】【第十节】MonkeyRunner—— 录制回放
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4861693.html 前言 在实际项目进行过程中,频繁的需 ...
- 设计模式:状态模式(State)
定 义:当一个对象内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况, 把状态的判断逻辑转移到表示不同状态的一系列子 ...
- Object C语法学习笔记(一)
1.@property与@synthesize配对使用. @property预编译指令的作用是自动声明属性的setter和getter方法. @synthesize 创建了该属性的访问代码 功能:让编 ...
- 树莓派连接wifi
使用树莓派,通过无线网卡连接wifi,再通过远程桌面或者ssh的连接树莓派比较方便,本文记录树莓派wifi如何设置. 参考链接: http://www.jianshu.com/p/b42e8d3df4 ...