powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вложенная Жава в DB2, возможно?
13 сообщений из 38, страница 2 из 2
Вложенная Жава в DB2, возможно?
    #32702160
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Писать так конечно можно, только есть это большое извращение...
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32702688
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А я писал, java компилятор запускается, но файл которого он запускает ничего не делает, у меня он должен был записать в текстовый файл что то, но он не сделал ничего. Почему?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32702694
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И к тому же разве нельзя сделать как нибудь так:
Один раз запустишь компилятор а потом с изменением файлов он запускает эти файлы, но сам не перезапускается?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32703138
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
???
А в чем проблема сделать приложение, откомпилировать, оттестировать и запустить нормально, а не компилировать из приложения? Изгаляться конечно можно как угодно, но я не помню, чтобы, к примеру на С/Pascal при вызове, чекали исходник, если изменился, запускали компилятор, линковщик а затем через exec(...) получившийся exe-файл.
java.exe - не компилятор, это рантайм. Компилятор - javac
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32703365
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изянки, я имел ввиду что почему то у меня уже откомпилированный класс файл через прогу вызовом java рантайма не работает. Почему?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32704123
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал ClassLoader, возникла такая проблема:
1.Class cl = Class.forName("TestModule", true, loader);
Передает методу loader класс файл.
Это когда и главнаый и файл которого по байтам будут читать находятся в одной папке.
А так писать почему то незя:

Class cl = Class.forName("C:/TestModule", true, loader);
т.е когда файл находится в другой папке он сразу кричит:
FileNotFoundException....
А как сделать чтобы он из любой папки запускал?
И воаще я собраюсь из БД вытаскивать файл, он в байтовом массиве придет, а моя прога не только байтовый массив, даже из другой папки класс файл не может запустить, что за фигня?
есть еще такой момент:
ResultSet rs = stms.executQuery(select classfile from table1);
....допустим
выводит так:
while(rs.next) {
System.out.println(rs.getBytes(1));
}

СТОП!!! А как теперь все это добро которое вышло из таблицы присвоить к какой то перемекной притом массиву байтов?
Как делается такая фигня?
Допустим кто то подскажет как получить файл и пихнуть в байт массив, а прога то прога моя не примет байт массив, он токо класс файлы принимает.
Кто что подскажет?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32704320
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если требуется динамическая загрузка классов, можно взять готовый контейнер, который ее поддерживает и писать для него компоненты-обработчики событий. Что-либо вроде phoenix справится вполне.

1. phoenix - что такое?
2. он работает под OS 390?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32705326
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А так писать почему то незя:

Class cl = Class.forName("C:/TestModule", true, loader);
т.е когда файл находится в другой папке он сразу кричит:
FileNotFoundException....
А как сделать чтобы он из любой папки запускал?

В classpath папку добавить из которой грузить файлы надо.


СТОП!!! А как теперь все это добро которое вышло из таблицы присвоить к какой то перемекной притом массиву байтов?
Как делается такая фигня?

Метод ClassLoader.defineClass( ... );


1. phoenix - что такое?
2. он работает под OS 390?

Контейнер для объектов написанных на java с некоторыми полезными свойствами. Лежит на jakarta.apache.org. Сам не зпускал, но скорее всего работает, раз там java есть
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32705418
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Правильно, я знаю что можно пользоватся этим:
автор
Метод ClassLoader.defineClass( ... );

Уже пользуюсь. Но если для того чтобы понять мою проблему все таки придется выставить весь код, аот он:
Это код ClassLoader - а:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
import java.io.*;
public class DynamicClassOverLoader extends ClassLoader{
  private java.util.Map classesHash = new java.util.HashMap();

  public final String[] classPath;
  public DynamicClassOverLoader(String[] classPath) {
    this.classPath = classPath;
  }
  protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
    Class result = findClass(name);
    if (resolve) resolveClass(result);
    return result;
  }

  protected Class findClass(String name) throws ClassNotFoundException {
    Class result = (Class)classesHash.get(name);
    if (result != null) {
      System.out.println("% Class" + name + "found in cache");
      return result;
    }
    File f = findFile(name.replace('.','/'),".class");
    System.out.println("% Class " + name + (f==null?"":" found in " + f));
    if (f == null) {
      return findSystemClass(name);
    }
    try {
      byte[] classBytes = loadFileAsBytes(f);
      result = defineClass(name, classBytes,  0 , classBytes.length);
    } catch(IOException e){
      throw new ClassNotFoundException("Cannot load class " + name + ": " + e);
    } catch (ClassFormatError e) {
      throw new ClassNotFoundException("Format of class file incorrect for class " + name + ": " + e);
    }
    classesHash.put(name, result);
    return result;
  }
  protected java.net.URL findResource(String name) {
    File f = findFile(name, "");
    if (f == null) return null;
    try {
      return f.toURL();
    } catch(java.net.MalformedURLException e) {
      return null;
    }
  }
  private File findFile(String name, String extension){
    for (int k =  0 ; k < classPath.length; k++) {
      File f = new File((new File(classPath[k])).getPath() + File.separatorChar + name.replace('/',File.separatorChar) + extension);
      if (f.exists()) return f;
    }
    return null;
  }
  public static byte[] loadFileAsBytes(File file) throws IOException {
    byte[] result = new byte[(int)file.length()];
    FileInputStream f = new FileInputStream(file);
    try {
        f.read(result,  0 , result.length);
    } finally {
      try {
        f.close();
      } catch(Exception e) {
      }
    }
    return result;
  }

}
А вот код главного класса который вызывает ClassLoader когда получил какой то класс файл которого нужно запускать, в моем случае это TestModule файл.

Класс Main:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
import java.io.*;
public class Main{
  public static void main(String[] argv) throws Exception {
    for(;;){
      ClassLoader loader = new DynamicClassOverLoader(new String[] {"."});
      TestModule tm = new TestModule();
        Class clazz = Class.forName(tm.toString(), true, loader);
        Object object = clazz.newInstance();
        System.out.println(object);
        new BufferedReader(new InputStreamReader(System.in)).readLine();
    }
  }
}
Если внимательно присмотрется то можно увидеть что прога делает:
1. Main класс вызывает метод loader, ему передает класс файл через forName()
А дальше что он делает? Кто нибудь опишите по коду DynamicClassOverLoader
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32705469
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
надо написать прогу которая реагировала бы на изменение в таблице.
Можно сделать бесконечный цикл который вечно проверяет таблицу. Но мне кажется это не решение. От такого цикла прога может заглючить, захлебнутся. Какаво ваше мнение?
Как можно выйти из такой ситуации?
Есть альтернативный вариант?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32707276
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это несложно. К примеру пусть у тебя каждый обработчик имплементирует общий интерфейс. Например:

Код: plaintext
1.
2.
3.
4.
public interface MessageHandler
{
  void perform(HandlerContext ctx) throws Exception;
}

Поэтому в том месте где ты получил объект просто пишешь, с учетом того что все они имеют метод perform(...):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
.....
  Object o = class.newInstance();
  if (o instanceof MessageHanlder)
  {
     ((MessageHandler)o).perform(...);
  }
....
Идея в общем такая - все довольно просто.

От бесконечного цикла прога конечно не загнется. Можешь job запускать через определенное время который будет это делать. Это все тоже от условий задачи зависит. Как часто нужно это запускать? Это real-time обработка или можно отложить выполнение на некоторое время?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32707716
VortexCorba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это real-time.
автор
public interface MessageHandler
{
void perform(HandlerContext ctx) throws Exception;
}
.....
Object o = class.newInstance();
if (o instanceof MessageHanlder)
{
((MessageHandler)o).perform(...);
}
....

Ивини, но я никогда этими не пользовался, если не трудно суть обясни, в чем заключается такое программирование?
...
Рейтинг: 0 / 0
Вложенная Жава в DB2, возможно?
    #32709055
hgst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо. Вот простой пример ниже с указанными классами.
Идея довольно простая - вызываешь класс Dispatcher с параметром - идентификатор транзакции.
java Dispatcher 101
java Dispatcher 102
Класс читает настройки из текстового файла dispatcher.properties. В нем соответствие каждой транзакции поставлен обработчик.
101=ru.sql.forum.db2.Handler1 - означает что для транзакции 101 будет использован обработчик Handler1.
И т.д. Соответственно если появляется новая транзакция - пишешь для нее класс и прописываешь в этом файле пару - ID<->класс обработчик. Просто каждый обработчик имплементрирует MessageHandler интерфейс - в нем и происходит обработка - просто ты знаешь что у класса есть метод perform который используется для обработки.

HandlerContext - просто позволяет передать какие-то дополнительные параметры в обработчик (если нужно).

По поводу непосредственно проверки что есть данные для обработки. Вы написали:
Обработка будет как сказать обработка сообщении которые падают в концентратор а оттуда другая пога берет и заливает в таблицу, не давно написали прогу которая уже залитые в таблицу сообщения проверяют по конкретным параметрам(используя рег. выр) и заливает в еще другую таблицу.

А в чем сложность из этого приложения нотифицировать диспптчер что появились новые данные для обработки? Это было бы проще всего - не надо сканировать таблицу в Db2. А способов нотификации много - просто посмотреть что лучше всего подойдет. Дальше как обычно вопросы: - эти проги на одной машине будут или на разных? и т.д. Это решаемо

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
// ---------------------------- HandlerContext.java --------------------- 
package ru.sql.forum.db2;

import java.util.HashMap;
import java.util.Map;

public class HandlerContext {
    private Map map = new HashMap();

     /**
     * @param key to set
     * @param value to set
     */ 
    public void setValue(String key, String value) {
        map.put(key, value);
    }

     /**
     * @param key to retrieve
     * @return value from the context
     */ 
    public Object getValue(String key) {
        return map.get(key);
    }

}

// ---------------------------- MessageHandler.java --------------------- 
package ru.sql.forum.db2;

public interface MessageHandler {
    void perform(HandlerContext ctx) throws Exception;
}

//  ---------------------------- Dispatcher.java ------------------------ 
package ru.sql.forum.db2;

import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;

public class Dispatcher
{
    public static void main(String[] args) {
        try {
            if (args.length <  1 )
                throw new Exception("TXID not defined as parameter");
            ResourceBundle bundle = PropertyResourceBundle
                .getBundle("ru.sql.forum.db2.dispatcher");
            Class clazz = Class.forName(bundle.getString(args[ 0 ]));
            Object o = clazz.newInstance();
            if (o instanceof MessageHandler) {
                HandlerContext ctx = new HandlerContext();
                ctx.setValue("TXID", args[ 0 ]);
                ((MessageHandler) o).perform(ctx);
            }
            else
                throw new Exception(
                    "Class should implement MessageHandler interface");
        }
        catch (Exception e) {
            e.printStackTrace(System.out);
        }
    }
}

// ---------------------------- Handler1.java --------------------------- 
package ru.sql.forum.db2;

public class Handler1
    implements MessageHandler
{
    public void perform(HandlerContext ctx) throws Exception {
        System.out.println("Handler1 called for TX {"
            + ctx.getValue("TXID")
            + "}");
    }
}

// ---------------------------- Handler2.java --------------------------- 
package ru.sql.forum.db2;

public class Handler2
    implements MessageHandler
{
    public void perform(HandlerContext ctx) throws Exception {
        System.out.println("Handler2 called for TX {"
            + ctx.getValue("TXID")
            + "}");
    }
}

# ---------------------------- dispatcher.properties -------------------- 
# Put this file in the same directory where Dispatcher.class file is
 101 =ru.sql.forum.db2.Handler1
 102 =ru.sql.forum.db2.Handler2

 ------------------------------------------------------------------------ 
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вложенная Жава в DB2, возможно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]