tomee_使用Vysper,TomEE和PrimeFaces将XMPP服务器嵌入JSF Web应用程序内部

tomee

我有一个需要在完成某些工作时通知用户的应用程序。 它使用JSF和Primefaces,因此可以使用大气 (也称为Push)来实现这种通知。

但是另一个有趣的方法是使用嵌入在Java Web应用程序中的XMPP服务器。 好的,好的,您不必嵌入它,您只需运行一个工业级XMPP服务器的实例,例如Openfire和Tigase即可 。 但是,嘿,我们只是玩了一点,所以我将向您展示如何使用Vysper进行操作, Vysper是使用Apache Mina开发的概念证明,只需几分钟即可轻松完成。

在展示如何做之前,很高兴记住线程和JEE应用程序通常不会混合使用 ,因此我们可以玩,但是我们必须知道我们在做什么。

首先,您将需要这些JAR,其中大多数来自Vysper。 只是几个?

  • aopalliance-1.0.jar
  • commons-codec-1.4.jar
  • commons-collections-3.1.jar
  • commons-io-1.4.jar
  • commons-lang-2.5.jar
  • commons-logging-1.1.jar
  • 并发1.3.4.jar
  • derby-10.2.1.6.jar
  • dnsjava-2.0.8.jar
  • ehcache-core-2.2.0.jar
  • fontbox-0.1.0.jar
  • jackrabbit-api-1.5.0.jar
  • jackrabbit-core-1.5.3.jar
  • jackrabbit-jcr-commons-1.5.3.jar
  • jackrabbit-spi-1.5.0.jar
  • jackrabbit-spi-commons-1.5.0.jar
  • jackrabbit-text-extractors-1.5.0.jar
  • jcl-over-slf4j-1.5.3.jar
  • jcr-1.0.jar
  • jempbox-0.2.0.jar
  • jetty-continuation-7.2.1.v20101111.jar
  • jetty-http-7.2.1.v20101111.jar
  • jetty-io-7.2.1.v20101111.jar
  • jetty-security-7.2.1.v20101111.jar
  • jetty-server-7.2.1.v20101111.jar
  • jetty-servlet-7.2.1.v20101111.jar
  • jetty-util-7.2.1.v20101111.jar
  • jetty-websocket-7.2.1.v20101111.jar
  • log4j-1.2.14.jar
  • lucene-core-2.3.2.jar
  • mina-core-2.0.2.jar
  • nbxml-0.7.jar
  • nekohtml-1.9.7.jar
  • pdfbox-0.7.3.jar
  • poi-3.0.2-FINAL.jar
  • poi-scratchpad-3.0.2-FINAL.jar
  • primefaces-4.0.jar
  • servlet-api-2.5.jar
  • slf4j-api-1.5.3.jar
  • slf4j-log4j12-1.5.3.jar
  • smack-3.1.0.jar
  • smackx-3.1.0.jar
  • spec-compliance-0.7.jar
  • 弹簧-aop-3.0.5.RELEASE.jar
  • 弹簧-asm-3.0.5.RELEASE.jar
  • Spring Bean3.0.5.RELEASE.jar
  • 弹簧上下文-3.0.5.RELEASE.jar
  • 弹簧核心-3.0.5.RELEASE.jar
  • spring-expression-3.0.5.RELEASE.jar
  • vysper-core-0.7.jar
  • vysper-websockets-0.7.jar
  • xep0045-muc-0.7.jar
  • xep0060-pubsub-0.7.jar
  • xep0124-xep0206-bosh-0.7.jar
  • xercesImpl-2.8.1.jar
  • xml-apis-1.3.03.jar

现在,从Vysper复制虚假证书,以便您的XMPP服务器可以在“安全”通道下“工作”。 它称为bogus_mina_tls.cert。

我的xhtml看起来像这样:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:p="http://primefaces.org/ui">
<h:head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Messaging Prototype</title><link rel="icon" type="image/png" href="favicon.ico"></link>    
</h:head>
<h:body>    <h:outputStylesheet library="css" name="style.css"  /><p:ajaxStatus style="width:16px;height:16px;" id="ajaxStatusPanel">  <f:facet name="start">  <h:graphicImage value="./ajaxloading.gif" />  </f:facet>  <f:facet name="complete">  <h:outputText value="" />  </f:facet>  </p:ajaxStatus>  <h:form>    <p:messages id="messages" showDetail="true" autoUpdate="true" closable="true" /><p:spacer height="10" /><p:panel><h:panelGrid columns="2"><p:commandButton value="Enter" action="#{messagingMB.sendMessage}" /></h:panelGrid></p:panel><p:spacer height="10" /></h:form>
</h:body>
</html>

很简单吧? 托管Bean也很容易。

import java.io.Serializable;import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;import org.jivesoftware.smack.XMPPException;@ManagedBean
@ViewScoped
public class MessagingMB implements Serializable {private static final long    serialVersionUID    = -9092497421080796430L;@EJBprivate JSFUtilEJB jsfUtilEJB;@PostConstructpublic void init() {}public void sendMessage() {try {new BasicClient().test();} catch (XMPPException e) {jsfUtilEJB.addErrorMessage(e,"Could not send");}}
}

当然,EJB:

import javax.ejb.Stateless;
import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.FacesContext;@Stateless
public class JSFUtilEJB {@SuppressWarnings("unchecked")public <T> T findBean(String beanName) {FacesContext context = FacesContext.getCurrentInstance();return (T) context.getApplication().evaluateExpressionGet(context, "#{" + beanName + "}", Object.class);}public long addErrorMessage(String msg) {return addMessage(null,FacesMessage.SEVERITY_ERROR,msg);}public long addErrorMessage(Exception e,String summary){return addMessage(e,FacesMessage.SEVERITY_ERROR,summary);}public long addFatalErrorMessage(Exception e,String summary){return addMessage(e,FacesMessage.SEVERITY_FATAL,summary);}public long addInfoMessage(String summary){return addMessage(null,FacesMessage.SEVERITY_INFO,summary);}public long addWarnMessage(Exception e,String summary){return addMessage(e,FacesMessage.SEVERITY_WARN,summary);}public long addErrorMessage(Exception e) {return addMessage(e,FacesMessage.SEVERITY_ERROR,e.getMessage(),e.getClass().getSimpleName());}private long addMessage(Exception e,Severity severity, String summary) {FacesContext context = FacesContext.getCurrentInstance();String clientId = null;long id = -1;if (e != null){id = printStackTrace(e);FacesMessage facesMessage = null;if (e.getCause() instanceof org.apache.openjpa.persistence.EntityExistsException){facesMessage = new FacesMessage(severity,"[Error: #"+id+"] "+summary,"You are trying are to add a new object that already exists or your're trying to violate a unique constraint)" );    }else{facesMessage = new FacesMessage(severity,"[Error: #"+id+"] "+summary,e.getMessage() );}context.addMessage(clientId , facesMessage );}else{FacesMessage facesMessage = new FacesMessage(severity,summary," ");context.addMessage(clientId , facesMessage );}return id;}private long addMessage(Exception e,Severity severity, String summary, String detail) {FacesContext context = FacesContext.getCurrentInstance();String clientId = null;long id = -1;if (e != null){id = printStackTrace(e);        FacesMessage facesMessage = new FacesMessage(severity,"["+id+"] "+summary,detail );context.addMessage(clientId , facesMessage );}else{FacesMessage facesMessage = new FacesMessage(severity,summary,detail );context.addMessage(clientId , facesMessage );}return id;}public long printStackTrace(Exception e){long uniqueId = System.currentTimeMillis();return uniqueId;}}

import java.io.File;
import java.io.Serializable;import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;import org.apache.vysper.mina.TCPEndpoint;
import org.apache.vysper.storage.StorageProviderRegistry;
import org.apache.vysper.storage.inmemory.MemoryStorageProviderRegistry;
import org.apache.vysper.xmpp.addressing.EntityImpl;
import org.apache.vysper.xmpp.authorization.AccountManagement;
import org.apache.vysper.xmpp.server.XMPPServer;@Startup
@Singleton
public class XmppEJB implements Serializable {/*** <br>06/09/2014*/private static final long serialVersionUID = 1L;private boolean started;@PostConstructpublic void init() {try {// choose the storage you want to use//        StorageProviderRegistry providerRegistry = new JcrStorageProviderRegistry();StorageProviderRegistry providerRegistry = new MemoryStorageProviderRegistry();final AccountManagement accountManagement = (AccountManagement) providerRegistry.retrieve(AccountManagement.class);if(!accountManagement.verifyAccountExists(EntityImpl.parse("user1@vysper.org"))) {accountManagement.addUser(EntityImpl.parse("user1@vysper.org"), "password");}if(!accountManagement.verifyAccountExists(EntityImpl.parse("user2@vysper.org"))) {accountManagement.addUser(EntityImpl.parse("user2@vysper.org"), "password");}XMPPServer server = new XMPPServer("vysper.org");server.addEndpoint(new TCPEndpoint());server.setStorageProviderRegistry(providerRegistry);server.setTLSCertificateInfo(new File("/path/to/bogus_mina_tls.cert"), "boguspw");server.start();System.out.println("server is running...");} catch (Exception e) {e.printStackTrace();}started = true;}public boolean isStarted() {return this.started;}}

还有来自Vysper的基本客户端。

import java.util.Date;import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.PacketListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.SASLAuthentication;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.IQ;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.PacketExtension;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smackx.packet.Time;
import org.jivesoftware.smackx.packet.Version;public class BasicClient {static class IQListener implements PacketListener {public void processPacket(Packet packet) {IQ iq = (IQ) packet;String iqString = iq.toString();System.out.println("T" + System.currentTimeMillis() + " IQ: "+ iqString + ": " + iq.toXML());}}static class PresenceListener implements PacketListener {public void processPacket(Packet packet) {Presence presence = (Presence) packet;String iqString = presence.toString();final PacketExtension extension = presence.getExtension("http://jabber.org/protocol/caps");if (extension != null)System.out.println("T" + System.currentTimeMillis() + " Pres: "+ iqString + ": " + presence.toXML());}}public void test() throws XMPPException {String me = "user2@vysper.org";String to = "user1@vysper.org";try {ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("localhost");connectionConfiguration.setCompressionEnabled(false);connectionConfiguration.setSelfSignedCertificateEnabled(true);connectionConfiguration.setExpiredCertificatesCheckEnabled(false);
//            connectionConfiguration.setDebuggerEnabled(true);connectionConfiguration.setSecurityMode(ConnectionConfiguration.SecurityMode.required);
//            XMPPConnection.DEBUG_ENABLED = true;XMPPConnection connection = new XMPPConnection(connectionConfiguration);connection.connect();SASLAuthentication saslAuthentication = connection.getSASLAuthentication();saslAuthentication.authenticate(me, "password", "test");connection.login(me, "pqssword");connection.getRoster().setSubscriptionMode(Roster.SubscriptionMode.accept_all);connection.addPacketListener(new IQListener(), new PacketFilter() {public boolean accept(Packet packet) {return packet instanceof IQ;}});connection.addPacketListener(new PresenceListener(),new PacketFilter() {public boolean accept(Packet packet) {return packet instanceof Presence;}});Chat chat = null;if (to != null) {Presence presence = new Presence(Presence.Type.subscribe);presence.setFrom(connection.getUser());String toEntity = to;presence.setTo(toEntity);connection.sendPacket(presence);chat = connection.getChatManager().createChat(toEntity,new MessageListener() {public void processMessage(Chat inchat,Message message) {System.out.println("log received message: "+ message.getBody());}});}connection.sendPacket(new Presence(Presence.Type.available,"pommes", 1, Presence.Mode.available));Thread.sleep(1000);// query server versionsendIQGetWithTimestamp(connection, new Version());// query server timesendIQGetWithTimestamp(connection, new Time());chat.sendMessage("Hello " + to + " at " + new Date());connection.disconnect();} catch (Throwable e) {e.printStackTrace(); // To change body of catch statement use File |// Settings | File Templates.}System.out.println("bye");}private static void sendIQGetWithTimestamp(XMPPConnection connection, IQ iq) {iq.setType(IQ.Type.GET);connection.sendPacket(iq);System.out.println("T" + System.currentTimeMillis()+ " IQ request sent");}
}

我们快要准备好了。 当然,现在我们需要一个XMPP客户端,例如Pidgin 。

首先,我只想对本博客表示感谢 ,因为我不知道为什么,Vysper站点几乎没有关于如何配置Pidgin的信息,因此该博客文章非常有用。

让我向您展示我的pidgin用户的样子:

1

2

3

我知道,是葡萄牙语。

就是这样。 我们都准备好了。 启动您的JSF Web应用程序并播放。

注意,通信是双向的,因此您可以仅使用XMPP客户端将命令发送到服务器。 为此,您只需要更改此侦听器即可:

chat = connection.getChatManager().createChat(toEntity,new MessageListener() {public void processMessage(Chat inchat,Message message) {System.out.println("log received message: "+ message.getBody());}});

我想知道是否可以创建一个DSL来处理一些命令,是否可以找到一些自动完成的pidgin插件来使用此DSL编写命令。 欢迎提出建议!

ps。 EJB不能正常关闭服务器。 但是我敢打赌,如果服务器关闭,有一些EJB注释可以做到这一点。

翻译自: https://www.javacodegeeks.com/2014/09/embedding-a-xmpp-server-inside-your-jsf-web-application-using-vysper-tomee-and-primefaces.html

tomee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

板框导入_板框结构导入有问题?这几个问题最常见,附解决方法!

对于一些比较复杂的结构&#xff0c;Altium的处理能力有限&#xff0c;通常采用AutoCAD来进行设计&#xff0c;然后在Altium中执行菜单栏中“文件”→“导入”→DWG/DXF命令&#xff0c;选择需要导入的DXF文件即可。如果导入过程中出现了乱码&#xff0c;报错等问题要如何解决呢…

您如何使用硒来计算自动化测试的投资回报率?

跨浏览器测试是一种测试&#xff0c;需要大量的精力和时间。 通过不同的浏览器&#xff0c;操作系统&#xff0c;设备&#xff0c;屏幕分辨率测试Web应用程序&#xff0c;以评估针对各种受众的Web内容呈现的过程是一项活动。 特别是如果手动处理。 使用Selenium进行的自动跨浏览…

流量复制_详解Linux系统流量复制--gor、tcpcopy、nginx模块流量复制等

概述对于一些有并发要求的业务&#xff0c;特别是对接外部流量时&#xff0c;产品上线前一定要做的就是压力测试&#xff0c;但是常规的压力测试并不能覆盖所有情况。以gemeter、ab,、webbench、http_load为例&#xff0c;这些通过模拟请求的压测工具&#xff0c;只能发送特定的…

C语言天才!想法奇异?还是逼格满满?一份国外C语言写的传奇简历

C语言天才&#xff01;想法奇异&#xff1f;还是逼格满满&#xff1f;一份国外C语言写的传奇简历作者用代码更新了自己的简历&#xff0c;是不是很接地气&#xff0c;特符合程序员的逼格。这是一份可读可执行的语言源文件&#xff0c;也是作者编码风格的体现。C语言源码&#x…

hash值 更改git_Git切换版本

Git切换版本有三种方式&#xff1a;1.基于哈希值切换》基于哈希值切换(推荐)&#xff0c;命令&#xff1a;git reset --hard 哈希值&#xff0c;哈希值从哪来&#xff0c;git reflog查看下就知道了&#xff0c;切换版本后&#xff0c;git reflog会发现有两个HEAD&#xff0c;别…

fedora mysql_Fedora server 安装Mysql8

导读MySQL是一种关系数据库管理系统(RDBMS)&#xff0c;作为服务器运行&#xff0c;提供对多个数据库的多用户访问。 这是指导&#xff0c;如何在Fedora 28/27/26&#xff0c;CentOS 7.5 / 6.10和Red Hat(RHEL)7.5 / 6.10上安装或升级MySQL社区服务器最新版本8.0(8.0.12)/5.7(5…

lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

lombok 生成代码对Java编程语言最常提出的批评之一是它需要大量的样板代码 。 对于简单的类尤其如此&#xff0c;该类只需要存储一些值就可以。 您需要这些值的getter和setter方法&#xff0c;也许您还需要一个构造函数&#xff0c;覆盖equals&#xff08;&#xff09;和 hash…

让C/C++程序员告诉你什么叫浪漫,表白黑科技,炫酷多彩求爱利器

前言缘是美丽的邂逅&#xff0c;爱是心跳的感觉&#xff0c;情是心灵的交会&#xff0c;恋是甜蜜的思念&#xff0c;走在爱与被爱的边缘&#xff0c;你见或者不见&#xff0c;爱你的心始终不改变&#xff01;C语言诠释爱——为TA写下心中情&#xff0c;生成程序传给TA&#xff…

Java十六进制浮点文字

我如何遇到十六进制浮点数 我正在Java :: Geci中开发一种新功能&#xff0c;以减少代码重新格式化的可能性。 如果重新格式化&#xff0c;当前版本的代码将覆盖原本相同的代码。 这很烦人&#xff0c;因为按下重新格式化键的快捷键相当容易&#xff0c;而且许多项目甚至要求开发…

C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例

C语言对自己电脑做的事儿啊&#xff0c;总有那么一丝恐怖&#xff0c;C语言与电脑两例开场先抱歉&#xff0c;偷懒好多天了。今天分享给大家的l两例比较短小精悍&#xff0c;都是针对于计算机屏幕处理的两例&#xff0c;有兴趣的可以放到自己电脑上运行哦。绝对无害&#xff0c…

servlets_jQuery Ajax – Servlets集成:构建完整的应用程序

servlets网上有很多教程&#xff0c;它们解释了有关使用servlet和JSP页面进行Java Web开发的一些知识&#xff0c;但是&#xff0c;我从未找到对于初学者来说足够简洁的教程。 这样的教程应该解释创建一个简单的Web应用程序的整个过程&#xff0c;包括前端&#xff0c;后端&…

mysql分库分表的缺点_MySQL分库分表会带来哪些问题?

分库分表能有效的环节单机和单库带来的性能瓶颈和压力&#xff0c;突破网络IO、硬件资源、连接数的瓶颈&#xff0c;同时也带来了一些问题。下面将描述这些技术挑战以及对应的解决思路。1、事务一致性问题分布式事务当更新内容同时分布在不同库中&#xff0c;不可避免会带来跨库…

C语言的恶趣味,胆小者莫入,以免入门到放弃,C语言夺命题十例!

前言这些问题测试了C语言的高级知识&#xff0c;包括一些很少使用的特性。有效的C编程需要对诸如未定义的行为&#xff0c;递归和指针算术等概念有深入的理解&#xff0c;但是这些故意复杂的例子并不代表现实世界的代码&#xff0c;当然也不会为了清晰和可维护性而获得任何奖励…

java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验

java学习里程碑miles2run.org是跟踪跑步活动并与亲朋好友共享的简便方法。 可以创建然后跟踪基于天或基于距离的目标。 它还允许创建社区运行目标&#xff0c;并使多个跑步者参与并跟踪他们朝着该目标的活动。 您还可以找出本地跑步者并与他们联系。 该项目已开始&#xff0c;…

遇C语言条件编译就犯怵,不知什么意思,c语言头文件中的宏定义

前言看见头文件中的条件编译就犯怵&#xff0c;不知什么意思&#xff0c;但是&#xff0c;你老师说&#xff1a;”就得那么写“&#xff0c;你照做&#xff0c;但是知其然而不知其所以然。今天分享下是自己的理解~~~纯属个人献丑&#xff0c;新手可阅&#xff0c;老鸟绕道。代码…

pcie3.0一条通道带宽_小技巧|内存双通道提升性能

今天给大家分享一个小技巧&#xff0c;如果你的电脑有两条或以上的内存条&#xff0c;不同的内存插法也是会影响性能的哦&#xff0c;也就是内存双通道。什么是双通道&#xff1f;双通道内存说白了是两条内存由串联方式改良为并联方式&#xff0c;以得到更大的内存带宽&#xf…

C++简介源码讲解精辟版,C++入门级C++学习,C++与C的区别值得知晓

C简介源码讲解精辟版,C入门级C学习&#xff0c;C与C的区别值得知晓C语言和C基础区别C标准输入和输出命名空1.命名空间的定义 &#xff1a;namespace 标识符{ } 例&#xff1a;namespace my{int a1;}命名空间中的成员访问&#xff1a;作用域分辨符&#xff1a;&#xff1a; 例&a…

jbpm 和 drools_Drools和jBPM KIE A​​pps平台

jbpm 和 drools随着Drools和jBPM&#xff08;KIE&#xff09;6系列出现了一个新的工作台&#xff0c;并有望最终实现用户的可扩展性。 我终于有了一些预告片&#xff0c;以显示此工作原理以及所存储的内容。 确保选择1080p并全屏显示它们的最佳状态。 &#xff08;点击放大&am…

mysql 1308_Mysql恢复数据报ERROR 1308 : LEAVE with no matching label_MySQL

赶紧看备份日志&#xff0c;日志如下&#xff1a;----------------------------------BEG:20151108 01:00:01FTP:20151108 01:00:05CLS:20151108 01:00:07OPT:20151108 01:00:08END:20151108 01:00:08----------------------------------日志并没有什么异常&#xff0c;既然说有…

真正的C与C++编程高手是什么?臭美的群体!如何编写高质量代码?

前 言软件质量是被大多数程序员挂在嘴上而不是放在心上的东西&#xff01;除了完全外行和真正的编程高手外&#xff0c;初读本书&#xff0c;你最先的感受将是惊慌&#xff1a;“哇&#xff01;我以前捏造的C/C程序怎么会有那么多的毛病&#xff1f;”别难过&#xff0c;作者只…