JMS消息服務器和Hibernate、Spring的集成開發

 工作需要使用JMS實現輸入框的消息管理,就花兩天時間學習了一下,現在整理如下,以備不時之需。

 

JMS用來實現消息管理,ActiveMQ是用來實現JMS框架。

開發JMS的步驟:

   1   安裝ActiveMQ服務器(在這裏),並運行

   2  創建Web項目,引用jar包

        activemq-all-5.5.0.jar
        javax.jms.jar

   3  建立發送消息的源代碼,將消息發送到ActiveMQ服務器上

 

public class QueueSend {
 
 //queue方式的jms連接
 QueueConnection queueConection;
 
 //queue回話
 QueueSession queueSession;
 
 //queue消息發送者
 QueueSender queueSender;
 
 Queue queue;
 
 public QueueSend(){}
 
 public QueueSend(String factoryJNDI,String topicJNDI){
  
  //連接jms Provider的環境參數
  Hashtable<String, String> props = new Hashtable<String,String>();
  
  String INITIAL_CONTEXT_FACTORY = "";
  
  props.put(INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
  
  try {
   new InitialContext(props);
   
   Context ctx = new InitialContext();
   
   Context context = ctx;
   
   String connectionFactoryName = "xxx";
   
   QueueConnectionFactory queueFactory = new ActiveMQConnectionFactory("tcp://127.0.0.1:61616");
   
   //創建連接
    
   queueConection = queueFactory.createQueueConnection();
   
   int AUTO_ACKNOWLEDGE = 1;
   
   queueSession = queueConection.createQueueSession(false, AUTO_ACKNOWLEDGE);
   
   queue = new ActiveMQQueue("jason.queue2");
   
   //創建隊列消息的發送者
   queueSender = queueSession.createSender(queue);
   
  } catch (NamingException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }catch (JMSException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 
 public void send(String msg) throws JMSException{
  
  TextMessage message = queueSession.createTextMessage();
  
  message.setText(msg);
  
  queueSender.send(queue,message);
  
 }
 
 public void close() throws JMSException{
  
  queueSession.close();
  
  queueConection.close();
 }
 
 
 public static void main(String[] args) throws JMSException {
  
  QueueSend queue = new QueueSend("ConnectionFactory", "queue/testQueue");
  
  for(int i = 19; i<21 ;i++){
   
   String msg = "Hello World no "+i;
   
   System.out.println("Hello Queue Publishing message:" + msg);
   
   queue.send(msg);
   
  }
  
  
 }
 

}


 

   4  建立接受消息的源代碼,把消息從ActiveMQ服務器上接受下來

 

public class QueueConsumer {
 
 public static void main(String[] args) {
  
  QueueConsumer rs = new QueueConsumer();
  
  int i = 0;
  
  //循環只是爲了讓程序每兩秒鐘個進行一次連接偵聽是否有消息可以獲取
  while(true){
   
   rs.consumeMessage();
   
   try {
    Thread.sleep(2000);
   } catch (InterruptedException e) {
    
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   
   i++;
   
   System.out.println("Start recive "+i);
   
  }
  
 }
 
 Session session;

 public Message consumeMessage() {
  
  Message mess = new Message();
  
  List list = new ArrayList();
  
  ConnectionFactory connectionFactory;
  
  Connection connection = null;
  
  Queue queue;
  
  MessageConsumer consumer;
  
  connectionFactory = new ActiveMQConnectionFactory(
   
    ActiveMQConnection.DEFAULT_USER,
    
    ActiveMQConnection.DEFAULT_PASSWORD,"tcp://127.0.0.1:61616");
  
  try {
   connection = connectionFactory.createConnection();
   
   connection.start();
   
   session = connection.createSession(Boolean.FALSE, session.AUTO_ACKNOWLEDGE);
   
   queue = new ActiveMQQueue("jason.queue2");
   
   consumer = session.createConsumer(queue);
   
   while (true) {
    
    TextMessage message = (TextMessage) consumer.receive(1000);
    
    if (null != message) {
     
     System.out.println("收到消息" + message.getText());
     
     list.add(message.getText());
     
    } else {
     
      // 沒有消息時,退出
     break;
     
    }
   }
   
  } catch (JMSException e) {
   
   e.printStackTrace();
   
  }finally {
   
   mess.setPinpai((String)list.get(0));
   
   mess.setShangshi((String)list.get(1));
   
   mess.setWeb((String)list.get(2));
   
   mess.setPrice((String)list.get(3));
   
   try {
    if (null != connection)
     
     connection.close();
    
   } catch (Throwable ignore) {
    
    ignore.printStackTrace();
    
   }
   
  }
  
  return mess;
  
 }
 
 
 public void onMessage(Message message) {
  
  try {
   if (message instanceof TextMessage) {
    TextMessage txtmess = (TextMessage) message;
    
    System.out.println("收到的消息是:" + txtmess.getText());
    
    // 回覆發送者
    
    MessageProducer sender = session.createProducer(message.getJMSReplyTo());
    
    sender.send(session.createTextMessage("已收到你的消息"));
    
   } else
    System.out.println("收到的消息是:" + message);
   
  } catch (Exception e) {
   
   e.printStackTrace();
   
  }
 }

}


 

OK,直接在Java Application上運行一下就好了

 

如果和Hibernate、Spring集成,首先要將數據庫訪問工作做好,這裏就不再贅述。

然後取得頁面控件值,操作如下:

在jsp中,爲了可以提交給服務器,需要用Form標籤將其包圍起來,還要使用id定義控件,如:<input name="txtName" type="text" id="txtName" />
定義了一個ID爲 txtName的文本框控件,action="coret.jsp" 則定義了提交後進行處理的JSP頁面。

然後,新建core.jsp,如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
 <%
 
 MessageService s=new MessageService ();
 s.add(request);
 out.write("添加成功!");
 
 
 %>


 

這樣就將功能代碼封裝至MessageService.add()方法中了。

然後,就是建立MessageService 類,主要代碼如下:

public class MessageService {
 
 
public static void add(HttpServletRequest request) {


 String name=request.getParameter("txtName");


      }


 

 這樣就取到了jsp頁面中textName的值了。

以此方法,得到頁面的所有值,將其封裝成對象,然後調用訪問數據庫的方法,就OK啦!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章