<转>WebService大讲堂之Axis2(6):跨服务会话(Session)管理

在《WebService大讲堂之Axis2(5):会话(Session)管理》一文中介绍了如何使用Axis2来管理同一个服务的会话,但对于一个复杂的系统,不可能只有一个WebService服务,例如,至少会有一个管理用户的WebService(用户登录和注册)以及处理业务的WebService。象这种情况,就必须在多个WebService服务之间共享会话状态,也称为跨服务会话(Session)管理。实现跨服务会话管理与实现同一个服务的会话管理的步骤类似,但仍然有一些差别,实现跨服务会话管理的步骤如下:

实现跨服务的Session管理需要如下三步:

1. 使用MessageContext和ServiceGroupContext获得与设置key-value对。

2. 为要进行Session管理的WebService类所对应的<service>元素添加一个scope属性,并将该属性值设为application。

3. 在客户端使用setManageSession(true)打开Session管理功能。

从上面的步骤可以看出,实现跨服务会话管理与实现同一个服务的会话管理在前两步上存在着差异,而第3步是完全一样的。下面是一个跨服务的会话管理的实例。在这个例子中有两个WebService类:LoginService和SearchService,代码如下:

LoginService.java


package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class LoginService
{
public boolean login(String username, String password)
{
if("bill".equals(username) && "1234".equals(password))
{
// 第1步:设置key-value对
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
sgc.setProperty("login", "成功登录");
return true;
}
else
{
return false;
}
}
public String getLoginMsg()
{
// 第1步:获得key-value对中的value
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
return (String)sgc.getProperty("login");
}
}


SearchService.java


package service;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceGroupContext;
public class SearchService
{
public String findByName(String name)
{
// 第1步:获得key-value对中的value
MessageContext mc = MessageContext.getCurrentMessageContext();
ServiceGroupContext sgc = mc.getServiceGroupContext();
if (sgc.getProperty("login") != null)
return "找到的数据<" + name + ">";
else
return "用户未登录";
}
}

LoginService的aar中的services.xml只需要改scope="application">
SearchService的aar中的services.xml文件中的配置代码如下:


<serviceGroup>
<!-- 第2步:添加scope属性,并设置属性值为application -->
<service name="loginService" scope="application">
<description>
登录服务
</description>
<parameter name="ServiceClass">
service.LoginService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
<!-- 第2步:添加scope属性,并设置属性值为application -->
<service name="searchService" scope="application">
<description>
搜索服务
</description>
<parameter name="ServiceClass">
service.SearchService
</parameter>
<messageReceivers>
<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
</messageReceivers>
</service>
</serviceGroup>


第3步与《WebService大讲堂之Axis2(5):会话(Session)管理》一文中介绍的方法类似。


下面是使用两个stub类的对象实例访问上面实现的两个WebService的客户端代码:


LoginServiceStub stub = new LoginServiceStub();
LoginServiceStub.Login login = new LoginServiceStub.Login();
login.setUsername("bill");
login.setPassword("1234");
if(stub.login(login).local_return)
{
System.out.println(stub.getLoginMsg().local_return);
SearchServiceStub searchStub = new SearchServiceStub();
SearchServiceStub.FindByName fbn = new SearchServiceStub.FindByName();
fbn.setName("abc");
System.out.println(searchStub.findByName(fbn).local_return);
}


在执行上面的代码后,将输出如下的信息:


成功登录

找到的数据<abc>
内容概要:本文详细介绍了智慧社区系统的多个关键技术模块及其代码实现,涵盖智能照明、楼控系统、安防系统以及运维管理等方面。首先探讨了智能照明系统的实现逻辑,通过人体移动传感器和环境光强度进行双重要素判断,确保照明系统的智能化运作。接着深入分析了楼控系统中的电梯调度算法,强调了动态负载均衡算法的应用,特别是在高峰时段的优化调度。对于安防系统,则着重于门禁系统和视频监控的联动,利用事件驱动机制实现异常情况的及时响应。最后讨论了可视化大屏的数据展示技术,采用ECharts等工具实现高效的数据可视化。此外,还提到了设备台账管理和运维管理中的定时任务脚本,展示了如何通过代码解决实际问题。 适用人群:适用于具有一定编程基础的研发人员和技术爱好者,特别是对物联网、智能家居等领域感兴趣的开发者。 使用场景及目标:帮助读者理解并掌握智慧社区各子系统的具体实现方法,能够应用于实际项目的开发中,提升系统的智能化水平和用户体验。 其他说明:文中不仅提供了具体的代码示例,还分享了许多实战经验和技巧,如MQTT协议用于设备通信、WebSocket用于状态同步、ECharts用于数据可视化等。同时指出了实际开发过程中可能会遇到的问题及解决方案,如设备状态同步、视频流处理性能优化等。 适合人群:具备一定编程基础,对物联网、智能家居等领域感兴趣的研发人员和技术爱好者。 使用场景及目标:①理解智慧社区各子系统的具体实现方法;②将相关技术应用到实际项目开发中,提高系统的智能化水平和用户体验。 阅读建议:本文不仅提供具体代码示例,还分享了大量实战经验与技巧,在学习过程中应重点关注这些实践经验,并结合自身项目情况进行实践探索。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值