세션 범위 내에서 단일 세션 범위의 컨트롤러에 세션 범위 사용자 콩을 저장하려고합니다. 따라서 사용자가 연결될 때마다 나머지 사용자와 세션을 유지하는 배열에 배열을 저장하려고합니다.@controller에서 세션 범위 Bean 저장
따를 때 난 내 세션 범위 사용자 콩을 정의 그래서 내가 프록시 빈을 통해 @Controller로 세션 범위 빈을 주입에 대해 알고,
@Bean
@Scope(value="session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public IUser user()
{
IUser user = new MyUser();
return user;
}
나는 것을 주입하는 @Autowire 주석을 사용했다 아래 내 컨트롤러 클래스에 콩, 사용자가 연결하기 때마다
@Autowired
private IUser sessionUser;
그래서, 나는, 정의 아래와 같이 추가되는 ConcurrentHashMap의에 해당 사용자를 저장하고
private ConcurrentHashMap<Integer,IUser> userMap = new ConcurrentHashMap<>(50,0.9f,2);
public void addUser(IUser user)
{
if(user == null) return;
IUser retUser = userMap.putIfAbsent(user.getDbid(),user);
//...
}
첫 번째 사용자가 연결되면 모든 것이 작동하므로 맵에 대한 참조를 저장합니다. 의 처음 사용자 참조를 가정 해 보자하는 것은 누구의 참조가 연결됩니다
[email protected]
다음
우리가 두 번째 사용자를 가정하자, 참고 문헌에서
[email protected]
, 난 내 세션 범위 콩으로 잘 작동하는 것을 볼 수 있습니다 자신의 참조가 다릅니다. 그러나이면 실행이 addUser 메서드로 들어가면 문제가 시작됩니다. 지도에 두 번째 사용자를 추가하기 전에도 내 userMap을 확인하고 저장중인 사용자 개체가 MyUser @ 28zbdh 인 두 번째 사용자 개체로 바뀌 었는지 확인합니다. 참조가 마지막으로 항상 업데이트되고되도록 그래서 마지막에, 두 번째 사용자를 추가 한 후, 내 사용자지도
Map --> "1"- [email protected]
Map --> "2"- [email protected]
, 다음과 같습니다. 나는 그것들이 실제 객체에 대한 프록시 객체이지만 어떻게 저장할 수 있는지 알고있다.
감사
[편집]
나는 추가 정보를 제공하고 싶었다.다른 싱글 톤 빈에서 addUser를 호출하고 있는데, userInDBMemory.addUser (sessionUser); userInDBMemory는 실제로 ConcurrentHashMap에 내 세션 사용자를 추가하는 또 다른 싱글 톤 bean입니다. 현재 온라인 사용자를지도에 저장하여 데이터베이스에 가지 않고 검색하고 쿼리하고자합니다. 따라서 온라인 사용자 (컨텍스트에서 세션이있는 사용자)가 더 쉽고 빠르게 액세스 할 수 있도록 메모리에 유지하려고합니다. 세션 만료를 처리하기 위해 모든 온라인 사용자는 서버에 하트 비트를 보내서 온라인 상태임을 표시하고, 매 X 분마다 실행되는 서버에 예약 된 스레드가 있고 잠시 동안 사용자로부터 하트 비트를받지 않은 사용자를 찾으면 그것은 사용자가 오프라인이되었음을 의미하므로지도에서 제거합니다. 요약하면 내 컨트롤러가 있는데 다음과 같은 체인이있다 : @ Controller-> singleton application bean-> Singleton inMemoryDB bean (내 맵을 정의하고 사용자를 추가하는 곳) SessionUser session-scope bean은 @ Autowired @Controller 및 매개 변수로 다른 singleton 콩 전달합니다. 응답을 감사드립니다.
addUser()를 어떻게 호출합니까? 세션 빈을 맵에 저장해야하는 이유는 무엇입니까? 예를 들어 다음과 같은 경우에 저장된 사용자는 어떻게됩니까? 세션이 만료 되었습니까? – StanislavL
안녕하세요, 귀하의 질문에 대한 답변으로 원래의 게시물을 업데이트했습니다. 원래 게시물의 일부를 수정하십시오. 응답에 대한 감사합니다. – levye