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),是一种计算机软件的设计模式, ...
随机推荐
- ssi服务器端指令
SSI使用详解 你是否曾经或正在为如何能够在最短的时间内完成对一个包含上千个页面的网站的修改而苦恼?那么可以看一下本文的介绍,或许能够对你有所帮助.什么是SSI?SSI是英文Server Side I ...
- docker-compose bug
annot mount volume over existing file, file exists /var/lib/docker/aufs/mnt/0ac71fed1af802a4ecf4a93b ...
- JQuery中国省市区无刷新三级联动查询
之前有写过用<Ajax控件来实现中国的省市区无刷新查询> 今天用JQuery来实现,用Ajax控件和JQuery的优缺点就先不说了. 效果图如下: 下面来结合代码来详细说明一下如何用JQu ...
- ACCESS自动编号重新从1开始
方法一: 删掉自动编号的字段,再建一个同样的自动编号字段. 方法二: 选择工具,再选择数据库实用工具,单击压缩和修复数据库,这样就OK了. 方法三:(提示错误“无效的数据字段类型” 尝试失败) ...
- 【C++】动态内存与智能指针
C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...
- Java学习-031-JSON 之五 -- 特定数据获取(JSONObject满足特定键值)
前面几篇博文分别讲述了 JSON 的 概要知识.简单数据获取.封装cssSelector数据获取方法.JSONObject 是否包含 key_value,请自行阅读相关博文. 在日常的接口测试脚本编写 ...
- break , continue , exit
break , continue , exit 例一:#!/bin/bash . /etc/init.d/functions `;do ];then #continue #没有数字3 break #e ...
- 删除docker私有库镜像
不断往私库里push image,发现里面大多数镜像已经版本过旧,用不到了,所以决定删除私库里那些没用的镜像. Docker registry默认提供了一个仓库清理的url,如下:可以删除镜像ubun ...
- [BS-23] AFN网络请求上拉/下拉刷新的细节问题总结
上拉/下拉刷新的细节问题总结 1.如果导航栏有透明色,则也需要设置header自动改变透明度 self.tableView.mj_header.automaticallyChangeAlpha = Y ...
- Oracle数据库之SQL基础(一)
主要内容:用户与表空间:表与约束:查询语句. 一.概述 Oracle安装:访问官网,下载 二.用户与表空间 在安装Oracle时在开始菜单里可以用sql puls登录oracle. ★1.系统用户 s ...