操作目的:
???
我的需求是这样的,前台发送请求到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