|
Прохожу курс "Построение распределенных систем на Java" в третьей лекции где описывается TCPServer вылетает эта ошибка
"Connection cannot be resolved to a type" Java version 1.7.0_05 |
Использование JMS
JMSClient
Класс JMSClient после своего запуска создает соединение с JMS провайдером, создает сессию и MessageProducer,после чего в ответ на каждый ввод пользователя посылает в очередь текстовое сообщение. Работа завершается, если пользователь ввел символ q (или Q ).
1 import javax.jms.ConnectionFactory;
2 import javax.jms.Destination;
3 import javax.jms.Queue;
4 import javax.jms.Topic;
5 import javax.jms.Connection;
6 import javax.jms.Session;
7 import javax.jms.MessageProducer;
8 import javax.jms.TextMessage;
9 import javax.jms.JMSException;
10 import javax.annotation.Resource;
11 import java.io.InputStreamReader;
12 import java.io.IOException;
13 public class JMSClient {
14 @Resource(mappedName = "jms/Example1ConnectionFactory")
15 private static ConnectionFactory connectionFactory;
16 @Resource(mappedName = "jms/Example1Queue")
17 private static Queue queue;
18 public static void main(String[] args) {
19 Connection connection = null;
20 Destination dest = (Destination) queue;
21 try {
22 connection = connectionFactory.createConnection();
23 Session session = connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
24 MessageProducer producer = session.createProducer(dest);
25 TextMessage message = session.createTextMessage();
26 InputStreamReader inputStreamReader = new InputStreamReader(System.in);
27 char c = 'n';
28 int i = 0;
29 while (!((c == 'q') || (c == 'Q'))) {
30 try {
31 c = (char) inputStreamReader.read();
32 message.setText("This is message " + (i + 1));
33 System.out.println("Sending message: " + message.getText());
34 producer.send(message);
35 i++;
36 } catch (IOException e) {
37 System.err.println("I/O exception: " + e.toString());
38 }
39 }
40 } catch (JMSException e) {
41 System.err.println("Exception occurred: " + e.toString());
42 } finally {
43 if (connection != null) {
44 try {
45 connection.close();
46 } catch (JMSException e) {
47 }
48 }
49 }
50 }
51 }
Листинг
13.1.
Класс JMSClient
Программа демонстрирует весь цикл создания типичного JMS приложения. Сначала (строки 14-17) определяются необходимые ресурсы - в данном случае ConnectionFactory и Queue (эти ресурсы с соответствующими именами были ранее созданы).
Затем создаются соединение с JMS -провайдером (строка 22) и сессия (строка 23). Следующим шагом является создание MessageProducer (строка 24) и текстового сообщения (строка 25).
Цикл работы программы (строки 29-39) состоит в ожидании ввода пользователя (строка 31), формировании тела сообщения (строка 32) и его отправки в очередь (строка 34). В конце работы программа закрывает соединение с JMS провайдером (строка 45).
JMSServer
Класс JMSServer служит для обработки сообщений, отправляемых JMSClient. Он синхронным образом считывает сообщения из очереди и печатает их.
1 import javax.jms.ConnectionFactory;
2 import javax.jms.Destination;
3 import javax.jms.Queue;
4
5 import javax.jms.Connection;
6 import javax.jms.Session;
7 import javax.jms.MessageConsumer;
8 import javax.jms.Message;
9 import javax.jms.TextMessage;
10 import javax.jms.JMSException;
11 import javax.annotation.Resource;
12 public class JMSServer {
13 @Resource(mappedName = "jms/Example1ConnectionFactory")
14 private static ConnectionFactory connectionFactory;
15 @Resource(mappedName = "jms/Example1Queue")
16 private static Queue queue;
17 public static void main(String[] args) {
18 String destType = null;
19 Connection connection = null;
20 Session session = null;
21 Destination dest = (Destination) queue;;
22 MessageConsumer consumer = null;
23 TextMessage message = null;
24 try {
25 connection = connectionFactory.createConnection();
26 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
27 consumer = session.createConsumer(dest);
28 connection.start();
29 while (true) {
30 Message m = consumer.receive(1);
31 if (m != null) {
32 if (m instanceof TextMessage) {
33 message = (TextMessage) m;
34 System.out.println(
35 "Reading message: " + message.getText());
36 }
37 }
38 }
39 } catch (JMSException e) {
40 System.err.println("Exception occurred: " + e.toString());
41 } finally {
42 if (connection != null) {
43 try {
44 connection.close();
45 } catch (JMSException e) {
46 }
47 }
48 }
49 }
50 }
Листинг
13.2.
Класс JMSServer
Отличие от предыдущего класса заключается в том, что создается не MessageProducer,а MessageConsumer (строка 27), поскольку мы собираемся не отправлять сообщения, а принимать их. Для того чтобы начать обработку сообщений, необходимо вызвать метод start (строка 28).
Цикл работы программы (строки 29-38) состоит в ожидании прихода нового сообщения (строка 30). В данном случае ожидание продолжается 1 миллисекунду. Если пришедшее сообщение имеет текстовый тип (именно такие сообщения мы ожидаем получить), оно извлекается и печатается тело сообщения.
Компиляция и запуск
Компиляция приложений JMS не имеет особенностей, единственное, что нужно сделать, - указать соответствующие библиотеки в classpath:
javac -classpath . ;activation.jar;appserv-ws.jar;javaee.jar; jsfimpl.jar;appserv-jstl.jar; -d build JMSClient.java javac -classpath . ;activation.jar;appserv-ws.jar;javaee.jar; jsfimpl.jar;appserv-jstl.jar; -d build JMSServer.java
Затем нужно собрать соответствующие пакеты ( jar ):
jar -cvfm server.jar manifest2.mf -C ./build . jar -cvfm client.jar manifest.mf -C ./build .
При этом файлы манифеста имеют следующий вид: manifest.mf (пример. 13.3) и manifest2.mf (пример. 13.4).
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.6.5 Created-By: asw Main-Class: JMSClientЛистинг 13.3. Файл manifest.mf
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.6.5 Created-By: asw Main-Class: JMSServerЛистинг 13.4. Файл manifest2.mf
В результате будут созданы два пакета - server.jar и client.jar.Запуск приложения производится с помощью утилиты appclient, соответственно:
appclient -client client.jar
для клиента (отправителя сообщений) и
appclient -client server.jar
для сервера (обработчика сообщений).
После запуска клиент в ответ на ввод пользователя будет посылать сообщения в очередь, сервер будет их принимать и печатать.
Следует обратить внимание, что сервер и клиент не обязательно должны быть запущены одновременно. Так, клиент, будучи запущенным, может сгенерировать несколько сообщений и закончить работу. Сервер, будучи запущенным позднее, эти сообщения получит, поскольку JMS -провайдер их сохранил.
Ниже приведен пример работы системы.
appclient -client client.jar
Запуск клиента приведет к выводу сообщений об отправке.
Sending message: This is message 1 Sending message: This is message 2 Sending message: This is message 3 Sending message: This is message 4 Sending message: This is message 5 Sending message: This is message 6 Sending message: This is message 7 Sending message: This is message 8 Sending message: This is message 9 Sending message: This is message 10
Запуск сервера:
appclient -client server.jar
приведет к выводу сообщений о приеме.
Reading message: This is message 1 Reading message: This is message 2 Reading message: This is message 3 Reading message: This is message 4 Reading message: This is message 5 Reading message: This is message 6 Reading message: This is message 7 Reading message: This is message 8 Reading message: This is message 9 Reading message: This is message 10