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的更多相关文章

  1. 微服务理论之六:ESB与SOA的关系

    一.SOA和ESB一直是没有明确概念的两个缩略词 SOA----面向服务架构,实际上强调的是软件的一种架构,一种支撑软件运行的相对稳定的结构,表面含义如此,其实SOA是一种通过服务整合来解决系统集成的 ...

  2. 杂项:ESB接口

    ylbtech-杂项:ESB接口 ESB全称为Enterprise Service Bus,即企业服务总线.它是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢, ...

  3. 企业 SOA 设计(1)–ESB 设计

    最近为公司完成了一个 ESB 的设计.下面简要说明一下具体的设计方案.   企业 SOA 整体方案 在前一篇<SOA.ESB.NServiceBus.云计算 总结>中说到,SOA 是面向服 ...

  4. 面向服务架构(SOA)和企业服务总线(ESB)

    http://www.cnblogs.com/shanyou/archive/2008/04/19/1161452.html 学习和研究在企业中实施面向服务架构(SOA),简单回顾SOA和ESB,重点 ...

  5. 企业服务总线(ESB)

    思考: 1.ESB的定义到底是什么?是一款产品还是一种架构模式? 2.ESB有何实际用处? 定义ESB 对于企业服务总线(Enterprise Service Bus),目前还没有公认的定义,根据供应 ...

  6. 几种ESB(企业服务总线)介绍

    ESB(Enterprise Service Bus,即企业服务总线)是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素. 企业服务 ...

  7. ESB、SOA、EAI异同【转】

    先说概念:       ESB:企业服务总线(ESB : Enterprise Service Bus):ESB 是一种开放的.基于标准的分布式同步或异步信息传递中间件.通过 XML.Web Serv ...

  8. ESB 企业服务总线

    整理的OSChina 第 38 期高手问答 —— ESB 企业服务总线,嘉宾为@肖俊_David . @肖俊_David 恒拓开源架构师,热衷于JAVA开发,有多年的企业级开发经验.曾参和设计和开发基 ...

  9. REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解

    转载自处blog.csdn.net/tantexian. SOA: 维基百科解释:SOA:面向服务的软件架构(Service Oriented Architecture),是一种计算机软件的设计模式, ...

随机推荐

  1. freemarker 自定义标签

    1.编写标签类 package com.pccw.business.fnd.common.filegen; import java.io.IOException; import java.io.Wri ...

  2. EF6 CodeFirst 启用Migration,常用命令

    Enable-Migrations –EnableAutomaticMigrationsAdd-Migration [MigrationName] [-Force]Update-Database –T ...

  3. IE中的fireEvent和webkit中的dispatchEvent

    拿浏览器的click事件来说: 在IE浏览器中如果一个element没有注册click事件,那么直接调用的话会出现异常!当然如果你注册了没有什么可说的. 那么如果使用fireEvent来处理,clic ...

  4. Wordpress更改后台地址

    wordpress默认的后台地址是 xx/wp-admin  或xx/wp-login.php ,谁都知道感觉很不安全, 方法一:使用插件 通过插件在地址上加上只有你知道的参数才能访问 1.后台搜索插 ...

  5. Magento多语言功能

    Magento多语言功能是建立在视图(view)基础之上的,可以通过后台创建店铺视图来创建基于Magento的多语言店铺.本文为大家讲解如何创建多语言的功能.首先,进入“管理店铺”节点,如下所示. S ...

  6. CALayer的使用

    http://blog.csdn.net/maylorchao/article/details/42652161 http://www.jianshu.com/p/8b0d694d1c69城觅

  7. zabbix命令:zabbix_get获取item数据

    zabbix命令:zabbix_get获取item数据 http://www.ttlsa.com/zabbix/zabbix-zabbix_get-get-items/

  8. CentOS7|RHEL忘记root密码

    某一服务器长时间不使用,或者由于频繁修改root密码,导致忘记root密码无法登陆系统问题,通过进入单用户修改root密码,CentOS7|RHEL7与6系列有一些区别,不在适用于7. 1.在启动gr ...

  9. centos linux安全和调优 第四十一节课

    centos  linux安全和调优    第四十一节课 上半节课 Linux安全 下半节课 Linux调优 2015-07-01linux安全和调优 [复制链接]--http://www.apele ...

  10. 判断远程图片是否存在【适用于windows服务器】

    <?php function file_exists2($url) { if(@file_get_contents($url,0,null,0,1)) return 1; else return ...