服务器启动时如何只创建一次会话?

问题描述 投票:0回答:1

我正在使用Watson Assistant创建一个用于Java应用程序的聊天机器人,servlet代码:

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

    String sessionIdOut = "";               
    String question = req.getParameter("message");       
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    // Set up Assistant service.                
    IamOptions iamOptions = new IamOptions.Builder().apiKey("<apikey>").build();
    Assistant service = new Assistant("2018-09-20", iamOptions);
    service.setEndPoint("https://gateway-lon.watsonplatform.net/assistant/api/");
    assistantId = "<assistantid>"; 

    // Create session.             
    CreateSessionOptions createSessionOptions = new CreateSessionOptions.Builder(assistantId).build();
    SessionResponse session = service.createSession(createSessionOptions).execute();
     sessionId = session.getSessionId();            

    // Suppress log messages in stdout.
    LogManager.getLogManager().reset(); 

    // Initialize with an empty value to start the conversation.
    String inputText = question;


    // Send message to assistant.
    MessageInput input = new MessageInput.Builder().text(inputText).build();
    MessageOptions messageOptions = new MessageOptions.Builder(assistantId, sessionId)
                                                          .input(input)
                                                          .build();
    MessageResponse response = service.message(messageOptions).execute();


    // Print the output from the dialog if any. Assumes a single text response.
    List<DialogRuntimeResponseGeneric> responseGeneric = response.getOutput().getGeneric();
    if(responseGeneric.size() > 0) {
        System.out.println(response.getOutput()/*.getGeneric().get(0).getText()*/);
        String answer =  response.getOutput().getGeneric().get(0).getText();
        // set up the response
        res.setContentType("text/html");
        res.setHeader("Cache-Control", "no-cache");
        // write out the response string
        res.getWriter( ).write(answer);                
    }

    // Prompt for next round of input.
    System.out.print(">> ");                
}

目前,当GET请求从用户界面到达时,servlet总是创建一个新会话并设置助手。我希望它在服务器启动时只创建一个新会话并设置一次辅助服务。

试图通过添加init()函数来解决问题,并在init()函数中编写会话创建和助手设置代码,如下所示:

@Override
public void init() throws ServletException {

    // Set up Assistant service.                
    IamOptions iamOptions = new IamOptions.Builder().apiKey("<apikey>").build();
    Assistant service = new Assistant("2018-09-20", iamOptions);
    service.setEndPoint("https://gateway-lon.watsonplatform.net/assistant/api/");
    assistantId = "<assistantid>";  

    // Create session.             
    CreateSessionOptions createSessionOptions = new CreateSessionOptions.Builder(assistantId).build();
    SessionResponse session = service.createSession(createSessionOptions).execute();        
     sessionId = session.getSessionId();
    super.init();       
}

但它不起作用,当我在用户界面中写一个问题时,它会向我发回500状态代码。

java session servlets chatbot init
1个回答
0
投票

我解决了这个问题!

工作代码如下:

package com.jtypebot;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.ibm.watson.developer_cloud.assistant.v2.Assistant;
import com.ibm.watson.developer_cloud.assistant.v2.model.CreateSessionOptions;
import com.ibm.watson.developer_cloud.assistant.v2.model.DeleteSessionOptions;
import com.ibm.watson.developer_cloud.assistant.v2.model.DialogRuntimeResponseGeneric;
import com.ibm.watson.developer_cloud.assistant.v2.model.MessageInput;
import com.ibm.watson.developer_cloud.assistant.v2.model.MessageOptions;
import com.ibm.watson.developer_cloud.assistant.v2.model.MessageResponse;
import com.ibm.watson.developer_cloud.assistant.v2.model.RuntimeIntent;
import com.ibm.watson.developer_cloud.assistant.v2.model.SessionResponse;
import com.ibm.watson.developer_cloud.service.security.IamOptions;
import java.util.List;
import java.util.logging.LogManager;

@WebServlet("/JtypeBot")
public class JtypeBot extends HttpServlet {
private static final long serialVersionUID = 1L;            

String sessionId;  
String assistantId;
Assistant service;  

/**
 * @see HttpServlet#HttpServlet()
 */

public JtypeBot() {
    super();            
}

@Override
public void init() throws ServletException {
    super.init();           

    // Set up Assistant service.                
    IamOptions iamOptions = new IamOptions.Builder().apiKey("<apiKey>").build();
    service = new Assistant("2018-09-20", iamOptions);
    service.setEndPoint("https://gateway-lon.watsonplatform.net/assistant/api/");
    assistantId = "<assistantId>"; // replace with assistant ID

    // Create session.             
    CreateSessionOptions createSessionOptions = new CreateSessionOptions.Builder(assistantId).build();
    SessionResponse session = service.createSession(createSessionOptions).execute();        
    sessionId = session.getSessionId();         
    System.out.print(sessionId);        
}   

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

    String sessionIdOut = "";                            
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String question = req.getParameter("message");    

    // Suppress log messages in stdout.
    LogManager.getLogManager().reset(); 

    // Initialize with empty value to start the conversation.
    String inputText = question;        

    // Send message to assistant.
    MessageInput input = new MessageInput.Builder().text(inputText).build();
    MessageOptions messageOptions = new MessageOptions.Builder(assistantId, sessionId)
                                                          .input(input)
                                                          .build();                 

    MessageResponse response = service.message(messageOptions).execute();

    // Print the output from dialog, if any. Assumes a single text response.
    List<DialogRuntimeResponseGeneric> responseGeneric = response.getOutput().getGeneric();
    if(responseGeneric.size() > 0) {
        System.out.println(response.getOutput()/*.getGeneric().get(0).getText()*/);
        String answer =  response.getOutput().getGeneric().get(0).getText();

        // set up the response
        res.setContentType("text/html");
        res.setHeader("Cache-Control", "no-cache");

        // write out the response string
        res.getWriter( ).write(answer);                
    }

    // Prompt for next round of input.
    System.out.print(">> ");                
}   
}
© www.soinside.com 2019 - 2024. All rights reserved.