gpt4 book ai didi

java - 如何保证只创建一个XMPPConnection?使用单例?

转载 作者:行者123 更新时间:2023-12-01 05:39:09 24 4
gpt4 key购买 nike

我正在创建一个 Web 服务,它将接收通过 XMPP 发送消息的请求。但是,所有消息都将从一个帐户发送(服务器登录并向用户发送通知)。

问题来了——如何实现呢?我试图将 XMPPConnection 类实现为单例,但我在向包含主机名、端口、JID 等的构造函数传递参数时遇到了困难

据我读过here带参数的单例不是单例...因此,我考虑按如下方式解决它(是某种工厂吗?):

public class XMPPConnectionSingleton
{
private volatile static XMPPConnectionSingleton anInstance;
private volatile static XMPPConnection connection;

public static XMPPConnectionSingleton getInstance() {
if(anInstance == null) {
synchronized (XMPPConnectionSingleton.class) {
if(anInstance == null)
anInstance = new XMPPConnectionSingleton();
}
}
return anInstance;
}

public void init(String server, int port, String jid, String password, String resource)
{
ConnectionConfiguration conf = new ConnectionConfiguration(server, port);
connection = new XMPPConnection(conf);
// logging in, etc.
}
}

这是一个好方法吗?或者也许最好为 XMPPConnection 创建一个包装类,接受不带参数的构造函数?

最佳答案

您可以使用 ~singleton,请阅读此 question以及相关页面herehere 。最干净的方法是在静态 block 中初始化,但这显然并不总是可能的。

显而易见、简单的方法是在单个实例上进行同步,并且所有 WS 调用都会等待。这对于低容量来说非常有用。使用 ReentrantLock 可能会在某种程度上增强该逻辑 - 例如发送超时 WS 响应而不是发出整个 HTTP 调用。

如果您需要许多并发 session ,请考虑检查服务器是否可以使用多个客户端登录,然后根据需要初始化尽可能多的客户端 - 然后以某种方式使用 ReentrantLock 来确定哪个当前是空闲的。

根据 WS 调用中的逻辑(是否需要确认消息已发送到 XMPP?),您可能会考虑将调用排队并从另一个线程提供服务,在发送实际消息之前返回 WS 调用 (http保持时间通常为 30 秒,但可以更改)。

甚至可以让每个 WS session 连接并在调用期间拥有自己的 session 。

编辑:我建议你选择

// Correct lazy initialization in Java 
@ThreadSafe
class Foo {
private static class HelperHolder {
public static Helper helper = new Helper();
}

public static Helper getHelper() {
return HelperHolder.helper;
}
}

助手在哪里

  1. 一个帮助程序类,它从某处提取登录信息,包装 XMPP 客户端类,或者
  2. XMPP 客户端类本身带有硬编码的登录信息。

然后只需在返回的对象上使用同步运算符即可。

关于java - 如何保证只创建一个XMPPConnection?使用单例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com