Browse Source

Store Vaadin session after each update

This helps clustering solutions know when the session attribute needs
to be replicated instead of having to always aggressively replicate
all attributes.

Resolves #7535
tags/8.2.0.alpha2
Artur Signell 6 years ago
parent
commit
48e202a806

+ 4
- 0
server/src/main/java/com/vaadin/server/VaadinSession.java View File

+ ui.getUIId(), + ui.getUIId(),
e); e);
} }
// Store session after modifications have been done so that
// Spring Session and possibly other implementations realize
// that something has changed inside the session attribute
service.storeSession(this, session);
} }
} }
} finally { } finally {

+ 17
- 0
server/src/test/java/com/vaadin/ui/UITest.java View File

import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;


import javax.servlet.ServletConfig; import javax.servlet.ServletConfig;
import javax.servlet.http.HttpSession;


import org.easymock.EasyMock;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mockito.Mockito; import org.mockito.Mockito;
import com.vaadin.server.VaadinServlet; import com.vaadin.server.VaadinServlet;
import com.vaadin.server.VaadinServletService; import com.vaadin.server.VaadinServletService;
import com.vaadin.server.VaadinSession; import com.vaadin.server.VaadinSession;
import com.vaadin.server.WrappedHttpSession;
import com.vaadin.server.communication.PushConnection; import com.vaadin.server.communication.PushConnection;
import com.vaadin.shared.communication.PushMode; import com.vaadin.shared.communication.PushMode;
import com.vaadin.util.CurrentInstanceTest; import com.vaadin.util.CurrentInstanceTest;
VaadinServletService service = new VaadinServletService(servlet, VaadinServletService service = new VaadinServletService(servlet,
deploymentConfiguration); deploymentConfiguration);
MockVaadinSession session = new MockVaadinSession(service); MockVaadinSession session = new MockVaadinSession(service);
HttpSession mockHttpSession = EasyMock.createMock(HttpSession.class);
WrappedHttpSession mockWrappedSession = new WrappedHttpSession(
mockHttpSession) {
@Override
public Object getAttribute(String name) {
String lockAttribute = service.getServiceName() + ".lock";
if (lockAttribute.equals(name)) {
return session.getLockInstance();
} else {
return super.getAttribute(name);
}
}
};
session.lock(); session.lock();
session.refreshTransients(mockWrappedSession, service);
ui.setSession(session); ui.setSession(session);
ui.doInit(Mockito.mock(VaadinRequest.class), 1, "foo"); ui.doInit(Mockito.mock(VaadinRequest.class), 1, "foo");
session.addUI(ui); session.addUI(ui);

Loading…
Cancel
Save