Fila no WebSphere

Boa Tarde pessoal,

pesquisei no google e não achei nenhum Tutorial completo de como eu poderia estar criando uma fila no WebSphere 6 em diante.

Alguem poderia me ajudar ou me fornecer algum link?
Obs : ( já vi vários link que “roda e roda” fala sobre teoria mais nenhum ensina como CRIAR a fila.)

Tenho um Ejb de sessão com estado que envia a mensagem

@Stateful
public class PedidoBean implements PedidoBeanLocal {

	@Resource(name="jms/QueueConnectionFavtory")
	private ConnectionFactory fabricaConexao;
	
	@Resource(name="jms/filaPedido")
	private Destination filaPedido;
	
	
	public PedidoBean() {
        
    }

    public void criarPedido(){
    	// Mock para criar Pedido
    	Pedido pedido = new Pedido();
    	for (int i = 0; i < 10 ; i++){
    		pedido.setNumeroPedido(pedido.getNumeroPedido() + i +50);
    		pedido.getCodigosProdutos().add(i);
    	}
    	pedido.setValorTotal(pedido.getCodigosProdutos() + "1000");
    	this.enviarPedido(pedido);
    }
    
    public void enviarPedido(Pedido pedido){
    	try {
			Connection conexao = fabricaConexao.createConnection();
			Session session = conexao.createSession(false,Session.AUTO_ACKNOWLEDGE);
			MessageProducer produtorMensagem = session.createProducer(filaPedido);
			ObjectMessage mensagem = session.createObjectMessage();
			mensagem.setObject(pedido);
			produtorMensagem.send(mensagem);
			produtorMensagem.close();
			session.close();
			conexao.close();
    	} catch (JMSException e) {
			e.printStackTrace();
		}
    	
    }
}

e tenho o EJB MDB

que escuta esta mensagem na fila

@MessageDriven(activationConfig = {@ActivationConfigProperty(propertyName="destinationName" ,
															 propertyValue="jms/filaPedido")} )
public class ProcessaPedido implements MessageListener{


	public void onMessage(Message message) {
		ObjectMessage objetoMensagem = (ObjectMessage) message;
		try {
			Pedido pedido = (Pedido) objetoMensagem.getObject();
			System.out.println("=====================================");
			System.out.println("=============Pedido Entregue=========");
			System.out.println("Número do Pedido "+pedido.getNumeroPedido());
			System.out.println("Valor total do Pedido "+pedido.getValorTotal());
			System.out.println("=====================================");
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}

}

O que eu não estou conseguindo mesmo seria configurar (“Criar”) a fila
Tentei algo como …

Recursos -> JMS -> Filas -> Novo

Porem só preenchi os campos obrigatório, assim muitos ficou em branco pois não sei para que server

Campos preenchidos

Nome = filaPedido
Nome JNDI = jms/filaPedido
Nome da Fila Base = filaPedidoJMS

Uma pergunta qual a diferença entre Nome e Nome da Fila Base.

Teria mais alguma coisa para fazer?pois assim não funciona

Grato

Olá Erick,

você precisa criar os recursos JEE da ConnectionFactory e do Queue que você precisa
utilizando a interface administrativa do servidor de aplicações:

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftmj_adm27.html

Não tenho certeza sobre o MQ Provider que você está utilizando,
mas se for o IBM MQ Series, tem que instalá-lo antes de configurar as filas no WebSphere:

http://publib.boulder.ibm.com/infocenter/wbihelp/v6rxmx/index.jsp?topic=%2Fcom.ibm.wbia_general.doc%2Fdoc%2Fimplementation_was%2Fwbiawas47.htm

Bom trabalho.

At

Olá,

Acontece algum erro (procure se tem algum escondidinho no log!) ou o message-driven bean simplesmente não é disparado?
O EJB que insere na fila executa tudo com sucesso?

O problema meu é com o WebSphere eu não estou sabendo configurar a fila corretamente e pelo que o ozielneto falou, o que eu configurei no Servidor é apenas a ponta do iceberg.

Aproveitando…
Perguntas…

Eu tenho que instalar um Provedor JMS? Tinha uma ideia que no WS já tivesse embutido o provedor MQ que implementa JMS e desta forma teria que apenas configurar as Filas ou Topico no mesmo…

Qual seria a função especifica do MQ Provider e WebSphere neste contexto de envio de mensagem (JMS)
MQ Provider implementa JMS e WS cria as fila!!! mesmo assim está um pouco confuso.

Bom amanha vou ler os links e tentar implementar,

Depois posto aqui. no final vou fazer um tutorial … pois não achei nenhum bom , principalmente em português…

O Provedor JMS é a implementação da mensageria (filas). Na configuração você define as filas, associa a um nome JNDI, etc. O servidor de aplicação então integra-se a um Provedor JMS que é quem efetivamente implementa todo o mecanismo de funcionamento das filas.

Por exemplo, tem o provider padrão que vem com o websphere (não sei o nome dele…), que oferece a funcionalidade básica para utilizar o JMS.
A IBM também tem o MQSeries, que é um produto à parte; é um gerenciador de filas mais completo, que tem funcionalidades como: filas persistentes, canais para envio de mensagens a outros servidores, API para integração com diversas linguagens, etc…

De resto, ficamos no aguardo dos seus testes, e parabéns pela iniciativa do tutorial

Primeiramente agradecendo o ozielneto e gomesrod pelo ajuda, pois é difícil achar conhecimento sobre este contexto…

Bom criei o caminho da fila pelo link que o ozielneto passou
http://publib.boulder.ibm.com/infocenter/wasinfo/v...fo%2Fexp%2Fae%2Ftmj_adm27.html

depois instalei o provedor WebSphere MQ v5…
No Queue Managers criei um gerenciado de fila

Passos:
Botão direito - > New -> Queue Manage. abriu uma janela com as seguintes opções

-> Queue Manage : coloquei o nome de gerenciadoFilaPedido
-> Def. Transmission Queue : não sei para que serve e deixei em branco
-> Dead Letter Queue : não sei para que serve e deixei em branco
-> Max Handle Limit : deixei o defaul 256
-> Trigger Interval : deixei o defaul 999999999
-> Max Uncommitted Msgs : dexei o defaul 1000

depois next e aparaceu dois checkBox

-> Star Queue Manager (marquei)
-> Create Server Connection Channel to allow remote administration of the queue manager over TCP/IP (Obs… para que serve está opção?)

next

-> porta defaul 1414

Em fim finalizei e iniciou o gerenciador de fila

agora o que eu estou com dificuldade e de achar material de como integrar o WebSphere MQ como o WebSphere App Server, pelo que intendi isto e feito via JCA?

Passos que eu segui para criar a fabrica de conexão da fila, pior que não tem a opção de “Testar” igual uma conexão com o banco… então “Ainda” não sei se está certo está configuração

Recursos -> JMS -> Connection factories da fila -> Novo

Aqui eu vou citar as principais propriedades…

*Nome = filaPedido
*Nome JNDI = jms/QueueConnectionFactory
Gerenciador de Filas = coloquei o mesmo nome que dei quando criei ao gerenciador de fila no WebSphere MQ como expliquei acima ou seja gerenciadoFilaPedido… Objs: seria isto mesmo?
Host = este host é o endereço do WebSphere MQ ? no meu caso deixei localhost
Porta = 1414 é a porta TCPIP criada no WS MQ certo?
Canal = não sei para que serve …
Endereço de Servidor Local = seria o endereço do MQ?

Depois disso salvei a fabrica de conexão…

Com as dúvidas acima ainda não consegui fazer funcionar as coisas … se alguem puder responder…

Mais em fim, resumidamente foi citar o que é necessário no WebSphere para enviar mensagem usando JMS… se eu estiver errado ou estiver mais algum detalhe me corrija por favor.

1º - Criar a Fila no WebSphere MQ.
2º - Criar a conexao (ConnectionFactory) com a fila do WebSphere MQ no WebSphere App Server
3º-) Mapear a Fila do WebSphere MQ na opção FILA do WebSphere App Server que seria o Destination

Oi,

Já trabalhei bastante com MQ*, mas infelizmente nunca integrado ao Websphere. Na ocasião eram aplicações stand-alone que se conectavam através de API.

  • Inclusive este está virando um tópico bem saudosista, pois foi no tempo que eu era analista de suporte… há muito tempo não ouvia expressões como “Porta 1414”… hehe

Bom, voltando ao assunto, vou tentar responder suas dúvidas na medida do possível, mas infelizmente como já disse nessa parte específica da integração com websphere não tenho experiência e não poderei dar um direcionamento melhor sobre o que está errado ou faltando.

Transmission Queue e Dead Letter Queue são usados quando se trabalha com troca de mensagens entre servidores MQ. (transmission queue = fila onde mensagens aguardam para ser enviadas por um canal, dead letter = fila para onde vão mensagens recebidas com inconsistencia). Acho que por enquanto não precisa mesmo se preocupar com isso.
Server Connection Channel é um canal para clients administrativos; quer dizer, programas que utilizam API de administração remota do MQ (verifica status, starta canais, essas coisas)

Aparentemente está ok, só uma observação nesses campos:

  • Host e Endereço de Servidor Local -> Nao sei qual a diferença entre eles!
  • Canal -> Será necessário criar um CLIENT CHANNEL no MQSeries. Depois de definir este canal, coloque o nome dele aqui.

Outra coisa, como você está fazendo o teste?
Tente eliminar o MessageBean por enquanto, deixe só o EJB que escreve na fila. Acompanhe o resultado pelo log do websphere e veja diretamente na console do MQ se fica mensagem na fila depois que ele executar.

[QUOTE]

Server Connection Channel é um canal para clients administrativos; quer dizer, programas que utilizam API de administração remota do MQ (verifica status, starta canais, essas coisas)
[/QUOTE]

Exemplo de programas que usa Channel? seria o WS app ?

[QUOTE]
Canal -> Será necessário criar um CLIENT CHANNEL no MQSeries. Depois de definir este canal, coloque o nome dele aqui.
[/QUOTE]

Sabe como criar este Canal? não achei nada na net em especifico…

Na opção 2 que eu citei “Criar a conexao (ConnectionFactory) com a fila do WebSphere MQ no WebSphere App Server” acho que é este ponto que fazemos a integração entre MQ e App Server né? alguem poderia confirmar…

Outro detalhe, estou usando uma versão do WS 6.1 que não aceita EJB 3 então já viu o transtorno!!, meu sofrimento dobrou rsrs pois estou tentando implementar com EJB2.1 , ou seja não estou usando mais o código do EJB3 acima.
Fiz um bean de sessão para chamar via JNDI a fabrica de conexao e o destinatário (estou com alguns problemas aqui). …
Depois vou postar aqui… as novas soluções e os novos problemas

Grato

Um exemplo de programa que utiliza o Server Connection Channel é a própria console de administração do MQ (obs: só tem a console gráfica no MQ server para Windows). Se mandar conectar em um Queue Manager remoto, esse QM precisa ter o Server Connection Channel.
Fora isso, é possível escrever suas próprias aplicações que enviam comandos administrativos usando a API que vem com o mq.

E sobre a criação do canal: No Windows dá para criar pela interface gráfica, navegando no Queue Manager tem os Channels. Lá se pode mandar criar um novo canal, escolhendo o tipo Client Channel. (Não lembro exatamente os passos e os nomes certinhos dos itens, mas é razoavelmente intuitivo)
Já no Linux será necessário entrar no RUNMQSC (administração por linha de comando) e dar um comando DEFINE CHANNEL, que é claro que eu também não lembro a sintaxe… :frowning:

É isso… vamos aguardar os próximos capítulos :slight_smile:

Bom pessoal, como havia dito vou postar o EJB (2.1) de sessão que envia mensagem (JMS)


public class EnvioMensagemBean implements SessionBean {


	public void enviarPedido(Pedido pedido){
		try {
			Context contexto = new InitialContext();
			QueueConnectionFactory fabricaConexaoFila = (QueueConnectionFactory) contexto.lookup ("jms/QueueConnectionFactory" );
			QueueConnection conexaoFila = fabricaConexaoFila.createQueueConnection();
			Queue filaPedido = (Queue) contexto.lookup ("jms/filaPedido");
			QueueSession sessaoConexaoFila = conexaoFila.createQueueSession (false ,Session.AUTO_ACKNOWLEDGE ) ;
			QueueSender transporteFila = sessaoConexaoFila.createSender(filaPedido); // Erro nesta linha
			ObjectMessage mensagem = sessaoConexaoFila.createObjectMessage();
			mensagem.setObject(pedido); 
			transporteFila.send(mensagem);
			transporteFila.close();
			conexaoFila.close();
		} catch (NamingException e) {
			e.printStackTrace();
		} catch (JMSException e) {
			e.printStackTrace();
		}
	}
	
	public void ejbActivate() throws EJBException, RemoteException {
		System.out.println("Bean ativado");
		
	}

	public void ejbPassivate() throws EJBException, RemoteException {
		System.out.println("Bean desativado");
		
	}

	public void ejbRemove() throws EJBException, RemoteException {
		System.out.println("Bean removido");
		
	}

	public void setSessionContext(SessionContext arg0) throws EJBException,
			RemoteException {
	}

}

exatamente nesta linha - > QueueSender transporteFila = sessaoConexaoFila.createSender(filaPedido);

é gerada a seguinte exceção


[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R javax.jms.InvalidDestinationException: MQJMS2008: falha ao abrir a fila MQ GererenciadorFilaPedido
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.mq.jms.MQQueueServices.getQueueOpenException(MQQueueServices.java:391)
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.mq.jms.MQQueueServices.getOutputQueue(MQQueueServices.java:334)
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.mq.jms.JMSServicesMgr.getOutputQueue(JMSServicesMgr.java:138)
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.mq.jms.MQSession.createQSender(MQSession.java:6310)
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.mq.jms.MQQueueSession.createSender(MQQueueSession.java:236)
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.ejs.jms.JMSQueueSenderHandle.<init>(JMSQueueSenderHandle.java:98)
[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R 	at com.ibm.ejs.jms.JMSQueueSessionHandle.createSender(JMSQueueSessionHandle.java:232)
......

Ou seja ainda não consegui configurar corretamente as Filas… se alguem puder ajudar…

[QUOTE]
gomesrod
[/QUOTE]
é no windows mesmo, ;D
obrigado

Bom pessoal já detalhei alguns passos acima, porem vamos dar um review do que eu fiz até agora, pois o erro permanece…

Passos :

1º - Criar a Gerenciador/Fila no WebSphere MQ.
2º - Criar a conexao (ConnectionFactory) com a fila do WebSphere MQ no WebSphere App Server
3º-) Mapear a Fila do WebSphere MQ na opção FILA do WebSphere App Server que seria o Destination

Passo 1:

no WebSphere MQ V5, realizei os seguintes passos…

Botão direito - > New -> Queue Manage. abriu uma janela com as seguintes opções

-> Queue Manage : coloquei o nome de GerenciadorFilaPedidos
-> Def. Transmission Queue : …
-> Dead Letter Queue : …
-> Max Handle Limit : deixei o defaul 256
-> Trigger Interval : deixei o defaul 999999999
-> Max Uncommitted Msgs : dexei o defaul 1000

depois next e aparaceu dois checkBox

-> Star Queue Manager (MARQUEI)
-> Create Server Connection Channel to allow remote administration of the queue manager over TCP/IP (MARQUEI, Obs… para que serve está opção?)

next

-> porta defaul 1414

após finalizado, no MQ SERVICES ele criou a seguinte estrutura

================================================================
Raiz do console
-Web Sphere MQ Services (Local)
– GerenciadorFilaPedidos
— Custom Service
— Queue Manager — Running
— Command Server — Running
— Channel Initiator — Running
— Listerner ------------ Running

================================================================

Perguntas…
Aqui eu criei um GERENCIADOR de filas é isto mesmo? Como eu crio a Fila em si?
Mesmo com este Channel Initiator eu preciso criar outro Canal? pois criei outro canal porem não consigo inicializar ele gera o erro AMQ 4128… mesmo dando um stop no Channel Initiator.
Como eu verifico o nome do canal? no caso o Channel Initiator?

Passo 2 -

Recursos -> JMS -> Connection factories da fila -> Novo

Aqui eu vou citar as principais propriedades…

*Nome = fabricaConexãoFila
*Nome JNDI = jms/QueueConnectionFactory
Gerenciador de Filas = GerenciadorFilaPedidos
Host = localhost
Porta = 1414?
Canal = ??
Endereço de Servidor Local = ???
Tipo Transporte : Cliente

Perguntas…

o Gerenciador de Filas é o mesmo criado no WS MQ correto?
o Host está certo?
a Porta está certo?
Canal é o definido no MQ? pois o canal padrão do MQ não tem um nome então o que colocar aqui?
Endereço de Servidor Local seria tambem localhost?

Passo 3 -

Criar o destino da fila, como base no link

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Ftmj_adm27.html

*Nome = filaPedido
*Nome JNDI = jms/filaPedido
Nome da Fila Base = GerenciadorFilaPedidos
Nome do Gerenciador de Filas Base = GerenciadorFilaPedidos
Cliente de Destino = MQ
Host do Gerenciador de Filas = localhost
Porta do Gerenciador de Filas = 1414
Nome do Canal da Conexão do Servidor

Perguntas …

Em relação ao Nome da Fila Base no link ele fala que esta propriedade é a fila definida no gerenciador de filas do MQ, porem eu não consegui criar a fila em si no MQ apenas criei o “Gerenciador”… ou é a mesma coisa?
Nome do Gerenciador de Filas Base está certo?
Cliente de Destino - MQ ou JMS, qual a diferença?, no caso eu deixei MQ porque meu código JMS vai enviar uma fila para o MQ,correto?
Host do Gerenciador de Filas = certo?
Porta do Gerenciador de Filas = certo?
Nome do Canal da Conexão do Servidor = ?? qual a diferença entre está propriedade e a propriedade canal da fabrica de conexão Fila

Em fim pessoal acredito que essas configurações não esteja certas, por isto na linha

QueueSender transporteFila = sessaoConexaoFila.createSender(filaPedido); 

é gerada a exceção

[15/02/12 09:36:58:068 BRST] 0000001e SystemErr     R javax.jms.InvalidDestinationException: M
QJMS2008: falha ao abrir a fila MQ GerenciadorFilaPedidos

Alguem ?

Grato

Pessoal, depois de muito trabalho , e varias exceções consegui fazer meu EJB(Ejb 2.1) de sessão sem estado enviar uma mensagem para o Web Sphere MQ.

o problema estava na configuração do MQ, depois posto aqui os detalhes…

agora vou fazer o MDB para pegar esta mensagem que está na Fila…

Já estou conseguindo “ouvir” pelo método onMessage

só não estou conseguindo recuperar os valores do pedido,

Me parece que o EJB2.1 não trabalhar como objeto neste caso… ou seja não consigo fazer

ObjectMessage objetoMensagem = (ObjectMessage) message;

esta informação prossegue?

Em fim conseguir fazer o envio e recebimento de mensagem implentando JMS com EJB 2 com produtos da IBM …

– Bom foram dias de muitas leituras, documentações oficiais , javaranch e muitos testes… aqui no guj como podem ver pouca ajuda com exceção do gomesrod

Existe pouca documentação em português, e até mesmo em inglês , não achei nenhum tutorial que fala sobre o cotexto todo sobre este assunto, existe documentações individualista que fala só de JMS outra só de WS MQ outra de WS App Server,desta forma tive que assimilar parte por parte e depois de muitos testes conseguir implementar…,para mim foi bom, pois aprendi bastante, porem para quem precisa fazer/aprender isto rápido eu vou fazer um tutorial e deixar um link aqui…

A dificuldade maior foi nas integrações, não achei nada na Web que dizia…

1º - Criar a Gerenciador no WebSphere MQ em seguida criar a Fila no mesmo.
2º - Criar a conexao (ConnectionFactory) com a fila do WebSphere MQ no WebSphere App Server
3º-) Mapear a Fila do WebSphere MQ na opção FILA do WebSphere App Server que seria o Destination
4º-) Criar um “ouvinte” para o MDB no WebSphere App Server que será responsável por ler as mensagens na Fila

Isto já adianta muito o lado de qualquer desenvolvedor…

Tem como deixar um tutorial aqui nos artigos do guj?

Até pessoal…

Legal!

Nesse link explicam como escrever o artigo para o GUJ: http://www.guj.com.br/java/40119-escreva-artigos-para-o-guj---leia-aqui-como

Pessoal, segue o tutorial prometido…

http://www.cipedya.com/doc/178141

descartei a possibilidade de realizar o artigo no guj por enquanto, pelo fato do documento conter uma quantidade significativa de imagem…