Но я не смог найти ссылку для удаления этого Win32PrintService
из сессии.
Предполагая, что это объект HttpSession
, вызов session.removeAttribute(name)
с соответствующим именем атрибута сеанса удалит значение атрибута.
Однако вам нужно сделать это до того, как сеанс будет продолжен, и я не знаю, есть ли способ обеспечить это.
Можно ли сделать эту услугу Serializable
.
Нет. Но вы можете создать оболочку Serializable
; например,
public class PrintServiceWrapper implements PrintService, Serializable {
private final transient PrintService ps;
public PrintServiceWrapper(PrintService ps) {
this.ps = ps;
}
// Delegate all PrintService methods to 'ps'
// Implement `private void readObject()` to (somehow) reinstate the
// value of 'ps' ...
}
Но это не правильное решение, ИМО.
Правильный способ решить эту проблему - не помещать объект PrintService
в сессию!
Один из вариантов - хранить его как атрибут ServletContext
. Хотя это не указано в javadocs, похоже, что PrintService
классы реализации спроектированы как поточно-ориентированные. Таким образом, должна быть возможность безопасно разделить один экземпляр PrintService
между несколькими потоками запросов.
Второй альтернативой является то, что каждый запрос может использовать вызов PrintServiceLookup
для получения PrintService
экземпляра , когда ему требуется один .