在容器启动时(实现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的使用者提供了丰富的图形元素,覆盖了从基本操作到复杂系统的各种需求。通过合理利用这些图库,可以大大提高HMI界面的设计质量和开发速度,从而...
综上所述,**SmartRF04EB.pdf**不仅是对开发套件的详尽描述,更是无线通信领域开发者的宝贵资源,通过其深入浅出的解析,开发者能够快速掌握SmartRF04EB的核心技术和应用实践,推动项目高效进展。
总结来说,SmartRF04EB仿真器驱动是无线通信研发中不可或缺的一环,它确保了硬件与软件的顺畅交互,使得开发者能够在各种环境下有效地测试和优化他们的无线通信方案。正确安装和使用驱动,可以极大地提升开发效率和...
6. **项目备份与恢复**:为了防止数据丢失,eb500组态软件可能具有项目备份和恢复功能,用户可以定期保存项目配置,以备不时之需。 7. **用户权限管理**:多用户环境下,软件通常提供权限管理机制,确保不同级别的...
通过对这些细节的理解,开发者可以更好地利用Smartrf04EB进行Zigbee项目的开发。 #### 六、实际应用案例 假设我们要利用Smartrf04EB开发一个简单的Zigbee节点,流程大致如下: 1. **硬件准备**: 准备好Smartrf04...
总结来说,"EB8000图库3"是威纶通EB8000系列触摸屏软件中的一个重要资源集合,它提供了丰富的图形和图标,帮助用户快速创建专业且功能多样的HMI界面。掌握如何有效利用这个图库,可以极大地提升触摸屏项目的开发效率...
华菱钢铁集团有限责任公司,作为湖南省的大型钢铁制造企业,通过发行EB可能旨在筹集资金,优化资本结构,或者为其他战略项目提供资金。 描述中的“湖南华菱钢铁集团有限责任公司2020总结”提示我们,这个压缩包包含...
总结来说,EB Tresos是一款强大的AUTOSAR MCAL配置工具,它简化了硬件抽象层的配置和驱动开发工作,为汽车电子系统的软件开发带来了便利。借助NXP提供的硬件平台和官方支持,EB Tresos成为了AUTOSAR开发者的得力助手...
为了确保实验效果,要求学生按照指导书中的步骤认真操作,两人为一组合作完成实验任务,并撰写实验报告,记录实验过程和结果,以便于下一次课时提交电子版报告,这不仅是对所学知识的总结,也是评估学生理解和掌握...
3. **打开项目**:启动GX Configurator-AD2-EB,创建新项目或者打开已有项目,选择对应的PLC型号和A/D模块类型。 4. **配置模块参数**:在软件中,可以设置A/D模块的基本参数,包括分辨率、转换速度、输入范围、...
表1列出了近期已通过交易所审批的部分私募EB项目,涉及不同行业的公司,包括泰格林纸、深圳盛屯集团、广州越秀集团等。这些项目的状态显示“通过”,意味着它们已经获得了必要的监管批准,可以进入发行阶段。 总结...
总结来说,GX Converter1-EB是三菱编程环境中不可或缺的辅助工具,它有效地解决了注释管理的问题,提高了工程师在项目开发过程中的组织和协作能力。通过将注释导出到EXCEL,用户可以更好地利用表格工具进行管理和...
总结来说,EB8000软件是工业自动化领域的重要工具,它使用户能够轻松创建和管理人机界面,实现与PLC的高效通信。通过本教程,我们可以掌握EB8000的基本操作和功能,为进一步的工业自动化项目实施奠定基础。
总结,本项目探讨了在AWGN信道下BPSK调制的BER与Eb/N0的关系,以及如何使用MATLAB进行相关仿真。通过对模拟结果与理论值的比较,我们可以更深入地了解BPSK在实际通信系统中的性能,并为优化系统设计提供参考。通过...
总结起来,"eb-api-1.0.30.zip"中的underscore-java项目是underscore.js在Java平台上的成功移植,它将JavaScript中的强大功能带到Java世界,为Java开发者提供了新的工具和思路。通过研究和使用这个开源项目,我们...
总结来说,EB创新策略模式是一种全面的企业转型框架,它结合了产业环境分析、战略目标设定、流程再造、技术创新和企业文化转变,旨在帮助企业在信息化时代保持竞争力,实现可持续发展。通过深入理解这些概念和实践,...
总结来说,这个项目是Verilog硬件编程的一个实例,它展示了如何利用这种语言创建一个功能完备的电子秒表,通过Xilinx开发板进行验证和实施。这涵盖了数字系统设计的基础,包括计数器、分频器、状态机、输入/输出接口...
这个"C#屏幕截图完整源码-Eb.rar"压缩包很可能是提供了一个完整的C#项目,包含了实现屏幕截图功能的所有代码。下面我们将深入探讨如何在C#中实现屏幕截图,并了解相关的关键知识点。 首先,C#提供了System.Drawing...
标题“Express-ews-eb-test”表明这可能是一个与使用Express框架进行Exchange Web Services (EWS)测试相关的项目。Express是Node.js中最流行的web应用程序框架,而EWS是Microsoft Exchange Server提供的一种API,...