# LDAP 未经请求的通知

> 原文： [https://docs.oracle.com/javase/tutorial/jndi/ldap/unsol.html](https://docs.oracle.com/javase/tutorial/jndi/ldap/unsol.html)

LDAP v3（ [RFC 2251](http://www.ietf.org/rfc/rfc2251.txt) ）定义 _ 未经请求的通知 _，该消息由 LDAP 服务器发送到客户端，而不会从客户端进行任何激发。未经请求的通知由 [`UnsolicitedNotification`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/UnsolicitedNotification.html)接口在 JNDI 中表示。

由于服务器异步发送未经请求的通知，因此您可以使用相同的[事件模型](https://docs.oracle.com/javase/jndi/tutorial/beyond/event/index.html)来接收有关命名空间更改和对象内容更改的通知。您通过注册 [`UnsolicitedNotificationListener`](https://docs.oracle.com/javase/8/docs/api/javax/naming/ldap/UnsolicitedNotificationListener.html)与 [`EventContext`](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/EventContext.html)或 [`EventDirContext` 注册接收未经请求的通知的兴趣 HTG13]。](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/EventDirContext.html)

这是 `Unsolicited NotificationListener` 的 [`an example`](examples/RegUnsol.java) 。

```
public class UnsolListener implements UnsolicitedNotificationListener {
    public void notificationReceived(UnsolicitedNotificationEvent evt) {
        System.out.println("received: " + evt);
    }

    public void namingExceptionThrown(NamingExceptionEvent evt) {
        System.out.println(">>> UnsolListener got an exception");
            evt.getException().printStackTrace();
    }
}

```

以下是 [`an example`](examples/RegUnsol.java) ，它使用事件源注册 `UnsolicitedNotificationListener` 的实现。请注意，只有 [`EventContext.addNamingListener（）`](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/EventContext.html#addNamingListener-javax.naming.Name-int-javax.naming.event.NamingListener-) 的侦听器参数是相关的。名称和范围参数与未经请求的通知无关。

```
// Get the event context for registering the listener
EventContext ctx = (EventContext)
    (new InitialContext(env).lookup("ou=People"));

// Create the listener
NamingListener listener = new UnsolListener();

// Register the listener with the context (all targets equivalent)
ctx.addNamingListener("", EventContext.ONELEVEL_SCOPE, listener);

```

运行此程序时，您需要将其指向可以生成未经请求的通知的 LDAP 服务器，并刺激服务器发出通知。否则，一分钟后程序将以静默方式退出。

实现 `UnsolicitedNotificationListener` 的监听器也可以实现其他 [`NamingListener`](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/NamingListener.html)接口，如 [`NamespaceChangeListener`](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/NamespaceChangeListener.html)和 [`ObjectChangeListener`](https://docs.oracle.com/javase/8/docs/api/javax/naming/event/ObjectChangeListener.html)。