IBM®
Перейти к тексту
    в России и странах СНГ [изменить]    Условия использования
 
 
   
    Главная страница    Продукты    Услуги и решения    Поддержка и загрузка    Мой профиль    
Перейти к тексту

developerWorks Россия  >  Lotus | XML  >

Функциональность оповещения в приложениях IBM Lotus Domino

Использование Ajax для мгновенного обмена сообщениями

developerWorks
Опции документа

Опции документа, требующие включения JavaScript, не отображаются

Обсудить

Исходные тексты примера


Выскажите мнение об этой странице

Помогите нам улучшить содержание


Уровень сложности: простой

Томас Нильсен, старший инженер-разработчик, Strand Interconnect

26.04.2007

Смотрите, кто находится в режиме online в вашей интранет-сети или в другом Web-приложении, и передавайте им сообщения. Узнайте, как богатые возможности IBM Lotus Domino, Asynchronous JavaScript и XML (Ajax) могут добавить функциональность оповещения в Web-приложения Domino или на интранет-сайт.

Начиная с версии 6.5, IBM Lotus Notes предоставляет интегрированную систему мгновенного обмена сообщениями и оповещения о присутствии в своих приложениях, в том числе, стандартные шаблоны сообщений почты Notes, что дает возможность пользователям добавить аналогичные функциональные возможности в свои собственные приложения. Правда, не плохо бы добавить эти функции в Web-приложения Domino? Мы рассмотрим, как это сделать при помощи Ajax (Asynchronous JavaScript and XML).

В данной статье рассматривается методика, которую можно использовать для просмотра информации о том, кто находится в режиме online в Web-приложении, и о том, как разрешить пользователям взаимодействовать между собой в режиме реального времени. Для наиболее эффективного освоения материала данной статьи необходимо знать IBM Lotus Domino, JavaScript и DHTML. Пример базы данных Awareness.nsf содержит рабочий пример информационного приложения, описанного в данной статье.

ПРИМЕЧАНИЕ: Базовая функциональность информационного приложения состоит из нескольких объектов проектирования. В данной статье рассматриваются самые важные объекты, а некоторые (в основном, вспомогательные объекты, выполняющие, например, задачу сброса состояния) оставлены для самостоятельной работы.

Добавление в приложение списка работающих пользователей

Добавить на любую страницу приложения список работающих в данный момент времени пользователей можно, дописав несколько строк JavaScript-кода туда, где нужно отобразить список контактов. На рисунке 1 показан такой список активных пользователей.


Рисунок 1. Простой пример JavaScript-кода, добавленного на страницы
Рисунок 1. Простой пример JavaScript-кода, добавленного на страницы

Нажатие на картинку или на имя пользователя вызовет появление окна системы мгновенного обмена сообщениями, как показано на рисунке 2.


Рисунок 2. Активизация общения в системе мгновенного обмена сообщениями
Рисунок 2. Активизация общения в системе мгновенного обмена сообщениями

На рисунке 3 показан ответ.


Рисунок 3. Ответ на входящее сообщение
Рисунок 3. Ответ на входящее сообщение


В начало


Как это работает?

Для поддержки списка активных пользователей необходим HTML и JavaScript-код, который нужно выполнять постоянно для каждого вошедшего в систему пользователя. Эта программа-агент для каждого пользователя хранит время последнего доступа. Пользователь считается активным, если прошло не более двух минут с момента его последнего доступа. Поддержка списка активных пользователей в виде (view) облегчает отображение их при помощи простой формулы @DbColumn.

Далее, необходимо иметь возможность обмениваться сообщениями с активными пользователями. Поскольку программа-агент выполняется постоянно для каждого пользователя, этот же агент может также следить за тем, доставляется ли сообщение каждому пользователю. Если да, программа-агент выведет JavaScript-код для открытия всплывающего окна, содержащего сообщение.

Всю работу в данном решении выполняют четыре элемента проекта. Вот они:

  • Сценарий awareness.js
  • Программа-агент refreshUserMsg
  • Программа-агент Refresh_Logged_in_user_list
  • Форма e-msg

Отображение списка активных пользователей на странице: Awareness.js

Эта страница содержит JavaScript-код, отображающий на Web-страницах активных пользователей. Реальный дизайн показан на рисунке 4. Для добавления функции оповещения о присутствии просто включите JavaScript-ссылку в страницу.

ПРИМЕЧАНИЕ: Мы включили небольшой пример в базу данных Awareness. Взгляните на начальную страницу с примером включения.

На рисунке 4, на котором показана копия экрана IBM Lotus Domino Designer со страницей Awareness.js, обратите внимание на первую строку. Эта строка использует метод document.write() для помещения на Web-страницу маленького скрытого фрейма iFrame размером 0*0 пикселей. Содержимым iFrame является программа-агент refreshUserMsg. iFrame, естественно, не предназначен для показа пользователю, а используется для размещения Ajax-вызовов.


Рисунок 4. Страница Awareness.js в Lotus Domino Designer
Рисунок 4. Страница Awareness.js в Lotus Domino Designer

ПРИМЕЧАНИЕ: Элемент <Computed Value> в нижней части страницы выбран для показа кода, отображающего список пользователей с небольшой фотографией перед именем. Это предполагает наличие списка фотографий.

Последняя строка кода ищет активных пользователей, хранящихся в программе-агенте, и использует функцию @Implode для помещения списка вместе с HTML-кодом, необходимым для активизации окна сообщений при нажатии на имя пользователя или его фотографию.

Поддержка списка активных пользователей с использованием программы-агента: refreshUserMsg

Программа-агент refreshUserMsg загружается фреймом iFrame, создаваемым сценарием Awareness.js. Этот агент решает три задачи:

  • Обновляет состояние присутствия пользователей.
  • Проверяет наличие сообщений для передачи и, если они есть, передает их.
  • Устанавливает таймер, перезагружающий программу-агент через некоторый промежуток времени. Это гарантирует проверку программой-агентом наличия новых сообщений. В противном случае доставка сообщений может происходить только при перезагрузке пользователя или при смене страниц в вашем Web-приложении.

В листинге 1 приведен раздел Initialize программы-агента.


Листинг 1. Раздел Initialize программы-агента refreshUserMsg
                
Sub Initialize
	Dim session As New notessession
	Dim doc As notesDocument
	Dim db As NotesDatabase
	Set db = session.CurrentDatabase
	Set doc = session.documentContext
	Print "Content-type:text/html" 
' Format a nice header telling the content type.
	Print ""
	Print |<SCRIPT Language="JavaScript">|
	Print |<!--|
	' Check if user is registered. Set status.
	Call RefreshUser(db, doc)
	' Check for messages.
	Call Check_Messages(db, doc)
	' Check for messages regularly. 
' Specify your polling time here in milliseconds.
	Print |timerID = setTimeout("document.location.reload()",1000);|
	Print |//-->|
	Print |</script>|
End Sub

В первой и второй строке Print устанавливается тип содержимого объекта в Web-браузере. Таким образом, Lotus Domino не вставляет HTML-заголовки по умолчанию, что экономит несколько байтов запроса.

Text/html против text/javascript
Некоторые читатели могут возразить по поводу неприменения типа содержимого text/javascript, но это привело бы к появлению предупреждения в большинстве современных Web-браузеров. Очевидно, наличие JavaScript-кода внутри iFrame не безопасно, а наличие HTML-страницы с JavaScript-кодом - безопасно.

В листинге 2 создается документ для каждого пользователя, впервые обращающегося к системе. После этого код обновляет данный документ при каждом запросе. Пользователь считается активным, если документ состояния пользователя не был изменен в течение двух минут.

Обратите внимание на вызов RefreshUser, который поддерживает список активных пользователей, и на вызов подпрограммы Check_Messages. Программа-агент завершается установкой таймера setTimeout для перезагрузки iFrame по истечении 1000 миллисекунд.


Листинг 2. Подпрограмма RefreshUser
                
Sub RefreshUser(db As NotesDataBase, doc As NotesDocument)
	Dim uDoc As NotesDocument
	Dim view As NotesView
	Set view = db.GetView("Users")
	' Find the users status document.
	Set uDoc = view.GetDocumentByKey(doc.Remote_User(0), True)
	If Not uDoc Is Nothing Then ' Set the users status to logged in.
		uDoc.status = "Online"
	Else ' Create a status document for first timers.
		Set uDoc = db.CreateDocument
		uDoc.Form = "user"
		Dim userName As New NotesName(doc.Remote_User(0))
		uDoc.userCN = userName.Common
		uDoc.user   = userName.Canonical
		uDoc.status = "Online"
	End If
	Call uDoc.Save(True, True)
End Sub

Последняя подпрограмма программы-агента, приведенная в листинге 3, сравнивает имя пользователя во всех формах e-msg, ожидающих доставки. Если соответствие найдено, программа-агент открывает всплывающее окно, содержащее сообщение. Обратите внимание на строку Print, устанавливающую JavaScript-код, который открывает сообщение.


Листинг 3. Подпрограмма Check_Messages
                
Sub Check_Messages(db As NotesDatabase, doc As NotesDocument)
	Dim view As NotesView
	Set view = db.GetView("e-msg (not delivered)") 
' Check for messages.
	Dim mDoc As NotesDocument
	Set mDoc = view.GetDocumentByKey(doc.Remote_User(0), True)
	If Not mDoc Is Nothing Then ' User got messages!
		mDoc.delivered = "1" ' Flag as delivered.
		Call mDoc.Save(False, False)
		' Bring up the pop-up.
		doc.thisDb = Evaluate(|@WebDbName|)
		thisDb = doc.thisDb(0)
		Print |iMsg = window.open('/| + thisDb + 
|/e-msg?openForm&to=| + mDoc.fromEncoded(0) + |&unid=| 
+ mDoc.UniversalID + |', 
'','height=220,width=250,resizable=yes,left=500,top=60');|
	End If
End Sub

Проверка выхода пользователя из системы с использованием программы-агента: Refresh_Logged_in_user_list

Программа-агент refreshUserMsg обновляет документ для каждого пользователя, предоставляя документу новую измененную дату при каждом запросе к агенту. Пока пользователь остается на одной из страниц, которая поддерживает функциональность оповещения (то есть, странице с описанным выше JavaScript-кодом), он имеет пользовательский документ с увеличивающейся меткой времени. При закрытии пользователем браузера или выхода из приложения, увеличение временной метки останавливается. Можно использовать это поведение для уведомления о том, что пользователь не активен, при помощи запланированной программы-агента, проверяющей временную метку и сбрасывающей состояние пользователя, если разница с текущим временем превысила установленный предел.

Мы установили время, когда пользователь начинает считаться не активным, в 2 минуты. Эта программа-агент показана в листинге 4.


Листинг 4. Программа-агент Refresh_Logged_in_user_list
                
SELECT Form = "user" & status != "not logged in" 
& @Adjust(@Now;0;0;0;0;-2;0) > @Modified;
@Do(
@SetField("status" ; "not logged in")
)

Мы могли бы выполнить эту задачу в виде (view), но вы, вероятно, уже знакомы с проблемами, возникающими при нарушении правил кодирования и использовании @Now в виде. Агент планируется для запуска так часто, насколько позволяет Lotus Domino (пятиминутные интервалы), показывая, что некоторые пользователи находятся в активном состоянии по истечении двух минут после их выхода из системы.

Передача и прием сообщений с использованием формы: e-msg

Форма e-msg, показанная на рисунке 5, определяет передаваемые сообщения. Она используется как для начала обмена сообщениями, так для чтения и ответа. Обратите внимание на то, что эта форма всегда открывается командой URL ?OpenForm, даже если она используется для чтения переданного сообщения. Данная команда используется для создания ответа непосредственно из этой же страницы. Уникальный ID документа передается в качестве параметра, и можно легко получить содержимое сообщения при помощи команды @GetDocField.


Рисунок 5. Форма e-msg
The e-msg form

При первом запуске формы ей передается параметр, например, openForm&to=Tomas%20Nielsen. Поле To формы принимает этот параметр и использует его для доставки сообщения нужному пользователю. Во второй раз, если адресат отвечает, передаются два параметра: to и unid. Параметр unid описывает документ, хранящий сообщение, которое должно отображаться; затем параметр извлекает тело сообщения, используя формулу @GetDocField.

Если пользователи используют блокировщики всплывающих окон, то они должны разрешить эти окна для вашего домена. В противном случае они не смогут получать сообщения. Чтобы обойти такие блокировщики, можно использовать DHTML. Если пользователь закроет браузер до доставки предназначенного ему сообщения, оно будет ждать следующего входа пользователя в систему и будет доставлено во время загрузки первой страницы.



В начало


Добавление в сообщения символов, выражающих эмоции

Это, возможно, не самая важная функциональная возможность вашей системы мгновенного обмена сообщениями, но, как известно, пользователи хотят ее иметь. Мы добавили изображение улыбающегося лица (улыбающееся лицо) как общий ресурс под названием happy.gif.

Снова обратимся к рисунку 5. Вы видите поле fromMessage. Это поле содержит следующий код:


Листинг 5. Формула поля fromMessage
                
Tmp := @GetDocField( responseUNID; "message");
@ReplaceSubstring(@If(@IsError(Tmp) ; "" ; Tmp) ; 
@NewLine:":-)" ; "<br />":"<img src=\"/"+@WebDbName 
+ "/happy.gif\">")

Обратите внимание на то, как новые строки преобразуются в символы перевода строки, и как все комбинации :-) заменяются изображением улыбающегося лица. Можно, конечно, расширить эту функциональность и добавить большее количество таких изображений, но мы оставляем эту задачу для вас. Также можно менять специфические слова на более приятные эквиваленты.

Легко увлечься расширением этой функциональности. Например, можно было бы добавить анимированные GIF-видеоролики. Мы даже пробовали внедрить звуковые клипы аплодирующей толпы, передаваемые всем активным пользователям каждый раз, когда мы входили в нашу интранет-сеть. К сожалению, наши коллеги не одобрили это.



В начало


Размышления о производительности

В программе-агенте refreshUserMsg мы установили временной период между запросами к агенту. Использовалось значение 1000 миллисекунд (1 секунда). Это значение подходит для тестирования и для работы небольшого количества пользователей. Мы определили, что для компании среднего размера подходит период времени в 15000 миллисекунд.

Если описанная выше методика используется для других целей, например, для проверки наличия новых почтовых сообщений для пользователя, важно настроить программу-агент таким образом, чтобы ее работа не требовала слишком много процессорного времени и дискового пространства. Вы имеете полный контроль над тем, когда проводить следующий опрос, поэтому можно изменить значения при повышении нагрузки на сервер. Например, вы могли бы увеличивать время между опросами динамически, в зависимости от количества активных пользователей.

Подводя итог рассмотрению проблем производительности, можно отметить, что первые версии наших решений с функциональностью оповещения прекрасно работали на Lotus Domino 5. С тех пор Lotus Domino стал работать значительно быстрее при запуске программ-агентов и обработке HTTP-запросов. Мы имеем все основания сказать, что эта методика в настоящее время хорошо подходит для использования с Lotus Domino.



В начало


Другие улучшения

Чтобы вместить описание этой методики мгновенного обмена сообщениями в формат одной статьи, мы упростили версию, применяемую в нашей компании. Например, наша версия может также сохранять сеансы связи в нашей информационной базе. Другие улучшения, которые можно было бы добавить:

  • Замена всплывающих окон DHTML-слоями, открывающимися в текущем окне. Эта функциональность решила бы также проблемы с блокировщиками всплывающих окон.
  • Список активных пользователей, обновляемый в режиме реального времени. Эту функциональность можно было бы добавить, используя аналогичный DHTML-подход.
  • Можно было бы использовать функциональность системы обмена сообщениями для интенсификации рабочего процесса путем передачи утвержденных заданий в режиме реального времени.
  • Используя программу-агент, постоянно работающую во время пребывания пользователя в режиме online, легко отслеживать время работы пользователей с сиcтемой. На нашем сайте имеется страница со списком пользователей, наиболее долго работающих в сети.
  • Реализация возможности передавать сообщения пользователям, находящимся в режиме offline. При этом пользователь получает сообщение сразу после регистрации в системе.
  • Реализация возможности передавать сообщения сразу всем пользователям. Мы используем функцию под названием Public Question, которая посылает вопрос всем. Заинтересовавшиеся пользователи могут принять участие в сеансе обсуждения данного вопроса.



В начало


Заключение

Ajax добавляет абсолютно новое измерение для Web-сайтов, поскольку он способен проталкивать вам содержимое с сервера. Мы говорим проталкивать, потому что когда вы извлекаете содержимое самостоятельно, этот процесс скрыт от вас.

Одна из причин, по которой нам нравится данный подход, - отсутствие необходимости в элементах управления Microsoft ActiveX, экземпляре Java Virtual Machine (JVM) или проигрывателе flash-анимаций. Это доступное и облегченное решение для большинства клиентов.




В начало


Загрузка

ОписаниеИмяРазмерМетод загрузки
Пример базы данныхAwareness.zip51 KBHTTP
Информация о методах загрузки


Ресурсы

Научиться

Получить продукты и технологии

Обсудить


Об авторе

Томас Нильсен (Tomas Nielsen) - старший инженер-разработчик в Strand Interconnect (publ). В основном он занимается разработкой IBM-порталов для крупных компаний. Томас был одним из основателей Tromb, а в настоящее время работает в Strand Interconnect. Связаться с ним можно по адресу tomas@tuned.se.




Выскажите мнение об этой странице


Пожалуйста, найдите минутку и заполните форму, чтобы повысить уровень сервиса.



ДаНетНе знаю
 


 


12345
 


В начало


IBM обладает всеми авторскими правами касательно информации, расположенной на developerWorks. Использование информации приведенной на этом ресурсе без явного письменного разрешения от IBM или первоначального автора запрещены. Если Вы желаете использовать информацию с developerWorks, пожалуйста воспользуйтесь регистрационной формой для того, чтобы связаться с нами запрос на использование материалов developerWorks Россия.

    IBM в России Конфиденциальность Контакты