我编写了一个基本的消息转换器,将对象消息转换为文本消息。我不是Java/OpenMQ/Glassfish专家
变压器编译得很好,但是现在我需要配置STOMP桥来使用它.我在网上找不到关于怎么做的任何例子。
我将我的C:\glassfish3\glassfish\domains\domain1\lib\ext和所有必需的jars复制到: C:\glassfish3\glassfish\domains\domain1\lib\applibs (不确定这是否是正确的位置)。
我在config.properties中添加了以下内容:
imq.bridge.admin.user=admin
imq.bridge.stomp.messageTransformer=StompTransformer
imq.bridge.admin.password=admin
imq.bridge.activelist=stomp
imq.bridge.enabled=true我试着阅读文档:配置JMS的https://docs.oracle.com/cd/E19587-01/821-0027/gjdnl/index.html >>>
,但这让我感到困惑:(我不知道XML文件中应该包含什么,应该调用什么,我应该把它放在哪里,配置还需要什么……
这里是转换器的代码:
import java.util.*;
import javax.jms.*;
import com.sun.messaging.bridge.service.MessageTransformer;
import com.thoughtworks.xstream.XStream;
public class StompTransformer extends MessageTransformer <Message, Message> {
public Message transform(Message message,
boolean readOnly,
String charsetName,
String source,
String target,
Properties properties)
throws Exception {
Message m = message;
if (source.equals(SUN_MQ)) { //from Java Message Queue to STOMP client
if (message instanceof ObjectMessage) {
//create a new TextMessage for message to be transformed to
TextMessage tm = (TextMessage)createJMSMessage(JMSMessageType.TEXTMESSAGE);
//convert message to the TextMessage
XStream xstream = new XStream();
tm.setText(xstream.toXML(message));
m = tm;
}
}
return m;
}
}发布于 2014-12-10 06:43:34
使用OpenMQ 4.5.2 (运行独立运行,而不是嵌入到GlassFish中),我用这个项目测试了消息转换
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.habarisoft</groupId>
<artifactId>OpenMQMessageTransformer</artifactId>
<version>1.1-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.glassfish.mq</groupId>
<artifactId>imq</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.mq</groupId>
<artifactId>jms</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.mq</groupId>
<artifactId>imqjmsbridge</artifactId>
<version>4.5.2</version>
<type>jar</type>
</dependency>
</dependencies>
</project>这个变压器类:
package com.habarisoft.mqtr;
import java.util.*;
import javax.jms.*;
import com.sun.messaging.bridge.service.MessageTransformer;
public class StompTransformer extends MessageTransformer<Message, Message> {
@Override
public Message transform(Message message,
boolean readOnly,
String charsetName,
String source,
String target,
Properties properties)
throws Exception {
System.out.println("transform ...");
Message m = message;
if (source.equals(SUN_MQ)) { //from Java Message Queue to STOMP client
if (message instanceof ObjectMessage) {
//create a new TextMessage for message to be transformed to
TextMessage tm = (TextMessage) createJMSMessage(JMSMessageType.TEXTMESSAGE);
tm.setText("<converted object>");
m = tm;
}
}
return m;
}
}生成的JAR必须与其他必需的依赖JAR一起位于lib/ext目录中(请注意,这已经通过独立的Open安装进行了测试)。
以及STOMP桥的代理配置:
imq.bridge.admin.user=admin
imq.instanceconfig.version=300
imq.bridge.stomp.messageTransformer=com.habarisoft.mqtr.StompTransformer
imq.bridge.admin.password=admin
imq.bridge.activelist=stomp
imq.bridge.enabled=true然后,我启动了一个STOMP客户端,侦听队列TOOL.DEFAULT中的传入消息,并使用JMS生成对象消息:
import java.util.Date;
import javax.jms.Queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Session;
public class Main {
public static void main(String[] args) throws JMSException {
ConnectionFactory cf = new com.sun.messaging.ConnectionFactory();
Connection conn = cf.createConnection("admin", "admin");
conn.start();
Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue queue = session.createQueue("TOOL.DEFAULT");
MessageProducer producer = session.createProducer(queue);
Date date = new Date();
ObjectMessage msg = session.createObjectMessage(date);
producer.send(msg);
conn.close();
}
}如果JMS客户端代码在STOMP客户端侦听时发送对象消息,则代理成功运行的控制台窗口将
transform ...消息。但是,它会记录一个错误,抱怨一个空JMS目的地:
Dez 10, 2014 8:04:39 AM
WARNUNG: [BSS2009]: Nachricht ID:8-192.168.56.1(ea:8a:dc:e5:15:7c)-58027-1418195
079856 kann nicht an Abonnent {98F4744E-6E12-44CC-8336-36A9BA7CDC77} ausgeliefer
t werden: JMS destination null !
javax.jms.JMSException: JMS destination null !
at com.sun.messaging.bridge.service.stomp.StompProtocolHandler.toStompDe
stination(StompProtocolHandler.java:832)
at com.sun.messaging.bridge.service.stomp.StompProtocolHandler.toStompFr
ameMessage(StompProtocolHandler.java:893)
at com.sun.messaging.bridge.service.stomp.StompConnection.toStompFrameMe
ssage(StompConnection.java:438)
at com.sun.messaging.bridge.service.stomp.StompSubscriberSession.onMessa
ge(StompSubscriberSession.java:127)
at com.sun.messaging.jmq.jmsclient.MessageConsumerImpl.deliverAndAcknowl
edge(MessageConsumerImpl.java:358)
at com.sun.messaging.jmq.jmsclient.MessageConsumerImpl.onMessage(Message
ConsumerImpl.java:287)
at com.sun.messaging.jmq.jmsclient.SessionReader.deliver(SessionReader.j
ava:119)
at com.sun.messaging.jmq.jmsclient.ConsumerReader.run(ConsumerReader.jav
a:192)
at java.lang.Thread.run(Thread.java:745)
Dez 10, 2014 8:04:39 AM我还没有进一步研究过这一点,但似乎需要比在变压器用OpenMQ JavaDoc中显示的更多代码来构造转换后的消息。
但是测试结果表明,该变压器是调用的,所提供的例子可以作为一个起点。
更新:
如果系统架构在您的控制之下,那么在消息流中插入Java (JMS)客户端应用程序可能更容易,后者将对象消息转换为文本消息,并将其重新发送到一个不同的目的地,该目的地由STOMP客户端使用。
https://stackoverflow.com/questions/27355146
复制相似问题