Criei essa classe para enviar uma mensagem para o broker usando glassfish quando rodo ela no eclipse, ou faço um jar , ela funciona mais quando coloco em outra maquina ele não consegue se conectar.
Se alguém poder ajudar será muito bom vindo, estou a 2 dias tentando reolvar isso.
Abs.
package emissor;
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
public class EnviaNovoPedido {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
// props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.0.187");
// props.setProperty(InitialContext.PROVIDER_URL, "192.168.0.187");
// props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
System.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.0.187");
System.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext initialContext = new InitialContext(props);
System.out.println("antes de conectar");
ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup("jms/k19factory");
System.out.println("depois de conectar");
Queue queue = (Queue) initialContext.lookup("jms/pedidos");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
TextMessage message = session.createTextMessage();
message.setText(" Mensagem enviada com sucesso " );
messageProducer.send(message);
messageProducer.close();
session.close();
connection.close();
System.out.println("Fim");
System.exit(0);
}
}
“Ela não consegue se conectar” provavelmente signifique que “Há um erro na conexão”. Esse erro é importante para sabermos o que ocorre.
Pode nos mostrar qual é este erro?
Não da erro quando executo localhost ele gera essas informações no console
30/07/2012 2:11:36 PM com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient
INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default.
antes de conectar
30/07/2012 2:11:39 PM org.hibernate.validator.util.Version <clinit>
INFO: Hibernate Validator 4.2.0.Final
30/07/2012 2:11:39 PM com.sun.messaging.jms.ra.ResourceAdapter start
INFO: MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter: Version: 4.5.2 (Build 2-d) Compile: Thu Dec 8 17:30:48 PST 2011
30/07/2012 2:11:39 PM com.sun.messaging.jms.ra.ResourceAdapter start
INFO: MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter starting: broker is REMOTE, connection mode is TCP
30/07/2012 2:11:39 PM com.sun.messaging.jms.ra.ResourceAdapter start
INFO: MQJMSRA_RA1101: GlassFish MQ JMS Resource Adapter Started:REMOTE
depois de conectar
Fim
quando tento em um glassfish em outra máquina nao aparece as outras INFO so essas linha
antes de conectar
30/07/2012 2:12:50 PM com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient
INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default.
Exceptions são amigas.
Elas não são criadas apenas para deixar o código mais bonito/mais feio.
Servem para nos dizer que algo está errado.
Isso
public static void main(String[] args) throws Exception {
Não é uma boa prática, desde que o método main é o primeiro a ser chamado, logo, ele deve tratar a exceção. Ou seja, aqui você está lançando a exception e toda informação da mesma para quem?
Envolva o código num try/catch (vários catch, um para cada possível tipo de exception a ser lançada).
Aí você terá o que precisa.
Deixei assim mais ainda nao da exception acho que é porque nao tem configuração de time-out da conection.
package emissor;
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class EnviaNovoPedido {
public static void main(String[] args) {
//7676
try {
Properties props = new Properties();
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");
props.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.0.187");
// props.setProperty(InitialContext.PROVIDER_URL, "192.168.0.187");
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
System.setProperty("org.omg.CORBA.ORBInitialHost", "192.168.0.187");
System.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
InitialContext initialContext = new InitialContext(props);
System.out.println("antes de conectar");
ConnectionFactory connectionFactory = (ConnectionFactory) initialContext.lookup("jms/k19factory");
System.out.println("depois de conectar");
Queue queue = (Queue) initialContext.lookup("jms/pedidos");
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
TextMessage message = session.createTextMessage();
message.setText(" Mensagem enviada com sucesso " );
messageProducer.send(message);
messageProducer.close();
session.close();
connection.close();
System.out.println("Fim");
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Dei um telnet gerou isso acho que nao existe problemas de firewall, acho que é algumar configuração do glassfish.
flavop@PrFlavio:~$ telnet 192.168.0.187 3700
Trying 192.168.0.187…
Connected to 192.168.0.187.
Escape character is ‘^]’.
Dependendo do seu servidor glassfish, talvez precise inserir user/password
Mas são muitas poucas informações que você passou que pode ajudar a solucionar o problema.
Outra ajuda seria fazer um Remote Debugging no seu jar na outra máquina, assim você poderia ver o que
realmente está acontecendo quando é executado o seu programa, e ver se está sendo injetado o initialContext.
Ademais, tente por teste, utilizar as classes do pacote naming em vez do de CORBA.
Estou usando o glassfish 3.1
Sobre essas configurações onde configuro isso no servidor ?
java.naming.security.principal=username
java.naming.security.credentials=password
Quai informações eu devo colocar ?
Essas informações abaixo você insere no properties que será passado ao seu InitialContext.
java.naming.factory.initial = YOUR_PROVIDER
java.naming.provider.url = tcp://IP : PORT
java.naming.security.principal=username
java.naming.security.credentials=password
Depois que você colocou o try tem retornado NullPointerException no seu InitialContext ?
Deixei assim mas ele ainda está se conectando no localhost, nao coloquei a senha porque não configurei ela no painel do glassfish.
Properties properties = new Properties();
properties.put(“java.naming.provider.url”, “tcp://192.168.0.187:3700”);
properties.put(“java.naming.factory.initial”, “com.sun.enterprise.naming.SerialInitContextFactory”);
ConnectionFactory connectionFactory = null;
Connection connection = null;
//Get the JNDI Context
try {
Context jndiContext = new InitialContext(properties);
alguma solução para este problema? como resolveram? estou passando pelo mesmo problema.
local funciona, remoto não;
Tem uma citação aqui muito boa.
https://www.java.net/node/847316