我需要编写一个监听WebSphere MQ Server的Java客户端。消息被放入服务器的队列中。
我开发了这段代码,但不确定它是否正确。如果正确,那我该怎么测试呢?
这是一个独立的Java项目,没有应用程序服务器支持。我应该把哪些罐放入classpath?
我有MQ设置,我应该在哪里放入我的代码?标准JMS可以跳过这些设置吗?令人困惑....
import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class Main {
Context jndiContext = null;
QueueConnectionFactory queueConnectionFactory = null;
QueueConnection queueConnection = null;
QueueSession queueSession = null;
Queue controlQueue = null;
QueueReceiver queueReceiver = null;
private String queueSubject = "";
private void start() {
try {
queueConnection.start();
queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = queueSession.createQueue(queueSubject);
MessageConsumer consumer = queueSession.createConsumer(destination);
consumer.setMessageListener(new MyListener());
} catch (Exception e) {
e.printStackTrace();
}
}
private void close() {
try {
queueSession.close();
queueConnection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
private void init() {
try {
jndiContext = new InitialContext();
queueConnectionFactory = (QueueConnectionFactory) this.jndiLookup("QueueConnectionFactory");
queueConnection = queueConnectionFactory.createQueueConnection();
queueConnection.start();
} catch (Exception e) {
System.err.println("Could not create JNDI API " + "context: " + e.toString());
System.exit(1);
}
}
private class MyListener implements MessageListener {
@Override
public void onMessage(Message message) {
System.out.println("get message:" + message);
}
}
private Object jndiLookup(String name) throws NamingException {
Object obj = null;
if (jndiContext == null) {
try {
jndiContext = new InitialContext();
} catch (NamingException e) {
System.err.println("Could not create JNDI API " + "context: " + e.toString());
throw e;
}
}
try {
obj = jndiContext.lookup(name);
} catch (NamingException e) {
System.err.println("JNDI API lookup failed: " + e.toString());
throw e;
}
return obj;
}
public Main() {
}
public static void main(String[] args) {
new Main();
}
}
MQ队列设置
<queue-manager>
<name>AAA</name>
<port>1423</port>
<hostname>ddd</hostname>
<clientChannel>EEE.CLIENTS.00</clientChannel>
<securityClass>PKIJCExit</securityClass>
<transportType>1</transportType>
<targetClientMatching>1</targetClientMatching>
</queue-manager>
<queues>
<queue-details id="queue-1">
<name>GGGG.NY.00</name>
<transacted>false</transacted>
<acknowledgeMode>1</acknowledgeMode>
<targetClient>1</targetClient>
</queue-details>
</queues>
答案 0 :(得分:4)
有一篇文章包含示例代码 Running a standalone Java application on WebSphere MQ V6.0 ,它会引导您完成大部分问题,包括如何使用免费的WMQ试用版安装测试。 v7或v7.1的主要区别(如评论中所讨论的)是,如果要使用主题,则不会启动代理组件。除此之外,本文应与当前的WMQ客户端和/或服务器一起正常工作。
此外,请参阅 WebSphere MQ Using Java 手册(v7.0客户端)或 Using WebSphere MQ Classes for Java 手册(v7.1客户端)适用于您的客户的CLASSPATH
和其他设置。请记住使用适合您的客户端版本的信息中心而不是服务器版本。您可以混合搭配客户端和服务器版本,但只能获得服务器支持的功能。例如,将WMQ v7.1客户端与WMQ v7.0服务器一起使用是完全有效的。
最后,免费客户端下载提供了许多示例程序,这些程序正是您所描述的。一些使用JNDI查找WMQ资源,另一些使用Java方法,可以使用标准Java属性文件填充。具有-nojndi
选项的选项显示如何在运行时在代码中初始化WMQ对象。这些都在
[WMQ Install path]\tools\wmqjava\samples
...在最新的Windows客户端安装(SupportPac MQC71)中。您也可以使用v7.0客户端(SupportPac MQC7)。我建议使用这些示例,而不是从头开始。为什么要重新发明轮子呢?
除了许多示例程序之外,供应商安装还包括所有必需的jar文件。请注意WMQ客户端版本对CLASSPATH
更改的内容所以请参考信息中心。更高版本更简单,只需要CLASSPATH
中的几个jar文件。
如果您想要download the WMQ trial进行测试并且在Windows工作站上没有管理员权限,则可以在RedHat或SUSE虚拟机上轻松安装。通过一些按摩,您也可以像安迪派珀blog post中所描述的那样在Ubuntu上轻松安装。
答案 1 :(得分:1)
如果您有选项,我建议您引入Spring Framework来处理JMS通信。这样,您只需要编写业务逻辑,并可以将错误处理留给Spring。
下载最新的Spring JARS并查看为您的应用配置DefaultMessageListenerContainer。然后,您将使用onMessage()
事件编写自己的POJO(普通旧Java对象),每次收到新消息时都会调用该事件。
我发现this tutorial您可能会觉得从
开始很有用答案 2 :(得分:0)
我在JavaFx2 for Windows和Mac osx中开发了一个小型客户端应用程序。它可以在source forge上使用(https://sourceforge.net/projects/mqconsole)。
您可以看到收听新邮件队列的示例。
程序列出队列,每个队列中的消息,查看消息的详细信息,并将消息发送到队列并听取响应。
您可以查看代码,使用并改进代码。