`
uule
  • 浏览: 6323299 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

EB项目总结

 
阅读更多

在容器启动时(实现ServletContextListener接口),使用Session bean将SysConfig表和IP权限表数据读出并放入缓存中

 

下一步,两种方式:

1、通过在JBOSS中配置全局过滤器,过滤IP权限和访问开关,然后通过JMS发出输入、输出

request发出后,经过SOAPHandler拦截器、EJB拦截器,然后返回response

 

注意:

1、过滤器通过后,需要将ThreadLocal里的UUID置空,保证下一请求从新获取UUID

 

2、使用ThreadLocal保证该过程在同一线程中,输入输出的UUID都从ThreadLocal里拿,保证一一对应。

 

3、EJB过滤器里调用前设入开始时间,调用后设入结束时间(ThreadLocal设置,然后构造输出对象时置入,方便获知调用时长)

 

4、发送的request构造RequestData对象,置入requestSoap(String类型),UUID、IP、URI、serviceNameEn、date等,然后通过JMS发出

返回的response构造ResponseData对象,从ThreadLocal里拿到UUID(保证与RequestData对应) , 置入UUID、调用开始结束时间,responseSoap,然后通过JMS发出

 

5、接收到消息后,判断消息类型(RequestData/ResponseData对象),分别持久化到DB

 

6、分别在request/response请求关闭前,通过下面的InstanceSender构造输入输出对象发送JMS输入输出消息

 

注意点1和2实现:

public class InstanceInfo {
	private static final ThreadLocal instanceUUID = new ThreadLocal();
	
	public static String getInstanceUUID(){
		String uuid = (String)instanceUUID.get();
		if(uuid == null){
			// 生成UUID作为服务调用的实例号
			uuid = PREFIX + UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
			instanceUUID.set(uuid);
		}
		return uuid;
	}

	public static void removeInstanceUUID(){
		instanceUUID.remove();
		instanceUUID.set(null);
	}
}

 

请求通过后,UUID清空

chain.doFilter(req, res);
	InstanceInfo.removeInstanceUUID();

 

 

注意点3实现:

public class InstanceInfo {
	/**
	 * 调用原始服务开始时间
	 */
	private static final ThreadLocal invokeProviderStartTime = new ThreadLocal();
	
	/**
	 * 调用原始服务结束时间
	 */
	private static final ThreadLocal invokeProviderEndTime = new ThreadLocal();
	
	public static Long getInvokeProviderStartTime(){
		return (Long)invokeProviderStartTime.get();
	}
	
	@SuppressWarnings("unchecked")
	public static void markInvokeProviderStartTime(){
		invokeProviderStartTime.set(System.currentTimeMillis());
	}
	..
}

 

EJB过滤器中,置入调用开始、结束时间:

/**
 * 该类基于EJB拦截器实现
 */
public class InstanceHandler {
	
	@AroundInvoke
	public Object handle(InvocationContext ctx) throws Exception{
		Object obj = null;
		
		// 记录调用原始服务所耗费的时间
		// 起始
		if(InstanceInfo.filterIsUp){
			InstanceInfo.markInvokeProviderStartTime();
		}
		try {
			// 调用服务
			obj = ctx.proceed();
		} catch (Exception e) {			
		}finally{
			// 结束
			if(InstanceInfo.filterIsUp){
				InstanceInfo.markInvokeProviderEndTime();				
			}
			
			if(obj != null){
				ReflectUtil.setValueToField(obj, "instanceid", InstanceInfo.getInstanceUUID());
			}
			
			if(!InstanceInfo.filterIsUp){
				InstanceInfo.removeInstanceUUID();
			}
		}
		return obj;
	}

}

 

 

注意点4实现:

过滤器中:

// 封装请求对象
		RequestData rd = InstanceInfo.getRequestData();
		rd.setInstanceUUID(uuid);
		rd.setDate(new Date(System.currentTimeMillis()));
		rd.setServiceNameEn(serviceNameEn);
		rd.setRequestURI(requestURI);
		rd.setIp(ip);

 

JMS发送输入消息(将请求构造为RequestData对象,方便JMS接收端接收):

public class InstanceSender {
	
	/**
	 * 将soap消息封装后发送至jms(输入消息)
	 */
	public static void sendInput(byte[] byteContent){
		// 封装requestData
		//过滤器中设置过值的requestData
		RequestData rd = InstanceInfo.getRequestData();  		
		
		//转码
		String encoding = InstanceInfo.getInputStreamEncoding();
		String soap = null;		
		if(byteContent.length > 0){
			if(encoding != null){
				try {
					soap = new String(byteContent, encoding);
				} catch (UnsupportedEncodingException e) {				
				}
			}else{
				soap = new String(byteContent);
			}
		}
		
		rd.setSoap(soap);
		
		// 发送输入消息
		try {
			MsgQueueSender.getInstance().sendObjMsg(rd);
		} catch (JMSException e) {			
		}
		
		// 释放请求数据占用内存
		InstanceInfo.removeRequestData();
	}
	
}

 

JMS发送输出消息(将请求构造为ResponseData对象,方便JMS接收端接收)::

public class InstanceSender {
	
	/**	
	 * 将soap消息封装后发送至jms(输出消息)		
	 */
	public static void sendOutput(byte[] byteContent, StringBuffer strContent){
		// 封装响应对象
		ResponseData rd = InstanceInfo.getResponseData();
		rd.setInstanceUUID(InstanceInfo.getInstanceUUID());
		rd.setDate(new Date(System.currentTimeMillis()));
		
		String soap = null;		
		if(byteContent.length > 0){
			String encoding = InstanceInfo.getOutputStreamEncoding();
			if(encoding != null){
				try {
					soap = new String(byteContent, encoding);
				} catch (UnsupportedEncodingException e) {					
				}
			}else{
				soap = new String(byteContent);
			}
		}else if(strContent.length() > 0){
			soap = strContent.toString();
		}
		
		rd.setSoap(soap);
		
		//此处拿出EJB过滤器中,置入的调用开始、结束时间		
		if(InstanceInfo.getInvokeProviderStartTime() != null){
			rd.setOriginalRequestTime(InstanceInfo.getInvokeProviderStartTime());
		}				
		if(InstanceInfo.getInvokeProviderEndTime() != null){
			rd.setOriginalResponseTime(InstanceInfo.getInvokeProviderEndTime());
		}
		
		// 发送输出消息
		try {
			MsgQueueSender.getInstance().sendObjMsg(rd);
		} catch (JMSException e) {			
		}
		
		// 释放响应数据占用内存
		InstanceInfo.removeResponseData();
	}
	
}

 

public class InstanceInfo {
	/**
	 * 请求数据
	 */
	private static final ThreadLocal requestData = new ThreadLocal();
	
	/**
	 * 响应数据
	 */
	private static final ThreadLocal responseData = new ThreadLocal();

	public static RequestData getRequestData(){
		RequestData rd = (RequestData)requestData.get();
		if(rd == null){
			rd = new RequestData();
			requestData.set(rd);
		}
		return rd;
	}
	
	public static void removeRequestData(){
		requestData.remove();
		// 此前出现多个请求实例号重复的情况,推测是jboss重复使用线程,所以此处保留setnull代码
		requestData.set(null);
	}
	
	//ResponseData类似,忽略
	..
}

 

 

注意点6实现:

Filter中,HttpServletRequestWrapper/HttpServletResponseWrapper包装HttpServletRequest/HttpServletResponse对象

 

request关闭前,JMS发送输入:

@Override
	public void close() throws IOException {
		if(!closed){
			InstanceSender.sendInput(byteContent);
		}
		sis.close(); 
		closed = true;
	}

 

response关闭前,JMS发送输出

@Override
	public void close() throws IOException {
		if(!closed){
			InstanceSender.sendOutput(byteContent, strContent);
		}
		sos.close();
		closed = true;
	}

 

。。

 

 

分享到:
评论

相关推荐

    EB8000常用图库

    总结来说,“EB8000常用图库”是一个实用的工具,它为威伦屏EB8000的使用者提供了丰富的图形元素,覆盖了从基本操作到复杂系统的各种需求。通过合理利用这些图库,可以大大提高HMI界面的设计质量和开发速度,从而...

    SmartRF04EB仿真器驱动

    总结来说,SmartRF04EB仿真器驱动是无线通信研发中不可或缺的一环,它确保了硬件与软件的顺畅交互,使得开发者能够在各种环境下有效地测试和优化他们的无线通信方案。正确安装和使用驱动,可以极大地提升开发效率和...

    eb500组态软件.rar

    6. **项目备份与恢复**:为了防止数据丢失,eb500组态软件可能具有项目备份和恢复功能,用户可以定期保存项目配置,以备不时之需。 7. **用户权限管理**:多用户环境下,软件通常提供权限管理机制,确保不同级别的...

    EB8000图库3

    总结来说,"EB8000图库3"是威纶通EB8000系列触摸屏软件中的一个重要资源集合,它提供了丰富的图形和图标,帮助用户快速创建专业且功能多样的HMI界面。掌握如何有效利用这个图库,可以极大地提升触摸屏项目的开发效率...

    行业-19华菱EB:湖南华菱钢铁集团有限责任公司2020总结.rar

    华菱钢铁集团有限责任公司,作为湖南省的大型钢铁制造企业,通过发行EB可能旨在筹集资金,优化资本结构,或者为其他战略项目提供资金。 描述中的“湖南华菱钢铁集团有限责任公司2020总结”提示我们,这个压缩包包含...

    EBTresos.rar

    总结来说,EB Tresos是一款强大的AUTOSAR MCAL配置工具,它简化了硬件抽象层的配置和驱动开发工作,为汽车电子系统的软件开发带来了便利。借助NXP提供的硬件平台和官方支持,EB Tresos成为了AUTOSAR开发者的得力助手...

    GX-Configurator-AD2-EB.rar

    3. **打开项目**:启动GX Configurator-AD2-EB,创建新项目或者打开已有项目,选择对应的PLC型号和A/D模块类型。 4. **配置模块参数**:在软件中,可以设置A/D模块的基本参数,包括分辨率、转换速度、输入范围、...

    GX Converter1-EB

    总结来说,GX Converter1-EB是三菱编程环境中不可或缺的辅助工具,它有效地解决了注释管理的问题,提高了工程师在项目开发过程中的组织和协作能力。通过将注释导出到EXCEL,用户可以更好地利用表格工具进行管理和...

    AWGN 中 BPSK 的 BER 与 Eb/N0 的关系:AWGN 中 BPSK 的 BER 对于不同的 Eb/N0 值,然后将模拟 BER 与理论 BER 进行比较-matlab开发

    总结,本项目探讨了在AWGN信道下BPSK调制的BER与Eb/N0的关系,以及如何使用MATLAB进行相关仿真。通过对模拟结果与理论值的比较,我们可以更深入地了解BPSK在实际通信系统中的性能,并为优化系统设计提供参考。通过...

    eb-api-1.0.30.zip

    总结起来,"eb-api-1.0.30.zip"中的underscore-java项目是underscore.js在Java平台上的成功移植,它将JavaScript中的强大功能带到Java世界,为Java开发者提供了新的工具和思路。通过研究和使用这个开源项目,我们...

    miaobiao.zip_13LU_EB9_verilog 秒表

    总结来说,这个项目是Verilog硬件编程的一个实例,它展示了如何利用这种语言创建一个功能完备的电子秒表,通过Xilinx开发板进行验证和实施。这涵盖了数字系统设计的基础,包括计数器、分频器、状态机、输入/输出接口...

    C#屏幕截图完整源码-Eb.rar

    这个"C#屏幕截图完整源码-Eb.rar"压缩包很可能是提供了一个完整的C#项目,包含了实现屏幕截图功能的所有代码。下面我们将深入探讨如何在C#中实现屏幕截图,并了解相关的关键知识点。 首先,C#提供了System.Drawing...

    Express-ews-eb-test

    标题“Express-ews-eb-test”表明这可能是一个与使用Express框架进行Exchange Web Services (EWS)测试相关的项目。Express是Node.js中最流行的web应用程序框架,而EWS是Microsoft Exchange Server提供的一种API,...

    前端开发简历模板-eb前端开发-3年-上海.docx

    "前端开发简历模板-eb前端开发-3年-上海.docx" 本资源是关于一名具有三年前端开发经验的简历模板,主要描述了该开发者的个人信息、工作经验、项目经验、技术栈等信息。 个人信息 * 姓氏:(隐私保护) * 性别:男...

    ba9811a0159eb6c2b92bebc68fa1de64a705_supplymanagement_Papers_

    最后,"ba9811a0159eb6c2b92bebc68fa1de64a705.pdf"与整个压缩包的名称相同,很可能是个概述性的文档,总结了所有其他论文的核心观点,或者是整个研究项目的总结报告。 总的来说,这些PDF文件构成了一个全面的供应...

    yesmeck-jquery-jsonview-v1.2.3-14-g01b1eb8.zip

    总结起来,yesmeck-jquery-jsonview是一个实用的jQuery插件,它将JSON数据转换为易于理解和操作的视图,适用于前端开发、数据分析以及教学演示等多个场景。虽然在折叠功能上存在小瑕疵,但其核心优势在于提升了JSON...

    eb-flaskcd:使用弹性豆茎在烧瓶上测试烧瓶的连续输送

    总结来说,"eb-flaskcd"项目是一个利用AWS Elastic Beanstalk服务来实现Flask应用的持续部署的实例。它涵盖了Python Web开发、云服务、自动化部署等多个方面,对于想要学习如何在AWS上管理和部署Flask应用的开发者来...

    grafana-eb

    总结来说,“grafana-eb”很可能是Grafana的一个定制化版本,针对特定环境或需求进行了优化。要深入了解这个项目,你需要解压文件,阅读文档,了解它的特性和配置方法,然后根据实际需求进行部署和使用。如果你打算...

Global site tag (gtag.js) - Google Analytics