There's been a reworking of the session tracking on the [jetty-9.3.x]
branch.

https://github.com/eclipse/jetty.project/commit/57224ec3ca3b07e3fc0689857994c7749173de33

481986 - Dead JSR 356 Server Session still being tracked after
Session/Connection closure

+ Removing SessionListener
+ Work in CDI layer for WebSocketContainerScope is reused for
  session tracking on the parent scope of the WebSocketSession only.
  no more multi-listener behavior
+ Reworked JsrSession ID behavior to not be based on AtomicLong
+ AbstractWebSocketConnection now has .hashCode and .equals


This commit already exists in version 9.3.7-SNAPSHOT at the Jetty snapshots
repository

https://oss.sonatype.org/content/repositories/jetty-snapshots/

Please give this snapshot version a whirl.
It's a purely speculative change as we cannot replicate your leak locally.

Joakim Erdfelt / [email protected]

On Wed, Jan 13, 2016 at 1:49 AM, Salvadè Angelo <[email protected]>
wrote:

> Hi Joakim
>
>
> Thanks for the quick reply.
>
> Please have another look at my demo
> https://github.com/softappeal/yass/blob/master/src/test/java/ch/softappeal/yass/transport/ws/test/JettyWebSocketLeak.java
> .
> I enhanced it slightly:
>     - only explicitly closing client session (with Session.close())
>     - added sleeps
>     - client session closing is now asynchronous
>
> If you look at the program output, you see that:
>     - the client connects to the server, client and server side sessions
> will be created:
>         >>> opening server session 678919052
>         >>> opening client session 342587933
>     - after 5s, the client session is closed with Session.close() and then
> the Endpoint.onClose callbacks for both session are called:
>         >>> closing client session 342587933
>         >>> client session 342587933 closed with CloseReason[1000]
>         >>> server session 678919052 closed with CloseReason[1000]
>     - after 10s, the leaked server session is printed:
>         >>> printing leaked server sessions ...
>         >>>     session 678919052
>
> I'm quite sure that I use the Java WebSocket API correctly. The program
> output seems to show this.
> I also programmed the same demo for Undertow/Wildfly
> https://github.com/softappeal/yass/blob/master/src/test/java/ch/softappeal/yass/transport/ws/test/UndertowWebSocketNoLeak.java
> .
> It also behaves the same.
>
> Please notice that I configure the endpoints using the interface-driven
> approach and not the annotation-driven one.
> You used the annotation-driven approach in your example.
>
> I believe that its quite clear that there is really a memory leak in Jetty
> using the interface-driven approach.
> The correctly closed JsrSessions will never be removed from the
> WebSocketServerFactory._beans (removeBean() is never called); even after
> days.
>
> In fact, we have productive servers crashing after a couple of days with
> OutOfMemoryErrors.
> The dumps show tens of thousands of correctly closed JsrSessions in
> WebSocketServerFactory._beans.
> No JsrSession is ever removed.
> In our productive setup the clients are browsers connecting with
> WebSockets.
>
> I hope that you agree that this is really a bug.
> If so, could you please open an issue?
>
>
> Regards,
> Angelo
>
>
>
> ------------------------------------------------------------------------------------------------------------------------
>
>
> package ch.softappeal.yass.transport.ws.test;
>
> import org.eclipse.jetty.server.Server;
> import org.eclipse.jetty.server.ServerConnector;
> import org.eclipse.jetty.servlet.ServletContextHandler;
> import org.eclipse.jetty.websocket.jsr356.ClientContainer;
> import org.eclipse.jetty.websocket.jsr356.JsrSession;
> import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
> import
> org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
> import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
>
> import javax.websocket.ClientEndpointConfig;
> import javax.websocket.CloseReason;
> import javax.websocket.Endpoint;
> import javax.websocket.EndpointConfig;
> import javax.websocket.Extension;
> import javax.websocket.HandshakeResponse;
> import javax.websocket.Session;
> import javax.websocket.server.HandshakeRequest;
> import javax.websocket.server.ServerEndpointConfig;
> import java.net.URI;
> import java.util.ArrayList;
> import java.util.List;
> import java.util.concurrent.TimeUnit;
>
> public class JettyWebSocketLeak {
>
>     public static class WsConfigurator extends
> ServerEndpointConfig.Configurator {
>         private final String side;
>         public WsConfigurator(String side) {
>             this.side = side;
>         }
>         @SuppressWarnings("unchecked")
>         @Override public <T> T getEndpointInstance(Class<T> endpointClass)
> {
>             return (T)new Endpoint() {
>                 @Override public void onOpen(Session session,
> EndpointConfig config) {
>                     System.out.println("opening " + side + " session " +
> session.hashCode());
>                     if ("client".equals(side)) {
>                         new Thread(() -> {
>                             try {
>                                 TimeUnit.SECONDS.sleep(5);
>                                 System.out.println();
>                                 System.out.println("closing " + side + "
> session " + session.hashCode());
>                                 session.close();
>                             } catch (Exception e) {
>                                 throw new RuntimeException(e);
>                             }
>                         }).start();
>                     }
>                 }
>                 @Override public void onClose(Session session, CloseReason
> closeReason) {
>                     System.out.println(side + " session " +
> session.hashCode() + " closed with " + closeReason);
>                 }
>                 @Override public void onError(Session session, Throwable
> throwable) {
>                 }
>             };
>         }
>         @Override public String getNegotiatedSubprotocol(List<String>
> supported, List<String> requested) {
>             return "";
>         }
>         @Override public List<Extension>
> getNegotiatedExtensions(List<Extension> installed, List<Extension>
> requested) {
>             return new ArrayList<>();
>         }
>         @Override public boolean checkOrigin(String originHeaderValue) {
>             return true;
>         }
>         @Override public void modifyHandshake(ServerEndpointConfig sec,
> HandshakeRequest request, HandshakeResponse response) {
>         }
>     }
>
>     public static int PORT = 9090;
>     public static String PATH = "/test";
>     public static URI THE_URI = URI.create("ws://localhost:" + PORT +
> PATH);
>
>     public static void main(String... args) throws Exception {
>         Server server = new Server();
>         ServerConnector serverConnector = new ServerConnector(server);
>         serverConnector.setPort(PORT);
>         server.addConnector(serverConnector);
>         ServletContextHandler servletContextHandler = new
> ServletContextHandler(ServletContextHandler.NO_SESSIONS);
>         servletContextHandler.setContextPath("/");
>         server.setHandler(servletContextHandler);
>         ServerContainer serverContainer =
> WebSocketServerContainerInitializer.configureContext(servletContextHandler);
>         serverContainer.addEndpoint(
>             ServerEndpointConfig.Builder.create(Endpoint.class,
> PATH).configurator(new WsConfigurator("server")).build()
>         );
>         server.start();
>         ClientContainer clientContainer = new ClientContainer();
>         clientContainer.start();
>         clientContainer.connectToServer(
>             new
> WsConfigurator("client").getEndpointInstance(Endpoint.class),
>             ClientEndpointConfig.Builder.create().build(),
>             THE_URI
>         );
>         TimeUnit.SECONDS.sleep(10);
>         System.out.println();
>         System.out.println("printing leaked server sessions ...");
>         serverContainer.getBeans(WebSocketServerFactory.class).forEach(
>             factory -> factory.getBeans(JsrSession.class).forEach(
>                 session -> System.out.println("    session " +
> session.hashCode())
>             )
>         );
>         /* program output:
>
>         opening server session 678919052
>         opening client session 342587933
>
>         closing client session 342587933
>         client session 342587933 closed with CloseReason[1000]
>         server session 678919052 closed with CloseReason[1000]
>
>         printing leaked server sessions ...
>             session 678919052
>
>         */
>     }
>
> }
>
>
>
> ------------------------------------------------------------------------------------------------------------------------
>
> Von: [email protected] [mailto:
> [email protected]] Im Auftrag von Joakim Erdfelt
> Gesendet: Dienstag, 12. Januar 2016 17:14
> An: JETTY user mailing list
> Betreff: [EXTERN] Re: [jetty-users] Memory leak with websockets
>
> Here's yours modified to wait for close before testing the list of beans.
>
> https://gist.github.com/joakime/1abe75ca14bd05a747b0
>
> The output of that I get on my Linux machine ...
>
>   java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
>   java.awt.printerjob = sun.print.PSPrinterJob
>   java.class.path =
> /home/joakim/code/jetty/Playground/target/classes:/home/joakim/.m2/repository/org/jboss/weld/servlet/weld-servlet/2.2.9.Final/weld-servlet-2.2.9.Final.jar:/home/joakim/.m2/repository/javax/websocket/javax.websocket-api/1.0/javax.websocket-api-1.0.jar:/home/joakim/.m2/repository/javax/servlet/javax.servlet-api/3.1.0/javax.servlet-api-3.1.0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-deploy/9.3.7.RC0/jetty-deploy-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-xml/9.3.7.RC0/jetty-xml-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-http/9.3.7.RC0/jetty-http-9.3.7.RC0-tests.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-util/9.3.7.RC0/jetty-util-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-webapp/9.3.7.RC0/jetty-webapp-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-servlet/9.3.7.RC0/jetty-servlet-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-servlets/9.3.7.RC0/jetty-servlets-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-continuation/9.3.7.RC0/jetty-continuation-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-http/9.3.7.RC0/jetty-http-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-io/9.3.7.RC0/jetty-io-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-annotations/9.3.7.RC0/jetty-annotations-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-plus/9.3.7.RC0/jetty-plus-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-jndi/9.3.7.RC0/jetty-jndi-9.3.7.RC0.jar:/home/joakim/.m2/repository/javax/annotation/javax.annotation-api/1.2/javax.annotation-api-1.2.jar:/home/joakim/.m2/repository/org/ow2/asm/asm/5.0.1/asm-5.0.1.jar:/home/joakim/.m2/repository/org/ow2/asm/asm-commons/5.0.1/asm-commons-5.0.1.jar:/home/joakim/.m2/repository/org/ow2/asm/asm-tree/5.0.1/asm-tree-5.0.1.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/javax-websocket-server-impl/9.3.7.RC0/javax-websocket-server-impl-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/javax-websocket-client-impl/9.3.7.RC0/javax-websocket-client-impl-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/websocket-client/9.3.7.RC0/websocket-client-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/websocket-server/9.3.7.RC0/websocket-server-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/websocket-common/9.3.7.RC0/websocket-common-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/websocket-api/9.3.7.RC0/websocket-api-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/websocket/websocket-servlet/9.3.7.RC0/websocket-servlet-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-rewrite/9.3.7.RC0/jetty-rewrite-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-server/9.3.7.RC0/jetty-server-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-client/9.3.7.RC0/jetty-client-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-proxy/9.3.7.RC0/jetty-proxy-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-servlet/9.3.7.RC0/jetty-servlet-9.3.7.RC0-tests.jar:/home/joakim/.m2/repository/org/eclipse/jetty/jetty-security/9.3.7.RC0/jetty-security-9.3.7.RC0.jar:/home/joakim/.m2/repository/org/eclipse/jetty/toolchain/jetty-test-helper/2.9/jetty-test-helper-2.9.jar:/home/joakim/.m2/repository/junit/junit/4.11/junit-4.11.jar:/home/joakim/.m2/repository/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar:/home/joakim/.m2/repository/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar
>   java.class.version = 52.0
>   java.endorsed.dirs = /home/joakim/java/jvm/jdk-8u60/jre/lib/endorsed
>   java.ext.dirs =
> /home/joakim/java/jvm/jdk-8u60/jre/lib/ext:/usr/java/packages/lib/ext
>   java.home = /home/joakim/java/jvm/jdk-8u60/jre
>   java.io.tmpdir = /tmp
>   java.library.path =
> /usr/lib/jni:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
>   java.runtime.name = Java(TM) SE Runtime Environment
>   java.runtime.version = 1.8.0_60-b27
>   java.specification.name = Java Platform API Specification
>   java.specification.vendor = Oracle Corporation
>   java.specification.version = 1.8
>   java.vendor = Oracle Corporation
>   java.vendor.url = http://java.oracle.com/
>   java.vendor.url.bug = http://bugreport.sun.com/bugreport/
>   java.version = 1.8.0_60
>   java.vm.info = mixed mode
>   java.vm.name = Java HotSpot(TM) 64-Bit Server VM
>   java.vm.specification.name = Java Virtual Machine Specification
>   java.vm.specification.vendor = Oracle Corporation
>   java.vm.specification.version = 1.8
>   java.vm.vendor = Oracle Corporation
>   java.vm.version = 25.60-b23
>   sun.arch.data.model = 64
>   sun.boot.class.path =
> /home/joakim/java/jvm/jdk-8u60/jre/lib/resources.jar:/home/joakim/java/jvm/jdk-8u60/jre/lib/rt.jar:/home/joakim/java/jvm/jdk-8u60/jre/lib/sunrsasign.jar:/home/joakim/java/jvm/jdk-8u60/jre/lib/jsse.jar:/home/joakim/java/jvm/jdk-8u60/jre/lib/jce.jar:/home/joakim/java/jvm/jdk-8u60/jre/lib/charsets.jar:/home/joakim/java/jvm/jdk-8u60/jre/lib/jfr.jar:/home/joakim/java/jvm/jdk-8u60/jre/classes
>   sun.boot.library.path = /home/joakim/java/jvm/jdk-8u60/jre/lib/amd64
>   sun.cpu.endian = little
>   sun.cpu.isalist =
>   sun.desktop = gnome
>   sun.io.unicode.encoding = UnicodeLittle
>   sun.java.command = jetty.websocket.JettyWebSocketLeak
>   sun.java.launcher = SUN_STANDARD
>   sun.jnu.encoding = UTF-8
>   sun.management.compiler = HotSpot 64-Bit Tiered Compilers
>   sun.os.patch.level = unknown
>   user.country = US
>   user.dir = /home/joakim/code/jetty/Playground
>   user.home = /home/joakim
>   user.language = en
>   user.name = joakim
>   user.timezone =
> 2016-01-12 09:07:21.879:INFO::main: Logging initialized @182ms
> 2016-01-12 09:07:21.979:INFO:oejs.Server:main: jetty-9.3.7.RC0
> 2016-01-12 09:07:22.228:INFO:oejsh.ContextHandler:main: Started
> o.e.j.s.ServletContextHandler@62bd765{/,null,AVAILABLE}
> 2016-01-12 09:07:22.236:INFO:oejs.ServerConnector:main: Started
> ServerConnector@351d0846{HTTP/1.1,[http/1.1]}{0.0.0.0:9090}
> 2016-01-12 09:07:22.237:INFO:oejs.Server:main: Started @541ms
> printing the leaked server side sessions ...
> 2016-01-12 09:07:22.353:INFO:oejs.ServerConnector:main: Stopped
> ServerConnector@351d0846{HTTP/1.1,[http/1.1]}{0.0.0.0:9090}
> 2016-01-12 09:07:22.354:INFO:oejsh.ContextHandler:main: Stopped
> o.e.j.s.ServletContextHandler@62bd765{/,null,UNAVAILABLE}
>
> If I get rid of the 2 lines ...
>   cli1.waitForClose();
>   cli2.waitForClose();
>
> Then I occasionally (its not 100% of the time) see some (still open)
> WebSocketSession's lingering as beans on the WebSocketServerFactory.
>
>
>
> Joakim Erdfelt / [email protected]
>
> On Tue, Jan 12, 2016 at 8:54 AM, Joakim Erdfelt <[email protected]>
> wrote:
> You are testing for beans against client connections that are still
> actively connected.
> If you change this to actually wait for the clients to register an
> onClose() before testing the server side beans list you'll see its empty.
> Merely issuing clientContainer.stop() starts the close handshake,
> abruptly, and abnormally, not giving the server a chance to complete the
> close handshake.
>
> example:
>
> https://github.com/eclipse/jetty.project/blob/master/jetty-websocket/websocket-client/src/test/java/org/eclipse/jetty/websocket/client/SessionTest.java#L98-L107
>
>
> Joakim Erdfelt / [email protected]
>
> On Tue, Jan 12, 2016 at 8:33 AM, Salvadè Angelo <[email protected]>
> wrote:
> Hi
>
> I have the same problem.
> Please have a look at
> https://github.com/softappeal/yass/blob/master/src/test/java/ch/softappeal/yass/transport/ws/test/JettyWebSocketLeak.java
> .
> It shows the leak.
>
> Regards,
> Angelo
>
>
> ---------------------------------------------------------------------------------------------------------------------------------------------
>
> package ch.softappeal.yass.transport.ws.test;
>
> import org.eclipse.jetty.server.Server;
> import org.eclipse.jetty.server.ServerConnector;
> import org.eclipse.jetty.servlet.ServletContextHandler;
> import org.eclipse.jetty.websocket.jsr356.ClientContainer;
> import org.eclipse.jetty.websocket.jsr356.JsrSession;
> import org.eclipse.jetty.websocket.jsr356.server.ServerContainer;
> import
> org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer;
> import org.eclipse.jetty.websocket.server.WebSocketServerFactory;
>
> import javax.websocket.ClientEndpointConfig;
> import javax.websocket.CloseReason;
> import javax.websocket.Endpoint;
> import javax.websocket.EndpointConfig;
> import javax.websocket.Extension;
> import javax.websocket.HandshakeResponse;
> import javax.websocket.Session;
> import javax.websocket.server.HandshakeRequest;
> import javax.websocket.server.ServerEndpointConfig;
> import java.io.IOException;
> import java.net.URI;
> import java.util.ArrayList;
> import java.util.List;
>
> public class JettyWebSocketLeak {
>
>     public static class WsConfigurator extends
> ServerEndpointConfig.Configurator {
>         @SuppressWarnings("unchecked")
>         @Override public <T> T getEndpointInstance(Class<T> endpointClass)
> {
>             return (T)new Endpoint() {
>                 @Override public void onOpen(Session session,
> EndpointConfig config) {
>                     try {
>                         System.out.println("closing " + session);
>                         session.close();
>                     } catch (IOException e) {
>                         throw new RuntimeException(e);
>                     }
>                 }
>                 @Override public void onClose(Session session, CloseReason
> closeReason) {
>                 }
>                 @Override public void onError(Session session, Throwable
> throwable) {
>                 }
>             };
>         }
>         public Endpoint getEndpointInstance() {
>             return getEndpointInstance(null);
>         }
>         @Override public String getNegotiatedSubprotocol(List<String>
> supported, List<String> requested) {
>             for (String r : requested) {
>                 if (supported.contains(r)) {
>                     return r;
>                 }
>             }
>             return "";
>         }
>         @Override public List<Extension>
> getNegotiatedExtensions(List<Extension> installed, List<Extension>
> requested) {
>             List<Extension> extensions = new ArrayList<>(requested.size());
>             for (Extension r : requested) {
>                 for (Extension i : installed) {
>                     if (i.getName().equals(r.getName())) {
>                         extensions.add(r);
>                         break;
>                     }
>                 }
>             }
>             return extensions;
>         }
>         @Override public boolean checkOrigin(String originHeaderValue) {
>             return true;
>         }
>         @Override public void modifyHandshake(ServerEndpointConfig sec,
> HandshakeRequest request, HandshakeResponse response) {
>         }
>     }
>
>     private static int PORT = 9090;
>     private static String PATH = "/test";
>     private static URI THE_URI = URI.create("ws://localhost:" + PORT +
> PATH);
>
>     private static void connectClient() throws Exception {
>         ClientContainer clientContainer = new ClientContainer();
>         clientContainer.start();
>         clientContainer.connectToServer(new
> WsConfigurator().getEndpointInstance(),
> ClientEndpointConfig.Builder.create().build(), THE_URI);
>         clientContainer.stop();
>     }
>
>     public static void main(String... args) throws Exception {
>         Server server = new Server();
>         ServerConnector serverConnector = new ServerConnector(server);
>         serverConnector.setPort(PORT);
>         server.addConnector(serverConnector);
>         ServletContextHandler servletContextHandler = new
> ServletContextHandler(ServletContextHandler.NO_SESSIONS);
>         servletContextHandler.setContextPath("/");
>         server.setHandler(servletContextHandler);
>         ServerContainer serverContainer =
> WebSocketServerContainerInitializer.configureContext(servletContextHandler);
>
> serverContainer.addEndpoint(ServerEndpointConfig.Builder.create(Endpoint.class,
> PATH).configurator(new WsConfigurator()).build());
>         server.start();
>         connectClient();
>         connectClient();
>         System.out.println("printing the leaked server side sessions ...");
>
> serverContainer.getBeans(WebSocketServerFactory.class).forEach(factory ->
> factory.getBeans(JsrSession.class).forEach(System.out::println));
>     }
>
> }
>
> ________________________________
>
> Disclaimer:
>
>
> Aufgrund der bisherigen E-Mail-Korrespondenz bzw. der getroffenen
> Absprache, betrachtet sich die Zürcher Kantonalbank als berechtigt, mit
> Ihnen per E-Mail zu kommunizieren. Die Zürcher Kantonalbank geht davon aus,
> dass Sie die Risiken von E-Mails kennen und in Kauf nehmen (insbesondere
> fehlende Vertraulichkeit, Manipulation oder Missbrauch durch Dritte,
> Fehlleitung, verzögerte Übermittlung oder Bearbeitung, Viren, etc.). Die
> Zürcher Kantonalbank lehnt jede Haftung für Schäden im Zusammenhang mit der
> Verwendung von E-Mails ab, sofern die Bank die geschäftsübliche Sorgfalt
> nicht verletzt hat.
>
> E-Mails werden nur während den üblichen Geschäftszeiten der Bank
> bearbeitet. Sie können nicht von der sofortigen Kenntnisnahme Ihrer E-Mails
> ausgehen. E-Mail eignet sich daher nicht für die Übermittlung von
> Handelsaufträgen und wertverschiebenden oder zeitkritischen Aufträgen (z.B.
> Zahlungsaufträge).
>
> Sollten Sie dieses E-Mail irrtümlicherweise erhalten haben, bitten wir
> Sie, das E-Mail an die Zürcher Kantonalbank zurückzusenden und das E-Mail
> anschliessend mitsamt allen Anhängen von ihrem System zu löschen. Der
> Gebrauch der im E-Mail enthaltenen Information ist verboten.
>
>
> Based on previous e-mail correspondence or an arrangement we have reached
> with you, Zürcher Kantonalbank considers itself to be entitled to
> communicate with you via e-mail. Zürcher Kantonalbank assumes that you know
> the risks associated with e-mails and that you accept them (in particular,
> the lack of confidentiality, manipulation or misuse by third parties,
> misdirection, delayed transmission or processing, viruses, etc.). Zürcher
> Kantonalbank accepts no liability whatsoever for damage caused in
> connection with the use of e-mail, provided that the Bank has not failed to
> exercise customary due care.
>
> E-mails are processed only during the Bank’s normal business hours. You
> cannot assume that your e-mails will be read immediately. E-mails are
> therefore not suitable for sending trading orders and orders that change
> the value of an account or are time-critical (e.g. payment orders).
>
> If you have received this e-mail in error, please respond to Zürcher
> Kantonalbank and then delete this e-mail and your response together with
> all attachments from your system. The use of the information contained in
> the e-mail is prohibited.
> _______________________________________________
> jetty-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users
>
>
>
> ________________________________
>
> Disclaimer:
>
>
> Aufgrund der bisherigen E-Mail-Korrespondenz bzw. der getroffenen
> Absprache, betrachtet sich die Zürcher Kantonalbank als berechtigt, mit
> Ihnen per E-Mail zu kommunizieren. Die Zürcher Kantonalbank geht davon aus,
> dass Sie die Risiken von E-Mails kennen und in Kauf nehmen (insbesondere
> fehlende Vertraulichkeit, Manipulation oder Missbrauch durch Dritte,
> Fehlleitung, verzögerte Übermittlung oder Bearbeitung, Viren, etc.). Die
> Zürcher Kantonalbank lehnt jede Haftung für Schäden im Zusammenhang mit der
> Verwendung von E-Mails ab, sofern die Bank die geschäftsübliche Sorgfalt
> nicht verletzt hat.
>
> E-Mails werden nur während den üblichen Geschäftszeiten der Bank
> bearbeitet. Sie können nicht von der sofortigen Kenntnisnahme Ihrer E-Mails
> ausgehen. E-Mail eignet sich daher nicht für die Übermittlung von
> Handelsaufträgen und wertverschiebenden oder zeitkritischen Aufträgen (z.B.
> Zahlungsaufträge).
>
> Sollten Sie dieses E-Mail irrtümlicherweise erhalten haben, bitten wir
> Sie, das E-Mail an die Zürcher Kantonalbank zurückzusenden und das E-Mail
> anschliessend mitsamt allen Anhängen von ihrem System zu löschen. Der
> Gebrauch der im E-Mail enthaltenen Information ist verboten.
>
>
> Based on previous e-mail correspondence or an arrangement we have reached
> with you, Zürcher Kantonalbank considers itself to be entitled to
> communicate with you via e-mail. Zürcher Kantonalbank assumes that you know
> the risks associated with e-mails and that you accept them (in particular,
> the lack of confidentiality, manipulation or misuse by third parties,
> misdirection, delayed transmission or processing, viruses, etc.). Zürcher
> Kantonalbank accepts no liability whatsoever for damage caused in
> connection with the use of e-mail, provided that the Bank has not failed to
> exercise customary due care.
>
> E-mails are processed only during the Bank’s normal business hours. You
> cannot assume that your e-mails will be read immediately. E-mails are
> therefore not suitable for sending trading orders and orders that change
> the value of an account or are time-critical (e.g. payment orders).
>
> If you have received this e-mail in error, please respond to Zürcher
> Kantonalbank and then delete this e-mail and your response together with
> all attachments from your system. The use of the information contained in
> the e-mail is prohibited.
> _______________________________________________
> jetty-users mailing list
> [email protected]
> To change your delivery options, retrieve your password, or unsubscribe
> from this list, visit
> https://dev.eclipse.org/mailman/listinfo/jetty-users
>
_______________________________________________
jetty-users mailing list
[email protected]
To change your delivery options, retrieve your password, or unsubscribe from 
this list, visit
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to