Invalidar sessão tomcat

Bom dia pessoal.

Tenho uma aplicação em jsf rodando em tomcat e ao clicar no menu sair, preciso que a sessão do tomcat seja invalidada

meu item de menu:

<p:menuitem action="#{loginBean.logoff}" value="SAIR" url="http://www.jvmsoftware.com.br" icon="ui-icon-close" />  

meu bean:

@ManagedBean
@SessionScoped

public class LoginBean implements Serializable {  
  
    .....
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();

    public LoginBean() {
    }
    
    public String login() throws ClassNotFoundException, SQLException {
        // logica do login
        Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): {0}", usr);
        //String logged;
        RequestContext context = RequestContext.getCurrentInstance();
            senhaMD5 = md5.md5(pas);
            usuario = usuImp.getUsuariosByUsern(usr);
            empresa = empImp.getEmpresaById(usuario.getAcsEmpresa().getIdEmpresa());
            //seta sistema para: DLV - delivery
            sistema = sisImp.getSistemaByCodigo("DLV");
            relSisEmp = relSisEmpImp.getRelSistemaEmpresa(empresa, sistema);
            relSisUsu = relSisUsuImp.getRelSistemaUsuario(usuario, sistema);
        if (relSisEmp.isAtivo() == false) {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login Error: ", "a empresa " + empresa.getFantasia() + " não está autorizada a utilizar o sistema: " + sistema.getNomeSistema());
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): relSisEmp.isAtivo() == false");
        } else if (relSisUsu.isAtivo() == false) {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login Error: ", "o usuario " + usuario.getNomeUsuario() + " não está autorizado a utilizar o sistema: " + sistema.getNomeSistema());
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): relSisEmp.isAtivo() == false");
        } else if (usuario == null) {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login Error: ", "usuario não encontrado!: " + usr);
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): usuario == null");
        } else if (usuario.isAtivo() == false) {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login Error: ", "usuario bloqueado!: " + usuario.getNomeUsuario());
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): usuario.isAtivo() == false");
        } else if (empresa.isAtivo() == false) {
            loggedIn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login Error: ", "empresa bloqueada!: " + empresa.getFantasia());
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): empresa.isAtivo() == false");
        } else {
            if(usr != null  && usr.equals(usuario.getUsern()) && pas != null  && senhaMD5.equals(usuario.getSenha())) {  
                loggedIn = true;
                
                // implementar ações após login confirmado
                // verificação de primeiro acesso
                primAcessoImp.PrimeiroAcesso(empresa);
                
                // seta parametros na sessão tomcat
                request.getSession().setAttribute("userName", usuario.getUsern() + " / " + sistema.getCodSistema());
                // seta mensagem
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Bem vindo! ", usuario.getUsern());
                Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): usuario e senha ok");
            } else {  
                loggedIn = false;  
                msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Login Error: ", "senha invalida!");
                Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.login(): senha invalida");  
            }
        }
        
        Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "usuario: {0}", usuario.getUsern());
        FacesContext.getCurrentInstance().addMessage(null, msg);  
        context.addCallbackParam("loggedIn", loggedIn);
        
        if (loggedIn == true) {
            logged = "principal.xhtml";
            logado = true;
            empresa = empImp.getEmpresaById(usuario.getAcsEmpresa().getIdEmpresa());
            // carrega variavel menu (referente ao menu)
            carregaMenu();
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.loggedIn - true: /usr: {0}", usr);
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "LoginBean.loggedIn - true: /sis: {0}", sistema.getCodSistema());
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "logged: principal.xhtml");
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "usr: {0}", usr);
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "sis: {0}", sistema.getCodSistema());
            //relBean.carregaAplicativosUsuario();
        } else {
            logged = "index.xhtml";
            logado = false;
            Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "logged: index.xhtml");
        }
        //return logged;
        //controller.geraMenu();
        Logger.getLogger(LoginBean.class.getName()).log(Level.INFO, "chegou no return do logged");
        return logged;
    }  

    public String Logado() {
        return logged;
    }
    
    private void carregaMenu() {
        System.out.println("LoginBean.carregaMenu()");
        List<AcsRelMenuUsuario> permMenu;
        try {
        permMenu = relMenuUsuImp.listRelMenuUsuarioByUsuario(usuario, sistema);
        for (int i = 0; i < permMenu.size(); i++) {
            InverteBoolean converte = new InverteBoolean();
            disable.put(permMenu.get(i).getAcsMenus().getCodMenu(), converte.mudaBoolean(permMenu.get(i).isAtivo()));
            menu.put(permMenu.get(i).getAcsMenus().getCodMenu(), permMenu.get(i));
//            System.out.println("LoginBean.carregaMenu().cod: " + permMenu.get(i).getAcsMenus().getCodMenu() +
//                    disable.get(i).booleanValue());
        }
        
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(e.getMessage(), new FacesMessage(FacesMessage.SEVERITY_INFO, e.getMessage(), e.getMessage()));
        }
    }
    
    // metodo para invalidar a sessão do tomcat
    public void logoff() {
        System.out.println("LoginBean.logoff(): ");
        request.getSession().invalidate();
    }
...
}  

O problema, é que ao clicar no botão sair, a sessão do tomcat não é invalidada.

utilizei também

<p:menuitem actionListener="#{loginBean.logoff}" value="SAIR" url="http://www.jvmsoftware.com.br" icon="ui-icon-close" />

substituindo o action por actionListener para chamar o metodo logoff, mas em nenhum dos dois casos o metodo é chamado.