1. 程式人生 > >JMS與ESB三層架構

JMS與ESB三層架構

企業服務匯流排(ESB)在面向服務的體系結構(SOA)中實現相互互動的軟體應用程式之間的通訊系統。它實現瞭如圖所示的軟體體系結構。當它實現分散式計算體系結構時,它實現了更一般的客戶機-伺服器模型的特殊變型,其中,一般而言,使用ESB的任何應用程式都可以依次充當伺服器或客戶端。ESB在應用程式之間的高階協議通訊方面促進靈活性和靈活性。高階協議通訊的主要目標是異構和複雜服務或應用場景的企業應用整合(EAI)(從網路層來看)。

這裡寫圖片描述

案例分析:

這裡寫圖片描述

JMS使用activemq中介軟體訊息佇列

public class JMSToolsOperate {  
    private
ConnectionFactory factory=new ActiveMQConnectionFactory("tcp://localhost:61616"); private Connection connection; private Session session; //將資訊傳送到佇列中 public void sendMsg(String message, String queueName) { try { connection = factory.createConnection(); connection.start(); //建立會話
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //目的地:佇列模式 Destination queue = session.createQueue(queueName); //訊息 Message msg = session.createTextMessage(message); MessageProducer producer = session.createProducer(queue); producer.send(msg); } catch
(JMSException e) { e.printStackTrace(); } finally { try { session.close(); connection.close(); } catch (JMSException e) { e.printStackTrace(); } } } //從佇列中接收訊息 public String receiveMsg(String queueName) { String message = null; try { connection = factory.createConnection(); connection.start(); session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); //接收端元件 Destination queue = session.createQueue(queueName); MessageConsumer consumer = session.createConsumer(queue); message = ((TextMessage) consumer.receive()).getText(); session.close(); connection.close(); } catch (JMSException e) { e.printStackTrace(); } finally { try { session.close(); connection.close(); } catch (JMSException e) { e.printStackTrace(); } } return message; } }

開啟Activemq測試:

public static void main(String[] args){
          System.out.println("CORE........");
          JMSToolsOperate tools=new JMSToolsOperate();
          tools.sendMsg("hello", "E2C");
          while(true){
                 String message=tools.receiveMsg("E2C");
                 System.out.println("CORE接收到資料E2C:"+message );
                 String newMsg=message;
                 tools.sendMsg(newMsg, "E2C");
                 System.out.println("CORE傳送到C2E資料:"+newMsg); 
          }  
    }

三層架構:

Server——-Socket———–webapp

webapp:

public class MyServlet extends HttpServlet {
       private String url="127.0.0.1";
       private int port=8888;
       public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
                    doPost(request,response);
       }
       public void doPost(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
           response.setContentType("text/html");
           response.setCharacterEncoding("GBK");
           request.setCharacterEncoding("GBK");
           //獲取請求資訊
           String value=request.getParameter("inputValue");
           //建立Teller端socket
           Socket s=new Socket(url,port);
           PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
           BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
           //輸出獲取的資訊socket
           pw.println(value);
           System.out.println("TELLER傳送到ESB: "+value);
           String result=br.readLine();
           System.out.println("TELLER接收到ESB:" +result);
           //轉到view頁面
           request.getRequestDispatcher("view.jsp?result="+result).forward(request, response);

       }
}

Service

public class ESBListener implements Runnable {
    private JMSToolsOperate tools=new JMSToolsOperate();
    private Socket s;   
    public ESBListener(Socket s){
        this.s=s;
    }
    public void run() {
        try {
            BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
            //server接收
            String reMsg=br.readLine();
            System.out.println("ESB接收TELLER的資料:"+reMsg);
            //將server接收的訊息傳送到佇列
            tools.sendMsg(reMsg, "E2C");
            System.out.println("ESB到E2C資料:"+reMsg);
            //從佇列接收的訊息
            String result=tools.receiveMsg("C2E");
            System.out.println("ESB接收C2E傳回資料:"+result);
            //接收的訊息輸出
            pw.println(result);
            System.out.println("ESB返回給TELLER資料: "+result);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}
public class ESBServer {
    private ServerSocket ss=null;
    private int port=8888;
    public ESBServer() throws IOException{
        ss=new ServerSocket(port);
        System.out.println("ESB Server.......");
    }
    //服務端接收->mq->從mq讀取->伺服器傳送
    public void Communite(){
        try {
            while(true){
                Socket s=ss.accept();
                System.out.println("ESB");
                new Thread(new ESBListener(s)).start();
            }       
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //開啟服務端進行監聽
    public static void main(String[] args) throws IOException{
        new ESBServer().Communite();
    }
}