在上一篇介绍Wildfly上搭建Ibm MQ消息队列服务的时候,笔者已经把详细的配置和测试代码都分享出来了,但是考虑到目前Wildfly的稳定版本还在开发当中,没有正式发布,所以在生产环境下选型Jboss的服务器还得用Jboss最新最稳定的版本Jboss AS7,继上一篇文章笔者所讲的话题,跟大家分享下如何在Jboss7上应用Ibm Mq的消息服务。
基本的配置都一样(参考上文:http://blog.csdn.net/liuzhihong01/article/details/17161123),主要是在测试代码的编写上,因为Jboss 7支持的是Java EE6的规范,所以在Java EE7新的规范里面的一些API是不能够用的,像@WebServlet的注解是Java EE7里面的,@Resource里面的lookup属性也只存在Java EE7上面,Java EE6的@Resource的属性为mappedName,而笔者尝试了通过mappedName是找不到在Jboss7的standalone-full.xml配置里面以JNDI命令的连接工厂和队列对象的。
笔者愚钝,找不到好的方法,干脆就不用注解了,修改了如下的测试代码(注意project下的classpath要引入Java EE6的jar包):
消息发送:
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class MessageSender {
private static final String DEFAULT_CONNECTION_FACTORY = "java:jboss/ManagedConnectionFactoryImpl";
private static final String DEFAULT_DESTINATION = "java:jboss/MQQueueProxy";
public void sendMessage(String message) throws JMSException {
Context context = null;
Connection connection = null;
final Properties env = new Properties();
env.put(Context.SECURITY_PRINCIPAL, "producer1");
env.put(Context.SECURITY_CREDENTIALS, "producer@163");
try {
context = new InitialContext(env);
ConnectionFactory connectionFactory = (ConnectionFactory) context
.lookup(DEFAULT_CONNECTION_FACTORY);
System.out.println(connectionFactory.getClass().getSimpleName());
Destination destination = (Destination) context
.lookup(DEFAULT_DESTINATION);
System.out.println(destination.getClass().getSimpleName());
// 创建JMS连接、会话、生产者和消费者
connection = connectionFactory.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(destination);
connection.start();
TextMessage m = session.createTextMessage(message);
producer.send(m);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
消息接收:
import java.util.Properties;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
public class MessageReceiver {
private static final String DEFAULT_CONNECTION_FACTORY = "java:jboss/ManagedConnectionFactoryImpl";
private static final String DEFAULT_DESTINATION = "java:jboss/MQQueueProxy";
public String receiveMessage() {
String s = "";
Context context = null;
Connection connection = null;
final Properties env = new Properties();
env.put(Context.SECURITY_PRINCIPAL, "producer1");
env.put(Context.SECURITY_CREDENTIALS, "producer@163");
// 获取到InitialContext对象.
try {
context = new InitialContext(env);
ConnectionFactory connectionFactory = (ConnectionFactory) context
.lookup(DEFAULT_CONNECTION_FACTORY);
System.out.println(connectionFactory.getClass().getSimpleName());
Destination destination = (Destination) context
.lookup(DEFAULT_DESTINATION);
System.out.println(destination.getClass().getSimpleName());
// 创建JMS连接、会话、生产者和消费者
connection = connectionFactory.createConnection();
Session session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(destination);
connection.start();
TextMessage m = (TextMessage) consumer.receive(5000);
s = m.getText();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}
}
测试的Servlet程序如下:
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.JMSException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.liu.domain.MessageReceiver;
import com.liu.domain.MessageSender;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
MessageSender sender ;
MessageReceiver receiver;
public void init() throws ServletException {
sender = new MessageSender();
receiver = new MessageReceiver();
}
public TestServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String message = "你好,世界!";
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Application Managed JMS</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Application Managed JMS</h1>");
try {
sender.sendMessage(message);
} catch (JMSException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("发送消息出了异常。。。。");
return;
}
out.println("Message sent: " + message + "<br><br>");
out.println("Message received: " + receiver.receiveMessage());
out.println("</body>");
out.println("</html>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Jboss7的web控制台界面如下:
访问结果如下: