<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://kerlinux.org/w/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://kerlinux.org/w/index.php?action=history&amp;feed=atom&amp;title=ActiveMQ</id>
		<title>ActiveMQ - Historique des versions</title>
		<link rel="self" type="application/atom+xml" href="http://kerlinux.org/w/index.php?action=history&amp;feed=atom&amp;title=ActiveMQ"/>
		<link rel="alternate" type="text/html" href="http://kerlinux.org/w/index.php?title=ActiveMQ&amp;action=history"/>
		<updated>2026-04-14T08:57:12Z</updated>
		<subtitle>Historique pour cette page sur le wiki</subtitle>
		<generator>MediaWiki 1.16.0</generator>

	<entry>
		<id>http://kerlinux.org/w/index.php?title=ActiveMQ&amp;diff=241&amp;oldid=prev</id>
		<title>SLiX : A protégé « ActiveMQ » ([edit=autoconfirmed] (infini) [move=autoconfirmed] (infini))</title>
		<link rel="alternate" type="text/html" href="http://kerlinux.org/w/index.php?title=ActiveMQ&amp;diff=241&amp;oldid=prev"/>
				<updated>2012-05-15T12:14:40Z</updated>
		
		<summary type="html">&lt;p&gt;A protégé « &lt;a href=&quot;/wiki/ActiveMQ&quot; title=&quot;ActiveMQ&quot;&gt;ActiveMQ&lt;/a&gt; » ([edit=autoconfirmed] (infini) [move=autoconfirmed] (infini))&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;← Version précédente&lt;/td&gt;
		&lt;td colspan='1' style=&quot;background-color: white; color:black;&quot;&gt;Version du 15 mai 2012 à 12:14&lt;/td&gt;
		&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>SLiX</name></author>	</entry>

	<entry>
		<id>http://kerlinux.org/w/index.php?title=ActiveMQ&amp;diff=225&amp;oldid=prev</id>
		<title>SLiX : /* Active MQ */</title>
		<link rel="alternate" type="text/html" href="http://kerlinux.org/w/index.php?title=ActiveMQ&amp;diff=225&amp;oldid=prev"/>
				<updated>2012-03-27T12:38:41Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Active MQ&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
		&lt;tr valign='top'&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Version précédente&lt;/td&gt;
		&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Version du 27 mars 2012 à 12:38&lt;/td&gt;
		&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 97 :&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Ligne 97 :&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Note''': Les tables seront créées automatiquement au lancement d'un serveur ActiveMQ&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;'''Note''': Les tables seront créées automatiquement au lancement d'un serveur ActiveMQ&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==== &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Active MQ &lt;/del&gt;====&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==== &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;ActiveMQ &lt;/ins&gt;====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Sur chaque futur serveur du cluster, suivre la procédure d'installation ''de base''&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;.&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Sur chaque futur serveur du cluster, suivre la procédure d'installation ''de base''&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; &lt;/ins&gt;voir [[ActiveMQ#Installation]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;* &lt;/del&gt;voir [[ActiveMQ#Installation]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==== Connecteur JDBC ====&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;==== Connecteur JDBC ====&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>SLiX</name></author>	</entry>

	<entry>
		<id>http://kerlinux.org/w/index.php?title=ActiveMQ&amp;diff=224&amp;oldid=prev</id>
		<title>SLiX : Page créée avec « {| align=&quot;right&quot; | __TOC__ |} [http://activemq.apache.org/ Apache ActiveMQ] est ''courtier de messages'' distribué sous licence libre.   == Installation ==  Procédure d'ins... »</title>
		<link rel="alternate" type="text/html" href="http://kerlinux.org/w/index.php?title=ActiveMQ&amp;diff=224&amp;oldid=prev"/>
				<updated>2012-03-27T12:37:08Z</updated>
		
		<summary type="html">&lt;p&gt;Page créée avec « {| align=&amp;quot;right&amp;quot; | __TOC__ |} [http://activemq.apache.org/ Apache ActiveMQ] est &amp;#39;&amp;#39;courtier de messages&amp;#39;&amp;#39; distribué sous licence libre.   == Installation ==  Procédure d&amp;#39;ins... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
| __TOC__&lt;br /&gt;
|}&lt;br /&gt;
[http://activemq.apache.org/ Apache ActiveMQ] est ''courtier de messages'' distribué sous licence libre. &lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Procédure d'installation basique permettant d'avoir un serveur autonome, ou pouvant servir de base pour un mode cluster.&lt;br /&gt;
&lt;br /&gt;
=== Installation sur RHEL 6 ===&lt;br /&gt;
&lt;br /&gt;
* Installer Java:&lt;br /&gt;
 # yum install java-1.6.0-sun&lt;br /&gt;
&lt;br /&gt;
* Créer un utilisateur ''activemq'':&lt;br /&gt;
 # groupadd -g 92 activemq &amp;amp;&amp;amp; useradd -u 92 -g 92 -m activemq&lt;br /&gt;
&lt;br /&gt;
* Désarchiver:&lt;br /&gt;
 # cd /opt&lt;br /&gt;
 # tar zxvf ~/apache-activemq-5.5.1-bin.tar.gz&lt;br /&gt;
&lt;br /&gt;
* Attribuer les droits:&lt;br /&gt;
 # chown -R activemq.activemq /opt/apache-activemq-5.5.1/&lt;br /&gt;
&lt;br /&gt;
* Créer un lien symbolique:&lt;br /&gt;
 # ln -s apache-activemq-5.5.1 activemq&lt;br /&gt;
&lt;br /&gt;
* Faire un lien du script de démarrage/arrêt en tant que script d'init:&lt;br /&gt;
 # ln -s /opt/activemq/bin/activemq /etc/init.d/activemq&lt;br /&gt;
&lt;br /&gt;
* Editer le script et ajouter au début les lignes ''chkconfig'' et ''description'' suivantes pour le rendre compatible avec ''chkconfig'':&lt;br /&gt;
 # '''vi /etc/init.d/activemq'''&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 # chkconfig: 2345 92 8&lt;br /&gt;
 # description: Apache ActiveMQ server&lt;br /&gt;
 (...)&lt;br /&gt;
&lt;br /&gt;
* Activer le service:&lt;br /&gt;
 # chkconfig --add activemq&lt;br /&gt;
&lt;br /&gt;
* Vérifier:&lt;br /&gt;
 # '''ls -l /etc/rc*.d/*activemq'''&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc0.d/K08activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc1.d/K08activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc2.d/S92activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc3.d/S92activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc4.d/S92activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc5.d/S92activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
 lrwxrwxrwx 1 root root 18 15 mars  14:10 /etc/rc6.d/K08activemq -&amp;gt; ../init.d/activemq&lt;br /&gt;
&lt;br /&gt;
* Créer un fichier de configuration et spécifier l'utilisateur avec lequel doit être lancé le service:&lt;br /&gt;
 # '''vi /etc/default/activemq'''&lt;br /&gt;
 ACTIVEMQ_USER=&amp;quot;activemq&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* Démarrer le service:&lt;br /&gt;
 # '''service activemq start'''&lt;br /&gt;
 INFO: Loading '/etc/default/activemq'&lt;br /&gt;
 INFO: Using java '/usr/bin/java'&lt;br /&gt;
 INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details&lt;br /&gt;
 INFO: changing to user 'activemq' to invoke java&lt;br /&gt;
 INFO: pidfile created : '/opt/activemq/data/activemq.pid' (pid '16665')&lt;br /&gt;
&lt;br /&gt;
== Cluster Master/Slave JDBC sur RHEL 6==&lt;br /&gt;
&lt;br /&gt;
=== Principe ===&lt;br /&gt;
&lt;br /&gt;
Dans ce mode de clustering, un seul serveur est actif à un moment donné, et un ou plusieurs serveurs sont en attente de prendre son rôle.&lt;br /&gt;
&lt;br /&gt;
Pour garantir cela, chaque serveur qui démarre se connecte à la base de données via JDBC et tente d'obtenir un verrou, avec une requête du genre:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;mysql&amp;quot;&amp;gt;&lt;br /&gt;
 SELECT * FROM ACTIVEMQ_LOCK FOR UPDATE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Celui qui obtient le verrou (normalement le 1er arrivé) continue son démarrage et fourni le service. Les autres se retrouvent à attendre le verrou.&lt;br /&gt;
&lt;br /&gt;
Si le serveur actif subit un incident (perte de connexion JDBC, plantage, ...), un des autres serveurs obtient immédiatement le verrou et devient le serveur actif.&lt;br /&gt;
&lt;br /&gt;
Avec cette configuration les clients doivent se connecter en utilisant la couche ''failover'', exemple:&lt;br /&gt;
&lt;br /&gt;
 failover:(tcp://srv01:61616,tcp://srv02:61616)&lt;br /&gt;
&lt;br /&gt;
=== Procédure ===&lt;br /&gt;
&lt;br /&gt;
==== Base de données ====&lt;br /&gt;
&lt;br /&gt;
Se connecter au serveur MySQL et:&lt;br /&gt;
&lt;br /&gt;
* Créer un schéma:&lt;br /&gt;
 mysql&amp;gt; '''create database activemq;'''&lt;br /&gt;
 Query OK, 1 row affected (0.00 sec)&lt;br /&gt;
&lt;br /&gt;
* Créer un utilisateur ayant les permissions nécessaires:&lt;br /&gt;
 mysql&amp;gt; '''grant all privileges on activemq.* to 'activemq'@'%' identified by '&amp;lt;PASSWORD&amp;gt;';'''&lt;br /&gt;
 Query OK, 0 rows affected (0.03 sec)&lt;br /&gt;
&lt;br /&gt;
'''Note''': Les tables seront créées automatiquement au lancement d'un serveur ActiveMQ&lt;br /&gt;
&lt;br /&gt;
==== Active MQ ====&lt;br /&gt;
&lt;br /&gt;
Sur chaque futur serveur du cluster, suivre la procédure d'installation ''de base''.&lt;br /&gt;
* voir [[ActiveMQ#Installation]]&lt;br /&gt;
&lt;br /&gt;
==== Connecteur JDBC ====&lt;br /&gt;
&lt;br /&gt;
Télécharger le connecteur JDBC MySQL:&lt;br /&gt;
* http://www.mysql.com/downloads/connector/j/&lt;br /&gt;
&lt;br /&gt;
Puis sur chaque serveur ActiveMQ du cluster:&lt;br /&gt;
&lt;br /&gt;
* Installer le connecteur JDBC/MySQL dans le répertoire lib/ d'ActiveMQ, exemple:&lt;br /&gt;
 # '''cp mysql-connector-java-5.1.13-bin.jar /opt/activemq/lib/'''&lt;br /&gt;
&lt;br /&gt;
==== Configuration ====&lt;br /&gt;
Sur chaque serveur ActiveMQ du cluster:&lt;br /&gt;
&lt;br /&gt;
* Arrêter le service ActiveMQ:&lt;br /&gt;
 # '''service activemq stop'''&lt;br /&gt;
 INFO: Loading '/etc/default/activemq'&lt;br /&gt;
 INFO: Using java '/usr/bin/java'&lt;br /&gt;
 INFO: changing to user 'activemq' to invoke java&lt;br /&gt;
 INFO: Waiting at least 30 seconds for regular process termination of pid '8867' :&lt;br /&gt;
 Java Runtime: Sun Microsystems Inc. 1.6.0_31 /usr/lib/jvm/java-1.6.0-sun-1.6.0.31.x86_64/jre&lt;br /&gt;
   Heap sizes: current=251264k  free=249951k  max=251264k&lt;br /&gt;
     JVM args: -Xms256M -Xmx256M -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Djava.util.logging.config.file=logging.properties -Dactivemq.classpath=/opt/activemq/conf; -Dactivemq.home=/opt/activemq -Dactivemq.base=/opt/activemq&lt;br /&gt;
 ACTIVEMQ_HOME: /opt/activemq&lt;br /&gt;
 ACTIVEMQ_BASE: /opt/activemq&lt;br /&gt;
 Connecting to pid: 8867&lt;br /&gt;
 Stopping broker: srv01&lt;br /&gt;
 . FINISHED&lt;br /&gt;
&lt;br /&gt;
* Editer le fichier de configuration et effectuer les actions suivantes ('''Attention''': L'ordre des sections est important !):&lt;br /&gt;
 # '''vim conf/activemq.xml'''&lt;br /&gt;
&lt;br /&gt;
* Changer le nom du broker par un identifiant unique (par exemple le nom d'hôte):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;broker xmlns=&amp;quot;http://activemq.apache.org/schema/core&amp;quot; brokerName=&amp;quot;localhost&amp;quot; dataDirectory=&amp;quot;${activemq.base}/data&amp;quot; destroyApplicationContextOnStop=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
devient&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;broker xmlns=&amp;quot;http://activemq.apache.org/schema/core&amp;quot; brokerName=&amp;quot;srv01&amp;quot; dataDirectory=&amp;quot;${activemq.base}/data&amp;quot; destroyApplicationContextOnStop=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Remplacer le ''persistentAdapter'':&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;persistenceAdapter&amp;gt;&lt;br /&gt;
    &amp;lt;kahaDB directory=&amp;quot;${activemq.base}/data/kahadb&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/persistenceAdapter&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
devient:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;persistenceAdapter&amp;gt;&lt;br /&gt;
    &amp;lt;jdbcPersistenceAdapter dataSource=&amp;quot;activemq-ds&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/persistenceAdapter&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Ajouter la source de données JDBC MySQL correspondant au schéma créé (en dehors de la section ''broker'', après '''&amp;lt;/broker&amp;gt;'''):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;bean id=&amp;quot;activemq-ds&amp;quot; class=&amp;quot;org.apache.commons.dbcp.BasicDataSource&amp;quot; destroy-method=&amp;quot;close&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;driverClassName&amp;quot; value=&amp;quot;com.mysql.jdbc.Driver&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;url&amp;quot; value=&amp;quot;jdbc:mysql://&amp;lt;DB_SERVER&amp;gt;/activemq?relaxAutoCommit=true&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;username&amp;quot; value=&amp;quot;activemq&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;password&amp;quot; value=&amp;quot;&amp;lt;PASSWORD&amp;gt;&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;property name=&amp;quot;poolPreparedStatements&amp;quot; value=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;
&amp;lt;/bean&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Démarrer le service ActiveMQ:&lt;br /&gt;
 # '''service activemq start'''&lt;br /&gt;
 INFO: Loading '/etc/default/activemq'&lt;br /&gt;
 INFO: Using java '/usr/bin/java'&lt;br /&gt;
 INFO: Starting - inspect logfiles specified in logging.properties and log4j.properties to get details&lt;br /&gt;
 INFO: changing to user 'activemq' to invoke java&lt;br /&gt;
 INFO: pidfile created : '/opt/activemq/data/activemq.pid' (pid '12870')&lt;br /&gt;
&lt;br /&gt;
=== Références ===&lt;br /&gt;
&lt;br /&gt;
* http://activemq.apache.org/jdbc-master-slave.html&lt;br /&gt;
* http://activemq.apache.org/failover-transport-reference.html&lt;br /&gt;
* http://blog.octo.com/creer-un-cluster-activemq-hautement-disponible/&lt;br /&gt;
&lt;br /&gt;
[[Catégorie:Applications]]&lt;/div&gt;</summary>
		<author><name>SLiX</name></author>	</entry>

	</feed>