我知道调用setAttribute(link)时有必要,但是getAttirbute呢?
这是对的吗?
public Object getMyAttribute() {
return VaadinSession.getCurrent().getAttribute("myAttribute");
}
还是需要锁定?
public Object getMyAttribute() {
try {
VaadinSession.getCurrent().getLockInstance().lock();
return VaadinSession.getCurrent().getAttribute("myAttribute");
} finally {
VaadinSession.getCurrent().getLockInstance().unlock();
}
}
答案 0 :(得分:5)
添加到the answer by Patton。虽然我不是这方面的专家,但是在仔细阅读文档并阅读RolandKrüger的this post后,我会发表我的理解。
虽然我不知道你问题的确切答案,但我认为这个问题没有实际意义。
➡让Vaadin 7.1及更高版本自动处理锁定。该文档称自动锁定路径优于手动锁定。
如果从通常的主要Vaadin用户界面线程中访问VaadinSession
,则不需要显式锁定。在主线程中工作时,Vaadin会根据需要自动锁定VaadinSession。
您的所有应用状态都存储在该会话对象中,因此Vaadin会定期访问和保护该会话。
如果从后台线程,从您启动的线程访问VaadinSession,锁定只是一个问题。
即使在这种情况下,Vaadin提供了一对选项,如果您将Runnable传递给这些“访问”方法中的任何一种,则自动处理锁定:
access
对象上的VaadinSession
方法
access
对象UI
方法
如果代码仅影响VaadinSession而不触及任何UI
对象(用户界面,布局,窗口小部件组件等),则使用第一个VaadinSession.access()
。另一方面,如果您的代码影响任何UI对象以及直接寻址VaadinSession,请使用第二个UI.access()
。
因此,当您可以在访问VaadinSession期间管理锁定时,您只需要在后台线程和中出于某种原因而不想调用access
方法。但我无法想象有这样的理由。
有关我的更多讨论和groovy diagram,请参阅此类似问题how to put data in session variable and get the data in different page in vaadin?。
答案 1 :(得分:2)
如果您尝试从另一个后台线程访问Vaadin Session,那么您需要访问锁定,否则您实际上不需要。 Vaadin服务会自动为您执行此操作,即,当您在vaadin框架调用方法之前在UI上执行某些操作时,框架将锁定会话。
接下来,如果您尝试从另一个线程访问Session变量,那么您必须执行类似这样的操作来访问会话变量。
UI.getCurrent().access(new Runnable() {
@Override
public void run() {
Thread thread = new Thread(new Runnable(){
//TODO Write your logic to perform some session related action
});
thread.start();
}
});
希望这有助于你