1.生成一个登陆日志消息发送者
import com.yhy.sys.domain.Loginfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.stereotype.Component;
import javax.jms.Queue;
/**
* 登陆日志消息发送者
*/
@Component
public class LoginfoSender {
@Autowired
private JmsMessagingTemplate jmsMessagingTemplate;
@Autowired
private Queue queue;
public void sendMessage(Loginfo loginfo) {
jmsMessagingTemplate.convertAndSend(queue, loginfo);
}
}
2.生成登陆日志消息处理者
import com.yhy.sys.domain.Loginfo;
import com.yhy.sys.service.LoginfoService;
import org.apache.activemq.command.ActiveMQObjectMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
import javax.jms.JMSException;
import javax.jms.Message;
/**
* 登陆日志消息处理者
*/
@Component
public class LoginfoReceiver {
@Autowired
private LoginfoService loginfoService;
@JmsListener(destination = "login-info",containerFactory = "myFactory")
public void handle(Message message) {
if (message instanceof ActiveMQObjectMessage) {
ActiveMQObjectMessage activeMQObjectMessage = (ActiveMQObjectMessage) message;
try {
Loginfo loginfo = (Loginfo) activeMQObjectMessage.getObject();
loginfoService.save(loginfo);
//手动确认消息,才不会出现bug也被消费
activeMQObjectMessage.acknowledge();
} catch (JMSException e) {
e.printStackTrace();
}
}
}
}
3.配置
import com.yhy.sys.domain.QueueEnum;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.jms.Queue;
@Configuration
public class ActiveMQConfig {
@Bean
public Queue queue() {
return new ActiveMQQueue(QueueEnum.QUEUE_LOGINFO.getName());
}
@Bean
public DefaultJmsListenerContainerFactory myFactory(ConnectionFactory connectionFactory, DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
configurer.configure(factory, connectionFactory);
factory.setSessionTransacted(false);
factory.setSessionAcknowledgeMode(4);
return factory;
}
}
4.登录时,保存日志
@RequestMapping("/login")
public ResultObj login(String loginname, String pwd) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(loginname, pwd);
try {
subject.login(token);
ActiverUser activerUser = (ActiverUser) subject.getPrincipal();
WebUtils.getSession().setAttribute("user", activerUser.getUser());
//登录日志对象生成
Loginfo loginfo = new Loginfo();
loginfo.setLoginname(activerUser.getUser().getLoginname());
loginfo.setLoginip(WebUtils.getRequest().getRemoteAddr());
loginfo.setLogintime(new Date());
//使用mq保存登陆日志
loginfoSender.sendMessage(loginfo);
//使用mq之前的方式
//loginfoService.save(loginfo);
return ResultObj.LOGIN_SUCCESS;
} catch (AuthenticationException e) {
e.printStackTrace();
return ResultObj.LOGIN_ERROR_PASS;
}
}