java处理dealfilter_Struts2中调用线程等待报错:java.lang.IllegalMonitorStateException,该如何解决...

操作目的:

???

我的需求是这样的,前台发送请求到Action读取MSN好友列表,因为读取MSN好友列表时间比较长,而且读取好友列表的结构是使用的接口回调方式,所以我就让当前Action的线程等待MSN好友的读取操作,等读取完成后再notify()操作,然后输出好友列表结果到页面

问题:

调用了Thread.currentThead().wati()后报错如下:

java.lang.IllegalMonitorStateException

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:485)

at

com.denong.pb.site.member.invite.MemberInviteMsnAction.list(MemberInviteMsnAction.java:47)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native

Method)

at

sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at

sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at

com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441)

at

com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243)

at

com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165)

at

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252)

at

org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)

at

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)

at

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)

at

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)

at

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)

at

com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

org.apache.struts2.interceptor.MessageStoreInterceptor.intercept(MessageStoreInterceptor.java:204)

at

com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)

at

org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)

at

org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)

at

org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)

at

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

at

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at

org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at

org.apache.struts2.dispatcher.ActionContextCleanUp.doFilter(ActionContextCleanUp.java:102)

at

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at

org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at

org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)

at

org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at

org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at

com.denong.pb.site.filter.MemberAuthorityFilter.doFilter(MemberAuthorityFilter.java:83)

at

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at

org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at

org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)

at

org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

at

org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)

at

org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

at

org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)

at

org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)

at

org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)

at

org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)

at

org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at

org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)

at

org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)

at

org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)

at

org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

at java.lang.Thread.run(Thread.java:619)

资源:

public interface ILoadFriendsCallback {void dealFriends(List friends, Thread currentThread);void dealException(MsnMessenger messenger, Throwable t, Thread currentThread);}

?org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions

public class MsnHelper extends MsnAdapter {private Logger logger = LoggerFactory.getLogger(MsnHelper.class);protected MsnMessenger messenger = null;private String email = null, password = null;private Thread currentThread;private List friends = new ArrayList();private ILoadFriendsCallback lfc;public MsnHelper(String email, String password, Thread currentThread) {super();this.email = email;this.password = password;this.currentThread = currentThread;}public void getFriends(ILoadFriendsCallback lfc) throws MsnException {if (lfc == null) {throw new MsnException("请指定回调函数");}this.lfc = lfc;login();}private void login() {logger.debug("准备登录MSN:{}", email);messenger = MsnMessengerFactory.createMsnMessenger(email, password); // 创建MsnMessenger messenger.setSupportedProtocol(new MsnProtocol[] { MsnProtocol.MSNP12 }); // 设置登录协议 messenger.getOwner().setInitStatus(MsnUserStatus.ONLINE); // 设置用户状态 messenger.addListener(this); // 注册事件 messenger.login(); // 登录}// 注销时发生 public void logout(MsnMessenger messenger) {logger.debug("退出MSN");}public void exceptionCaught(MsnMessenger messenger, Throwable throwable) {logger.error("获取MSN好友列表出错:", throwable);this.lfc.dealException(messenger, throwable, currentThread);System.exit(-1);}public void loginCompleted(MsnMessenger messenger) {logger.debug("登录MSN成功:{}", email);}public void contactListInitCompleted(MsnMessenger messenger) {logger.debug("联系人初始化完成,MSN-Email:{}", email);listContacts();}// 打印联系人 private void listContacts() {MsnContact[] cons = messenger.getContactList().getContactsInList(MsnList.AL);logger.debug("MSN-Email:{},好友列表为:{} 个", email, cons.length);for (MsnContact msnContact : cons) {if (msnContact.getEmail() != null) {friends.add(new MsnFriend(msnContact.getEmail().getEmailAddress()));}}logger.debug("MSN-Email:{},可用好友列表为:{} 个", email, friends.size());messenger.logout();logger.debug("MSN-Email:{},退出登录!", email);logger.debug("查询好友列表成功,调用处理回调类:{}", this.lfc.getClass());this.lfc.dealFriends(friends, currentThread);}}

?

@Controller@Namespace("/member/invite")public class MemberInviteMsnAction extends BaseActionSupport {private static final long serialVersionUID = 1L;private String msnEmail;private String msnPassword;public String list() {Thread currentThread = Thread.currentThread();MsnHelper msnHelper = new MsnHelper(msnEmail, msnPassword, currentThread);try {msnHelper.getFriends(new InviteMsnCallback());try {System.out.println("outer " + Thread.currentThread());currentThread.wait();} catch (InterruptedException e) {e.printStackTrace();}} catch (Exception e) {logger.error("读取MSN好友列表出错", e);Struts2Utils.renderText("读取MSN好友列表出错");}return null;}public void setMsnEmail(String msnEmail) {this.msnEmail = msnEmail;}public void setMsnPassword(String msnPassword) {this.msnPassword = msnPassword;}}class InviteMsnCallback implements ILoadFriendsCallback {@Overridepublic void dealFriends(List friends, Thread currentThread) {currentThread.notify();System.out.println("do in " + Thread.currentThread());Struts2Utils.renderJson(friends);}@Overridepublic void dealException(MsnMessenger messenger, Throwable t, Thread currentThread) {currentThread.notify();if (t != null && t.getMessage().equals("incorrect password")) {Struts2Utils.renderText("MSN账号或密码不正确!");}}};

?

对于这方面的需求还是第一次遇到,期待您的解答,谢谢!

?

------解决方案--------------------------------------------------------

可参考:

线程等待的有关问题 http://www.myexception.cn/vc-mfc/152245.html

另这里的部分程序错误异常BUG解决方案

%D%A

java环境变量设置|http://www.myexception.cn/java-other/172921.html

%D%A

oracle存储过程|http://www.myexception.cn/oracle-develop/177537.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值