Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Попытка работы с JMS


Автор: javastic 12.9.2012, 17:11
/
Код

*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jmsclient;

import java.io.IOException;
import java.io.InputStreamReader;
import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;


public class JMSClient {

    @Resource(mappedName = "jms/ConnectionFactory")
    private static ConnectionFactory connectionFactory;
    @Resource(mappedName = "jms/Queue")
    private static Queue queue;

    public static void main(String[] args) {
        Connection connection = null;

        Destination destination = (Destination) queue;

        try {
            connection = connectionFactory.createConnection();
            
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            
            MessageProducer producer = session.createProducer(destination);
            
            TextMessage message = session.createTextMessage();
            
            InputStreamReader inputStreamReader = new InputStreamReader(System.in);
            
            char c = 'n';
            int i = 0;
            
            while (!((c == 'q') || (c == 'Q'))) {
                try {
                    c = (char)inputStreamReader.read();
                    message.setText("This is message: "+(i+1));
                    System.out.println("Sending message: " + message.getText());
                    producer.send(message);    
                    i++;
                } catch (IOException e) {
                    System.err.println("I/O exception: " + e.toString());
                }
            }
            
        } catch (JMSException e) {
            System.err.println("Exception occurred: " + e.toString());
        } finally {
            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                }
            }
        }
    }
}



Вываливается с ошибкой: 
Код

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file javax/jms/JMSException
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2442)
    at java.lang.Class.getMethod0(Class.java:2685)
    at java.lang.Class.getMethod(Class.java:1620)
    at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:492)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:484)
Exception in thread "main" Java Result: 1


Весь инет изрыл, ну никаких решений толковых нет. Кто сталкивался?

Netbeans 7.2, Java 1.7, Glassfish 3.1.2  JMS Factory прописан нормально.

Автор: AntonSaburov 12.9.2012, 21:40
Привет.Давно не виделись smile
Посмотри вот эти две темки - там похоже то, что ищешь

http://stackoverflow.com/questions/6335024/what-dependencies-do-i-need-for-embedded-activemq-broker
Здесь похоже важно вот это: moved the javaee dependency to the end of the class path.

http://stackoverflow.com/questions/8218629/active-mq-helloworld-example-exception

Автор: javastic 13.9.2012, 14:22
Приветствую! Давно правда не виделись! smile

Спасибо! Это и множество других примеров видел. Не помогло. Очень я опечален, то, что приходится с бубном прыгать как в случае с мелкософтом. В общем полный Absent. :-(

Автор: jk1 14.9.2012, 08:31
Похоже на Jar Hell. 
Я так понимаю, что у Glassfish реализация JMS на борту есть. Приложение не подтягивает случаем еще и свою? Например activemq-all.jar

Автор: javastic 14.9.2012, 16:05
Нет не подтягивает.
Скачал отдельно библиотеку javax.jms.1.1.jar подключил, теперь ошибка такая: 

Код

Exception in thread "main" java.lang.NullPointerException
    at jmsclient.JMSClient.main(JMSClient.java:33)
Java Result: 1


рубится на этой строке:
Код

connection = connectionFactory.createConnection();


Если делать web application куда прописываются библиотеки от Гласфиша, то всё Ок. Работает.

Автор: javastic 17.9.2012, 16:46
Разобрался. Короче:

1. проект в NetBeans надо создавать как EE (тогда автоматом цепляются библиотеки сервера приложений в данном случае у меня Glassfish)
http://s2.ipicture.ru/
2. надо создать ресурс для подключения к Glassfish где указать какое соединение будет (для класса connectionFactory)
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
  <connector-resource enabled="true" jndi-name="jms/myQueue" object-type="user" pool-name="jms/myQueue">
    <description/>
  </connector-resource>
  <connector-connection-pool associate-with-thread="false" connection-creation-retry-attempts="0" connection-creation-retry-interval-in-seconds="10" connection-definition-name="javax.jms.ConnectionFactory" connection-leak-reclaim="false" connection-leak-timeout-in-seconds="0" fail-all-connections="false" idle-timeout-in-seconds="300" is-connection-validation-required="false" lazy-connection-association="false" lazy-connection-enlistment="false" match-connections="true" max-connection-usage-count="0" max-pool-size="32" max-wait-time-in-millis="60000" name="jms/myQueue" ping="false" pool-resize-quantity="2" pooling="true" resource-adapter-name="jmsra" steady-pool-size="8" validate-atmost-once-period-in-seconds="0"/>
</resources>

3. далее запускаем код приведенный выше и наслаждаемся.

Вы спросите зачем это все надо было? Отвечу, хотелось выполнить задачу благодаря которой в консоле крутится приложение и формирует некий лог который транслируется в очередь. Далее через веб приложение можно было бы этот лог читать как список и управлять консолным приложением по типу "Стоп", "Старт" и т.д.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)